第 1 章 Presto介绍
你也许听说过 Presto1,然后找到了本书,抑或只想浏览第 1 章的内容,以便决定是否继续研读。本章将讨论快速增长的海量数据带来的诸多问题,以及隐藏在这些数据中的价值。Presto 是处理这些数据的关键工具,让你可以使用已证明十分成功的结构化查询语言(structured query language,SQL)及其相关工具来访问数据。
1Presto 包含两个分支:PrestoDB 和 PrestoSQL。2020 年 12 月,PrestoSQL 正式更名为 Trino。本书内容适用于所有 Presto 分支。——编者注
Presto 的设计和特性能让你更深入地理解数据。你不但可以更快地获得见解,而且还可以获得之前因成本太高或耗时太长而无法获得的信息。同时,你使用了更少的资源并因此节省了预算。利用节省下来的资源,你还能从数据中获得更多见解!
虽然本书也会介绍很多外部资源,但我们希望你可以先从本书开始学习。
1.1 大数据带来的问题
每个人都在采集越来越多的数据,这些数据涉及设备指标、用户行为跟踪、商业交易、地理位置、软件及系统测试过程和工作流等。通过理解和使用这些数据所获得的洞见能够决定一项计划乃至一家公司的成败。
同时,数据存储机制日益多样:关系数据库、NoSQL 数据库、文档数据库、键值存储和对象存储系统等。对于当今的组织机构,它们当中很多是必备的,只使用其中一种系统不再可行了。应对如图 1-1 所示的情形是一项令人生畏的艰巨任务。
图 1-1:大数据可能会让人难以招架
此外,这些系统不允许你使用标准工具来查询和检视数据。面向特定系统的查询语言和分析工具比比皆是。与此同时,你的商业分析师已习惯使用业界标准——SQL,无数强大的工具依赖 SQL 来分析数据、创建仪表盘、制作富文本报告以及完成其他商业智能工作。
数据分散在各个孤岛上,其中有些系统甚至不能提供满足分析所需的查询性能,其他一些系统则将数据存储在单一庞大的系统上,因而不能像现代的云应用程序一样横向扩展。没有这样的能力,你就只能缩小潜在的使用场景和用户数量,因此降低了数据的实用价值。
对全世界的组织来说,创建和维护大型专用数据仓库的传统方法成本高昂。通常,对很多用户和使用模式来说,这种方法也显得缓慢且笨拙。
显而易见的是,一个系统如果可以释放所有这些价值,就将带来巨大的机会。
1.2 Presto来救场
Presto 能解决上述所有问题。通过支持不同系统上的联邦查询、并行查询和横向集群扩展等功能,它还为我们提供了更多可能性。Presto 项目的标志如图 1-2 所示。
图 1-2:Presto 的标志
Presto 是一个开源的分布式 SQL 查询引擎,它是为了高效查询不同系统和各种规模(从 GB 级到 PB 级)的数据源而从头开始设计和编写的一套系统。使用 Presto,人们不需要在快速但昂贵的商业解决方案和缓慢(且需要更多硬件)但“免费”的解决方案之间做出选择。
1.2.1 为性能和规模而生
Presto 使用分布式执行来快速查询海量数据。如果有 TB 级乃至 PB 级的数据需要查询,你可能会使用 Apache Hive 等工具,这些工具基于 Hadoop 和 Hadoop 分布式文件系统(Hadoop Distributed File System,HDFS)工作。与这些工具相比,Presto 可以更高效地查询数据。
分析师应该使用 Presto,因为他们期望 SQL 查询可以在几毫秒(实时数据分析)、几秒或几分钟内返回结果。Presto 支持 SQL,SQL 通常用在数据仓储、数据分析、海量数据聚合和报表生成等任务上,这些任务通常被归类为联机分析处理(online analytical processing,OLAP)。
尽管 Presto 能理解并高效地执行 SQL,但它并不是一个数据库,因为它并不包含自己的数据存储系统。它无意成为一个通用关系数据库,并取代 Microsoft SQL Server、Oracle 数据库、MySQL 或 PostgreSQL。此外,Presto 也不适用于联机事务处理(online transaction processing,OLTP)。许多为数据仓储和数据分析任务设计和优化的数据库也是如此,如 Teradata、Netezza、Vertica 和 Amazon Redshift 等。
Presto 同时使用了众所周知的技术和新颖的技术来执行分布式查询,这些技术包括内存并行处理、跨集群节点管线执行、多线程执行模型(以充分利用所有 CPU 核心)、高效的扁平内存数据结构(以最小化 Java 的垃圾回收)和 Java 字节码生成等。本书不会详细介绍 Presto 内部的复杂实现。借助上述技术,Presto 用户可以以比其他方案更少的成本更快地获得查询结果。
1.2.2 SQL-on-Anything
Presto 的设计初衷是用来查询 HDFS 上的数据。稍后可以看到,它可以非常高效地完成这一任务,而且并未止步于此。它也可以从对象存储系统、关系数据库管理系统(RDBMS)、NoSQL 数据库和其他系统中查询数据,如图 1-3 所示。
图 1-3:Presto 对多种数据源的 SQL 支持
Presto 在原地查询数据,无须事先将数据迁移集中到某个位置。因此,Presto 不仅可以查询 HDFS 和其他分布式对象存储系统中的数据,而且还可以查询 RDBMS 和其他数据源。无论数据存放在何处,Presto 都可以查询,因此它可以取代传统、昂贵和笨重的抽取–变换–加载(ETL)过程,至少可以帮你减轻相关任务的负担。显然,Presto 并非另一个 SQL-on-Hadoop 解决方案。
对象存储系统包括 Amazon Web Services(AWS)提供的 Simple Storage Service(S3)、Microsoft Azure Blob Storage、Google Cloud Storage 和 S3 兼容的存储系统(如 MinIO 和 Ceph)。Presto 可以查询传统的 RDBMS,如 Microsoft SQL Server、PostgreSQL、MySQL、Oracle、Teradata 和 Amazon Redshift,还可以查询 NoSQL 数据库系统,如 Apache Cassandra、Apache Kafka、MongoDB 和 Elasticsearch。Presto 几乎可以查询任何东西,是一个真正的 SQL-on-Anything 系统。
对于用户来说,这意味着他们在与特定系统内的数据进行交互时,无须再依赖特定的查询语言和工具。他们可以简单地利用 Presto 和已有的 SQL 技能,利用已经十分熟悉的基于 SQL 的数据分析、仪表盘和报表工具,查询那些之前被锁定在分离系统中的数据。有了 Presto,用户甚至可以执行跨越多个系统的 SQL 查询。
1.2.3 存储与计算分离
Presto 没有自己的存储,它只是在数据所在之处进行查询处理。使用 Presto 时,存储和计算是分离的,它们可以各自独立地扩展。Presto 代表计算层,底层的数据源代表存储层。
这使得 Presto 可以基于对数据的分析需求来扩展和缩减计算资源。你无须移动数据或根据当前查询的需求预设计算资源和存储资源,也无须随着查询需求的变化来定期变更资源的分配。
Presto 可以通过动态扩展计算集群的规模来扩展查询能力,并可以在数据源中数据所在的位置查询数据。借助这一特性,你可以极大地优化硬件资源需求并降低成本。
1.3 Presto使用场景
Presto 灵活强大的特性使你可以自行决定如何使用它以获得最佳收益。你可以从仅用它解决一个特定的小问题开始,实际上,大部分 Presto 用户是这样开始的。
一旦你或者你所在组织中的其他 Presto 用户熟悉了这些好处和特性,你们将会发现新的应用场景。口口相传,很快你就会发现 Presto 满足了访问各种数据源的各种需求。
在下面的几节中,我们将讨论几个使用场景。记住,你可以将 Presto 应用到所有场景。此外,仅使用 Presto 解决某个特定问题也完全没有问题,只要准备好爱上 Presto 并在之后频繁使用它即可。
1.3.1 单一的SQL分析访问点
RDBMS 和 SQL 已经出现了很长时间且被证明是非常有用的。没有它们,任何组织都无法运作。实际上,很多公司会运行多个系统。Oracle Database 和 IBM DB2 这样的大型商业数据库可能支撑着你的企业软件。开源系统,如 MariaDB 和 PostgreSQL,可能用于其他解决方案或者一些内部应用程序。
作为一个消费者和分析师,你可能会遇到数不清的问题。
- 有时你甚至不知道数据在哪儿,只有凭借公司某个部门的内部知识或组织内多年的工作经验,你才能找到正确的数据。
- 为了查询多个数据库,你需要使用不同的连接和运行多种 SQL 方言的不同查询。这些查询看起来很相似,行为上却不同,因此你会感到困惑,并需要了解其中的细节。
- 若不使用数据仓库,就无法使用查询合并来自不同系统的数据。
Presto 可以帮你避免这些问题。你可以从 Presto 这里访问所有这些数据库。
可以使用一个 SQL 标准来查询所有的系统——Presto 支持的标准化 SQL、函数和运算符。
所有的仪表盘和分析工具以及其他商业智能系统,都可以指向一个系统——Presto,并访问组织当中的所有数据。
1.3.2 数据仓库和数据源系统的访问点
当一个组织需要更好地理解和分析存放在无数 RDBMS 中的数据时,就可以创建和维护数据仓库系统。从多个系统中抽取的数据通过一个复杂的 ETL 过程(通常使用长时间的批处理任务),最终进入一个严格受控的、巨大的数据仓库。
尽管数据仓库在很多情况下非常有用,但作为一个数据分析师,你会面临很多新问题。
- 除了原来的那些数据库,你的工具和查询现在又多了一个数据接入点。
- 你今天就要用的数据还没放入数据仓库。加载数据的过程痛苦、昂贵又障碍重重。
Presto 允许你添加任何数据仓库作为数据源,就像其他关系数据库一样。
如果想深入研究数据仓库的查询,可以在 Presto 里直接完成。你也可以在这里访问数据仓库及其源数据库系统,甚至可以编写将它们组合在一起的查询。Presto 让你可以使用单个系统查询任何数据库(包括数据仓库、源数据库和任何其他数据库)。
1.3.3 提供对任何内容的SQL访问
只使用 RDBMS 的日子早已一去不复返。数据现在存储在许多针对特定使用场景进行优化的不同系统中。基于对象的存储、键值存储、文档数据库、图数据库、事件流系统和其他所谓的 NoSQL 系统提供了独有的特性和优势。
至少你的组织中使用了其中的一些系统,所保存的数据对理解和改进业务至关重要。
当然,所有这些系统还要求你使用不同的工具和技术来查询和处理数据。
至少,这是一项学习曲线陡峭的复杂任务。更有可能的是,你最终只触及了数据的表层,而并没有真正获得完整的理解。你缺乏查询数据的好方法,更详细地可视化和分析数据的工具很难找或根本不存在。
另外,Presto 允许你将所有这些系统作为数据源进行连接。它使用标准的 ANSI SQL 和使用 SQL 的所有工具对外暴露要查询的数据,如图 1-4 所示。
图 1-4:用于所有数据源的多个使用场景的单一 SQL 访问点
得益于 Presto,理解所有这些截然不同的系统中的数据变得更加简单,甚至第一次成为可能。
1.3.4 联邦查询
将所有的数据孤岛都暴露给 Presto 是向理解数据迈出的一大步。你可以使用 SQL 和标准工具来查询所有这些内容,但你想要回答的问题往往需要你潜入这些数据孤岛,将它们的一些侧面抽取出来,然后在同一个地方将其组合起来。
可以通过 Presto 的联邦查询满足上述需求。联邦查询是在一个语句中引用并使用不同数据库和模式(schema)的 SQL 查询,这些数据库和 schema 来自于完全不同的系统。在同一条 SQL 查询中,可以查询 Presto 中可用的所有数据源。
你可以定义对象存储中的用户追踪信息和 RDBMS 中客户数据之间的关系。如果键值存储包含更多相关信息,你也可以把它添加进查询。
使用 Presto 的联邦查询,你可以获得通过其他方式无法获得的洞见。
1.3.5 虚拟数据仓库的语义层
数据仓库系统为用户创造了巨大的价值,对组织来说却是一个负担。
- 运行和维护数据仓库是一个巨大且昂贵的项目。
- 需要专门的团队运行与管理数据仓库和相关的 ETL 过程。
- 将数据导入数据仓库需要用户执行烦琐的操作,并且通常很耗时。
此外,Presto 可用作虚拟数据仓库。使用这一工具和标准 ANSI SQL,你就可以定义语义层。一旦所有的数据库都设置成 Presto 的数据源,你就可以查询它们。Presto 提供了查询这些数据库所需的计算能力。使用 SQL 和 Presto 支持的函数和运算符,你可以直接从数据源获得想要的数据。在使用数据进行分析之前,无须复制、移动或转换它们。
多亏了对所有连接数据源的标准 SQL 支持,你能以更简单的方式创建所需的语义层,以支持来自工具和终端用户的查询。这一语义层覆盖了所有底层的数据源,因此无须迁移任何数据。Presto 可以在数据源和存储层查询数据。
将 Presto 用作这种“动态数据仓库”为组织提供了增强现有数据仓库的可能,甚至可以完全避免构建和维护数据仓库。
1.3.6 数据湖查询引擎
数据湖(data lake)通常指的是一个巨大的 HDFS 或类似的分布式对象存储系统,在数据被转储到这些存储系统时,并没有特别考虑接下来应如何访问它们。Presto 可以使它们成为有用的数据仓库。实际上,Facebook 开发 Presto 的目的就是对一个非常大的 Hadoop 数据仓库进行更快和更强大的查询,提供 Hive 和其他工具无法提供的能力。这也是 Presto Hive 连接器的起源,6.4 节将讨论这个连接器。
现代数据湖通常使用 HDFS 之外的其他对象存储系统,这些系统来自云供应商或其他开源项目。Presto 能使用 Hive 连接器连接它们,无论数据在哪里、如何存储,你都可以在数据湖上使用基于 SQL 的数据分析。
1.3.7 SQL转换和ETL
基于对 RDBMS 和其他类似数据存储系统的支持,Presto 也可用于迁移数据。它所提供的丰富的 SQL 函数,可以让你查询数据、转换数据,并将数据写入同一个数据源或任何其他数据源。
在实践中,这意味着你可以从对象存储系统或键值存储中复制数据到 RDBMS,并进一步分析。当然,你也可以转换和聚合数据,以获得新的理解。
反过来,从运转中的 RDBMS 或 Kafka 这样的事件流系统当中读取数据,并将它们移动到数据湖中的操作也很常见,这可以减轻多个分析师对 RDBMS 进行查询的负担。ETL 过程(现在也常称为数据准备过程)可作为这一操作的重要组成部分,以提升数据质量并创建更适合查询和分析的数据模型。
在这一场景下,Presto 是整个数据管理解决方案的关键部分。
1.3.8 更快的响应带来更好的数据见解
复杂的问题和海量数据集带来了诸多限制。将数据复制并加载到你的数据仓库并在其中分析它们最终会过于昂贵。计算可能消耗太多的计算资源而无法处理全部数据,或者要耗费数天才能得到答案。
Presto 一开始就避免了数据复制。Presto 的并行计算和重度优化通常能为你的数据分析带来性能提升。
如果原来需要 3 天的查询现在只需 15 分钟就可以完成,那么执行这个查询便是有价值的。从这些结果中获得的知识让你可以执行更多的查询。
总之,Presto 更快的处理速度带来了更好的数据分析和结果。
1.3.9 大数据、机器学习和人工智能
Presto 向围绕 SQL 的标准工具暴露了越来越多的数据,并将查询扩展到海量数据集上,这使其成了大数据处理的主要工具。如今,大数据处理通常还包括统计分析,由于机器学习和人工智能系统的发展,处理的复杂度也随之上升。基于对 R 语言和其他工具的支持,Presto 也必将在这些使用场景中占据一席之地。
1.3.10 其他使用场景
在前面的章节里,我们提供了对 Presto 使用场景的概览。新的场景和组合不断涌现。
在第 13 章中,你可以学习到一些知名公司和组织使用 Presto 的细节。我们将这些信息留在本书的结尾,这样你就可以先阅读接下来的章节,以获得理解眼前的数据所必备的知识。
1.4 Presto资源
在本书之外,还有很多可用资源可以帮你扩展有关 Presto 的知识。这一节列举一些重要的起始点,其中大多数包含丰富的信息并指向更多的资源。
1.4.1 官方网站
Presto 软件基金会负责管理 Presto 项目的开源社区并维护项目网站。可以在图 1-5 中看到 Presto 官方网站的主页。Presto 网站中包含文档、联系信息、发布最新消息和事件的社区博客,以及很多其他信息。
图 1-5:Presto 官方网站的主页
1.4.2 文档
Presto 的详细文档作为代码库的一部分维护,可以从官方网站上获取到。该文档既包括概览,又包括 SQL 支持、函数、运算符、连接器、配置等方面的详细参考信息,还提供包含最新修改细节的发布记录。你可以从 Presto 文档开始。
1.4.3 社区交流
你可以加入面向新手、进阶用户和专家用户,以及 Presto 代码贡献者和维护者的社区聊天室,Presto 社区非常乐于帮助参与者,成员们每天都在积极地互相协作。
你可以先加入 general 频道,然后查看专注于 bug 分类、版本发布和开发等多种话题的无数其他频道。
你总是可以在社区聊天室找到马特、曼弗雷德和马丁。我们非常乐意听取你的反馈。
1.4.4 源代码、许可证和版本
Presto 是在 Apache License v2 协议下的开源项目,其源代码在 Git 仓库中,可参见 GitHub 网站的 prestosql/presto 页面。
位于 GitHub 网站 Presto 页面的 prestosql 组织包含许多与项目相关的其他仓库,比如官方网站、客户端、其他组件的源代码或用于贡献者许可证管理的仓库。
Presto 是一个活跃且经常发布新版本的开源项目。使用最新版本时,你可以获得最新特性、bug 修复和性能提升。在编写本书时 Presto 的最新版本是 330,所以本书内容也使用和参考了这一版本。如果你使用一个更新版本的 Presto,它的工作原理应该能和本书中描述的一样。尽管你不太可能遇到问题,但对于任何修改,参考发布记录和文档的内容仍非常重要。
1.4.5 贡献
如前所述,Presto 是一个社区驱动的开源项目,我们欢迎并鼓励你为其贡献自己的力量。这个项目的社区聊天室非常活跃,你可以随时向代码提交者和其他开发者寻求帮助。
下面是在贡献代码之前需要完成的一些任务。
- 查看文档中的开发者导引章节。
- 从 README 文件中学习从源代码构建项目的方法。
- 在官方网站的社区(Community)页面找到研究论文的链接,并阅读研究论文。
- 在同一个页面上浏览行为守则(Code of Conduct)。
- 找到一个标记为 good first issue 的问题。
- 签署贡献者授权协议(contributor license agreement,CLA)。
Presto 项目持续接受各种复杂度的贡献:从小的文档提升、新的连接器或者其他插件,到深入 Presto 内部的改进等。
当然,社区欢迎你使用 Presto 或围绕 Presto 做的任何工作。这类工作当然也包括一些看似不相关的贡献,如编写博客文章、参加用户组的会议或研讨会、自己编写和维护插件(也许是用来连接你自己使用的一个数据库系统)等。
总之,我们鼓励你和 Presto 团队一起工作并参与进来,这个项目的成长和繁荣有赖于每个人的贡献。我们也时刻准备着帮助你。你可以做到!
1.4.6 本书资源
我们提供了一些有关本书的资源,如配置文件示例、SQL 查询、数据集等。
可以在本书图灵社区页面找到这些资源,然后以压缩文件的方式下载。
1.4.7 鸢尾花数据集
在本书后面的章节中,你将遇到有关鸢尾花和鸢尾花数据集的查询示例和使用场景。该数据集广为人知,常用于数据科学中有关分类的例子。
该数据集包含一个简单的表,该表有 150 条记录,以列的形式提供了萼片长度、萼片宽度、花瓣长度、花瓣宽度和物种的值。
这个数据集非常小,可以让用户方便地测试和执行查询,并完成一系列不同的分析任务。因此,该数据集非常适合学习,你可以从维基百科的对应页面上了解有关此数据集的更多信息。
本书的仓库包含了一个名为 iris-data-set 的目录。该目录中存放着以逗号分隔值(CSV)格式保存的数据,还包含了用于创建表并将数据插入的 SQL 文件。读完第 2 章和 3.1 节后,以下指令将非常容易操作。
要使用鸢尾花数据集,你可以先复制 etc/catalog/memory.properties 文件到 Presto 的安装路径下并重启 Presto。
现在,你就可以使用 Presto CLI 将数据导入 iris
表中。此时,iris
表存在于 default
schema 下,default
schema 又存在于 memory
catalog 下。
$ presto -f iris-data-set/iris-data-set.sql
USE
CREATE TABLE
INSERT: 150 rows
确认数据可以查询:
$ presto --execute 'SELECT * FROM memory.default.iris;'
"5.1","3.5","1.4","0.2","setosa"
"4.9","3.0","1.4","0.2","setosa"
"4.7","3.2","1.3","0.2","setosa"
...
此外,你还可以使用任何可以连接到 Presto 的 SQL 管理工具来运行查询,如 3.2 节介绍的 Java 数据库连接(JDBC)驱动。
第 8 章和第 9 章包含一些使用此数据集的查询案例,6.8 节提供了有关内存连接器的信息。
1.4.8 航班数据集
与鸢尾花数据集类似,本书后面还将介绍航班数据集的查询案例和使用场景。这一数据集比鸢尾花数据集复杂,它包含关于航空公司、机场及其他信息的多个查询表,也包含有关特定航班的业务数据。这使得此数据集适用于使用 Join 操作的更复杂的查询和联邦查询(其中不同表位于不同的数据源)。
此数据集的数据来自美国联邦航空管理局(FAA),专用于分析。flights
表的 schema 比较大,表 1-1 展示了其中一部分列。
表 1-1:可用列的子集
数据集中的每一行表示从美国机场起飞或到达美国机场的航班。
1.5 Presto简史
Facebook 于 2008 年开源了 Hive,它之后成了 Apache Hive。Hive 在 Facebook 内部被广泛用于在其巨大的 Apache Hadoop 集群上执行 HDFS 上的数据分析任务。
Facebook 的数据分析师使用 Hive 在大型数据仓库上执行交互式查询。在 Facebook 开发出 Presto 之前,所有的分析师都依赖于 Hive,但 Hive 并不适用于 Facebook 这种大数据规模下的交互式查询。2012 年,Facebook 的 Hive 数据仓库已经有 250PB 了,它每天需要处理数百个用户的成千上万条查询。在 Facebook 内部,Hive 逐渐到达极限,并且它无法查询其他数据源。
Facebook 从零开始设计出了 Presto,以便在其数据规模下快速地执行查询。Presto 不是创建一个新系统并将数据迁移过去,而是通过可插拔的连接器系统,在数据存储的本地读取数据。Hive 连接器是 Presto 最早的连接器之一(参见 6.4 节),它直接查询存储在 Hive 数据仓库的数据。
2012 年,4 个 Facebook 工程师开始研发 Presto,以满足 Facebook 在分析场景中对性能、扩展性和延伸性上的需求。Presto 最初就是要构建为开源项目。在 2013 年年初,Presto 的初始版本在 Facebook 内部生产环境上线。同年秋天,Facebook 正式开源 Presto。鉴于 Presto 在 Facebook 内部取得的成功,许多其他大型互联网公司也开始使用它,如 Netflix、LinkedIn、Treasure Data 等,并还有更多的公司紧随其后。
2015 年,Teradata 声明将向 Presto 投入多达 20 个工程师来贡献代码,他们专注于添加企业特性,如安全提升和生态系统工具集成。2015 年晚些时候,Amazon 开始在 AWS Elastic MapReduce(EMR)系统中添加 Presto。2016 年,Amazon 发布了以 Presto 作为主要基石的 Athena 服务。2017 年,Starburst 横空出世,它是一家专门推广 Presto 的公司。
2018 年末,Presto 的创始人离开 Facebook,成立了 Presto 软件基金会,以使该项目保持协作与独立。自那时起,Presto 的创新和增长速度都更上一层楼。
今天,Presto 社区欣欣向荣,许多知名公司大规模地使用它。这个项目现在由来自世界各地许多公司的开发者和贡献者组成的繁荣社区维护,这些公司包括阿里巴巴集团、Amazon、Appian、Gett、Google、Facebook、Hulu、Line、LinkedIn、Lyft、Motorola、Qubole、Red Hat、Salesforce、Starburst、Twitter、Uber、Varada、Walmart 和 Zoho。
1.6 小结
本章介绍了 Presto 以及它的一些特性,还探索了其可能的使用场景。
在第 2 章中,你将安装 Presto 并运行它,将它连接到一个数据源,并了解如何查询数据。