Trino是一个开源的分布式SQL查询引擎,旨在查询分布在一种或多种异构数据源上的大型数据集。Trino被设计用来处理大量数据的数据仓库、ETL和交互式分析,并生成报告。
Alluxio是一个开源的大规模分析和AI的数据编排平台。Alluxio位于Trino和Apache Spark等计算框架与Amazon S3、Google Cloud Storage、HDFS和MinIO等各种存储系统之间。
本教程指导如何部署Alluxio作为Trino的缓存层,使用Iceberg连接器。
为什么Trino需要缓存?
A small fraction of the petabytes of data you store is generating business value at any given time. Repeatedly scanning the same data and transferring it over the network consumes time, compute cycles, and resources. This issue is compounded when pulling data from disparate Trino clusters across regions or clouds. In these circumstances, caching solutions can significantly reduce the latency and cost of your queries.
Trino的Hive连接器内置了Rubix缓存引擎。虽然这一系统因其随Trino提供而方便,但它仅限于Hive连接器,自2020年以来未得到维护。它还缺乏安全特性和对额外计算引擎的支持。
Trino与Alluxio的结合
Alluxio将Trino连接到各种存储系统,为数据驱动型应用提供API和统一命名空间。Alluxio使Trino能够访问任何数据源的数据,并透明地缓存频繁访问的数据(如常用表)到Alluxio分布式存储中。
通过Iceberg连接器在MinIO文件存储上使用Alluxio缓存
我们创建了一个演示,展示如何配置Alluxio使用MinIO的直写缓存。这是通过使用Iceberg连接器并从Trino的角度对表的位置属性进行单一更改来实现的。
在本演示中,Alluxio 运行在独立的服务器上;然而,建议将其与 Trino 部署在同一节点上。这意味着 Alluxio 的所有配置将位于运行 Alluxio 的服务器上,而 Trino 的配置保持不变。外部运行 Alluxio 的优势在于它不会与 Trino 竞争资源,但缺点是读取 Alluxio 中的数据时需要通过网络传输。确保 Trino 和 Alluxio 位于同一网络对于性能至关重要。
要按照此演示操作,请复制位于此处的代码。
Trino 配置
Trino 的配置与标准的 Iceberg 配置相同。由于 Alluxio 在 Trino 外部运行,所需的配置仅在查询时进行,而非启动时。
Alluxio 配置
Alluxio的所有配置均可通过alluxio-site.properties
文件进行设置。为了确保所有配置集中于docker-compose.yml
文件中,我们通过ALLUXIO_JAVA_OPTS
环境变量使用Java属性进行配置。本教程中,主节点称为“leader”,工作节点称为“follower”。
主节点配置
alluxio.master.mount.table.root.ufs=s3://alluxio/
leader节点开放端口19998
和19999
,其中后者为Web UI端口。
工作节点配置
alluxio.worker.ramdisk.size=1G
alluxio.worker.hostname=alluxio-follower
follower节点开放端口29999
和30000
,并设置用于Alluxio存储数据的共享内存,大小通过shm_size
属性设置为1G
,并参照alluxio.worker.ramdisk.size
属性。
leader与follower间的共享配置
alluxio.master.hostname=alluxio-leader
# Minio配置
alluxio.underfs.s3.endpoint=http://minio:9000
alluxio.underfs.s3.disable.dns.buckets=true
alluxio.underfs.s3.inherit.acl=false
aws.accessKeyId=minio
aws.secretKey=minio123
# 仅用于演示的配置
alluxio.security.authorization.permission.enabled=false
`alluxio.master.hostname
` 需要在所有节点上设置,包括领导节点和跟随节点。大多数共享配置指向 Alluxio 的 `underfs
`,在本例中为 MinIO。
`alluxio.security.authorization.permission.enabled
` 设置为 “false”,以简化 Docker 环境配置。
注意:在生产环境或 CI/CD 环境中不推荐这样做。
运行服务
首先,启动服务。确保你位于 `trino-getting-started/iceberg/trino-alluxio-iceberg-minio
` 目录下。执行以下命令:
docker-compose up -d
预期输出如下。Docker 可能需要先下载 Docker 镜像,然后才能看到“已创建/已启动”消息,因此可能会有额外输出:
[+] Running 10/10
⠿ Network trino-alluxio-iceberg-minio_trino-network Created 0.0s
⠿ Volume "trino-alluxio-iceberg-minio_minio-data" Created 0.0s
⠿ Container trino-alluxio-iceberg-minio-mariadb-1 Started 0.6s
⠿ Container trino-alluxio-iceberg-minio-trino-coordinator-1 Started 0.7s
⠿ Container trino-alluxio-iceberg-minio-alluxio-leader-1 Started 0.9s
⠿ Container minio Started 0.8s
⠿ Container trino-alluxio-iceberg-minio-alluxio-follower-1 Started 1.5s
⠿ Container mc Started 1.4s
⠿ Container trino-alluxio-iceberg-minio-hive-metastore-1 Started
打开 Trino CLI
完成上述步骤后,你可以登录到 Trino 协调节点。我们将使用 `exec
` 命令,并在该容器中运行 `trino
` CLI 可执行文件。注意容器 ID 为 `trino-alluxio-iceberg-minio-trino-coordinator-1
`,因此你将运行的命令是:
<<<<<<< HEAD
docker container exec -it trino-alluxio-iceberg-minio-trino-coordinator-1 trino
=======
docker container exec -it trino-minio_trino-coordinator_1 trino
>>>>>>> alluxio
启动完成后,您应该会看到trino
光标。当一切就绪时,它看起来应该是这样的:
trino>
为了更好地理解此配置的工作原理,我们将通过CTAS(CREATE TABLE AS)查询创建一个Iceberg表,该查询将从TPC连接器推送数据到指向MinIO的Iceberg。TPC连接器能够即时生成数据,因此我们可以运行这样的简单测试。
首先,执行命令显示目录,查看tpch
和iceberg
目录,因为这些是我们将在CTAS查询中使用的目录:
SHOW CATALOGS;
您应该会看到Iceberg目录已被注册。
MinIO存储桶和Trino模式
启动时,以下命令会在包含mc
MinIO CLI的初始化容器上执行。这会在MinIO中创建一个名为/alluxio
的存储桶,为我们提供一个写入数据的位置,并指示Trino查找数据的位置:
/bin/sh -c "
until (/usr/bin/mc config host add minio http://minio:9000 minio minio123) do echo '...waiting...' && sleep 1; done;
/usr/bin/mc rm -r --force minio/alluxio;
/usr/bin/mc mb minio/alluxio;
/usr/bin/mc policy set public minio/alluxio;
exit 0;
"
注意:此存储桶将作为Alluxio的挂载点,因此Alluxio中的模式目录alluxio://lakehouse/
将映射到s3://alluxio/lakehouse/
。
查询Trino
接下来,我们创建指向MinIO中存储桶的SCHEMA
,并执行CTAS查询。返回终端,创建iceberg.lakehouse
SCHEMA
。这是首次调用元数据存储,用于保存架构位置在Alluxio命名空间中的位置。请注意,由于未将Alluxio设置为默认文件系统,我们需要指定主机名alluxio-leader
和端口19998
。如果你想让Alluxio缓存成为默认使用方式,并且对用户管理DDL语句透明,请考虑这一点:
CREATE SCHEMA iceberg.lakehouse
WITH (location = 'alluxio://alluxio-leader:19998/lakehouse/');
现在我们有了一个引用Alluxio中存储表的存储桶的SCHEMA
,该存储桶与MinIO同步,我们可以创建第一个表了。
可选:要查看查询执行情况,请登录Trino UI,使用任意用户名登录(由于未设置安全措施,用户名无关紧要)。
使用CTAS查询将生成的微小TPCH数据中的客户数据迁移到MinIO。运行以下查询,如果愿意,可以在Trino UI上观看其执行过程:
CREATE TABLE iceberg.lakehouse.customer
WITH (
format = 'ORC',
location = 'alluxio://alluxio-leader:19998/lakehouse/customer/'
)
AS SELECT * FROM tpch.tiny.customer;
访问Alluxio UI和MinIO UI,浏览Alluxio和MinIO的文件。你现在会看到一个包含customer
目录的lakehouse
目录,其中包含了Trino写入Alluxio以及Alluxio同步到MinIO的数据。
目前,数据存储在Alluxio和MinIO之下,您可以通过以下步骤查询这些数据:
SELECT * FROM iceberg.lakehouse.customer LIMIT 10;
如何确保Trino实际上是从Alluxio而非MinIO读取数据?我们可以通过删除MinIO中的数据并重新运行查询来验证。删除这些数据后,您应该仍能看到数据返回。
服务停止
完成本教程后,您可以通过运行以下命令释放用于此练习的资源:
docker-compose down
结论
至此,您应该对Trino和Alluxio有了更深入的了解,掌握了如何部署Trino和Alluxio,以及如何使用Alluxio缓存结合Iceberg连接器和MinIO文件存储。希望您喜欢这篇文章。如果您有任何问题,请点赞并留言!
Source:
https://dzone.com/articles/get-started-with-trino-and-alluxio-in-five-minutes