Trino权威指南(原书第2版)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.2 Trino来救场

Trino能解决上述所有问题。通过支持不同系统上的联邦查询、并行查询和横向集群扩展等功能,它为我们提供了新的机会。Trino项目的标志如图1-2所示。

图1-2:Trino项目的标志

Trino是一个开源的分布式SQL查询引擎,是为了高效查询不同系统和各种规模(从GB级到PB级)的数据源而从头开始设计和编写的一套系统。使用Trino,人们不需要在快速但昂贵的商业解决方案和缓慢(且需要更多硬件)但“免费”的解决方案之间做出选择。

1.2.1 为性能和规模而生

Trino是一个使用分布式执行来快速查询海量数据的工具。如果有TB级乃至PB级的数据需要查询,你可能会使用Apache Hive等工具,这些工具基于Hadoop和Hadoop分布式文件系统(Hadoop Distributed File System,HDFS)或类似系统[如Amazon Simple Storage Service(S3)和其他由云提供商提供的或用于自托管的兼容部署]工作。与这些工具相比,Trino可以更高效地查询数据。

分析师应该使用Trino,因为他们期望SQL查询可以在几毫秒(实时数据分析)、几秒或几分钟内返回结果。Trino支持SQL,通常用在数据仓库、数据分析、海量数据聚合和生成报告等任务上,这些任务通常被归类为联机分析处理(OnLine Analytical Processing,OLAP)。

尽管Trino能理解并高效地执行SQL,但它并不是一个数据库,因为它并不包含自己的数据存储系统。它无意成为一个取代Microsoft SQL Server、Oracle数据库、MySQL或PostgreSQL的通用关系型数据库。此外,Trino也不适用于联机事务处理(OnLine Transaction Processing,OLTP)。许多为数据仓库和数据分析任务设计、优化的数据库也是如此,如Teradata、Netezza、Vertica和Amazon Redshift等。

Trino同时使用了众所周知的技术和新颖的技术来执行分布式查询。这些技术包括内存并行处理、跨集群节点管线执行、多线程执行模型(以保持所有CPU核心被充分利用)、高效的扁平内存数据结构(以最小化Java的垃圾回收和Java字节码生成)等。本书不会详细介绍Trino内部的复杂实现。借助上述技术,Trino用户可以以比其他方案更低的成本更快地获得查询结果。

1.2.2 SQL-on-Anything

Trino的设计初衷是用来查询HDFS上的数据。稍后可以看到,它可以非常高效地完成这一任务,而且并未止步于此。Trino是一个查询引擎,它也可以从对象存储系统、关系型数据库管理系统(RDBMS)、NoSQL数据库和其他系统中查询数据,如图1-3所示。

Trino在原地查询数据,无须事先将数据迁移集中到某个位置。因此,Trino不仅可以查询HDFS和其他分布式对象存储系统中的数据,还可以查询RDBMS和其他数据源。无论数据存放在何处,Trino都可以查询,因此它可以取代传统、昂贵和笨重的提取-变换-加载(ETL)过程,或者至少为某些现代化高效ETL工具(例如,dbt)提供一个高效的且能在必要时支持跨所有数据源查询的查询引擎,并减少甚至避免对实际数据做大量的ETL处理。显然,Trino并非只是一个SQL-on-Hadoop解决方案。

图1-3:Trino对多种数据源的SQL支持

对象存储系统包括Amazon S3、Microsoft Azure Blob Storage、Google Cloud Storage和S3兼容存储(如MinIO和Ceph)。这些系统可以使用传统的Hive表格式,也可以使用更好的替代品Delta Lake和Iceberg表格式。Trino可以查询传统的RDBMS,如Microsoft SQL Server、PostgreSQL、MySQL、Oracle、Teradata和Amazon Redshift;还可以查询NoSQL数据库系统,如Apache Cassandra、Apache Kafka、MongoDB和Elasticsearch。Trino几乎可以查询任何东西,是一个真正的SQL-on-Anything系统。

对于用户来说,这意味着他们在与特定系统内的数据进行交互时,无须再依赖特定的查询语言和工具。他们可以简单地利用Trino和已有的SQL技能,并利用已经十分熟悉的基于SQL的数据分析、仪表盘和报表工具,查询那些之前被锁定在分离系统中的数据。有了Trino,用户甚至可以用相同的SQL在不同的系统之间进行查询。

1.2.3 数据存储与查询计算资源分离

Trino没有自己的存储,它只是在数据所在之处进行查询处理。使用Trino时,存储和计算是分离的,它们可以各自独立地扩展。Trino代表计算层,底层的数据源代表存储层。

这使得Trino可以基于对数据的分析需求来扩展和缩减计算资源。你无须移动数据或根据当前查询的需求预设计算资源和存储资源,也无须随着查询需求的变化来定期变更资源的分配。

Trino可以通过动态扩展计算集群来扩展查询能力,并可以在数据源中数据所在的位置查询数据。借助这一特性,你可以极大地优化硬件资源需求并降低成本。