使用Iceberg REST端点从Amazon EMR Trino查询S3 Tables
DataHot 速览
Amazon S3 Tables提供原生Apache Iceberg支持和自动表维护,可减轻压缩、快照过期与元数据跟踪的运维负担。通过Iceberg REST端点,EMR上的Trino可查询这些表,形成全托管、开放标准的分析栈。该集成支持跨引擎兼容,并保持对查询执行和数据处理逻辑的控制,可帮助用户在避免厂商锁定的同时获得高吞吐查询性能。
为什么值得关注:这是AWS将托管数据湖存储与Trino查询引擎打通的新实践,让使用Iceberg的团队无需自行维护表元数据与表生命周期,值得关注。
本文目录 20 节
- 解决方案概览
- 前提条件
- A 部分:使用 AWS CloudFormation 配置 Amazon S3 Tables 与 Amazon EMR 上的 Trino 集成。
- 了解部署
- 部分 B:使用 Iceberg REST 端点将 Trino 连接到 Amazon S3 Tables
- 1. 目录配置详细信息
- 2. S3 Tables Iceberg REST 端点配置属性
- 3. 配置 Amazon EMR 服务 IAM 角色信任关系
- 4. 在 Amazon EMR 上使用 Trino 处理 S3 Tables
- 4.1. 连接到 Trino on Amazon EMR
- 4.2. 示例:创建和查询表
- 4.2.1 创建命名空间
- 4.2.2 创建表
- 4.2.3 插入数据
- 4.2.4 查询数据
- 4.3 探索高级功能
- 4.3.1 时间旅行查询
- 4.3.2 模式演进
- 清理资源
- 结论
译文
AI 逐段翻译在 Amazon Simple Storage Service (Amazon S3) 数据湖上运行分析的组织,在处理 Apache Iceberg 表时往往面临运维开销的挑战,包括压缩、快照过期和元数据跟踪,同时仍需对海量数据提供快速、交互式 SQL 访问。Amazon S3 Tables是 Amazon S3 的一项功能,通过提供专用的存储层并原生支持 Apache Iceberg 和自动化表维护来解决此问题。当您从 Amazon EMR 使用 Trino 和 Iceberg REST 端点查询 S3 Tables 时,可获得完全托管、基于开放标准的分析堆栈,而无需承担表维护的繁重工作。
当与运行 Trino 的 Amazon EMR 配合使用时,组织可获得高性能的分布式 SQL 查询引擎,能够处理大规模数据集。Trino 跨多个数据源查询的能力与 S3 Tables 的自动优化功能相结合,打造了灵活的分析平台。该集成使用 Apache Iceberg 的 REST 目录规范,提供了标准接口,支持不同计算引擎之间的兼容性,同时保留对查询执行和数据处理逻辑的完全控制。
这种架构模式对于希望实现数据平台现代化且避免供应商锁定的组织尤其有价值,因为它依赖于开放标准和格式。该解决方案通过分布式 SQL 执行提供高吞吐量的查询性能,同时显著减轻了管理表元数据、压缩和快照生命周期管理的运维负担。在本文中,我们将向您展示如何通过 Apache Iceberg REST 目录端点,在 Amazon EMR 上使用 Trino 创建和查询 Amazon S3 Tables。
解决方案概览
此实现展示了 Amazon EMR 上的 Trino 发行版与 Amazon S3 Tables 通过 Apache Iceberg REST 目录端点的完整集成。该架构使用多个关键的 AWS 服务协同工作:
Amazon EMR作为托管计算层,提供可扩展的 Hadoop 框架,承载 Trino 查询引擎。Amazon EMR 处理集群配置、配置管理和自动扩展,使团队能够专注于分析而非基础设施管理。
Apache Trino作为分布式 SQL 查询引擎,提供 ANSI SQL 兼容性,并能够以低延迟处理海量数据集上的查询,适用于交互式工作负载。其连接器架构支持与多种数据源集成,包括 Iceberg REST 目录。
Amazon S3 Tables提供存储和目录层,以内置优化管理 Apache Iceberg 表。该服务自动处理压缩、快照过期和元数据管理,在降低运维开销的同时保持查询性能。S3 Tables 公开了符合 Apache Iceberg REST 目录规范的 REST API 端点,为任何兼容 Iceberg 的引擎提供标准化集成。
Apache Iceberg REST 端点作为 Trino 与 S3 Tables 之间的通信协议。此 RESTful 接口处理目录操作,包括命名空间管理、表创建、元数据检索和事务协调。该端点支持 AWS Signature Version 4 身份验证,以确保对表资源的安全访问。
数据流程遵循以下模式:用户通过 Trino CLI 或 JDBC 接口提交 SQL 查询。Trino 的 Iceberg 连接器与 S3 Tables REST 端点通信以获取表元数据并规划查询执行。然后,查询引擎使用优化文件格式(如 Parquet、ORC)直接从 S3 读取数据,同时利用 Iceberg 的元数据层进行分区修剪和谓词下推。写操作遵循类似路径,Trino 与 S3 Tables 协调,以原子方式提交新数据文件并更新表元数据。
该架构提供多项关键优势:计算与存储分离以实现独立扩展、自动化表维护降低运维成本、开源格式兼容性避免供应商锁定,以及通过 AWS Identity and Access Management (IAM) 和 AWS Lake Formation 集成实现细粒度访问控制。

图 1:从 Amazon EMR 上的 Trino 查询 Amazon S3 Tables 的解决方案架构。
前提条件
开始之前,请确保您具备以下条件:
- 具有有效且启用计费的 AWS 账户。
- 一个 AWS Identity and Access Management (IAM) 用户,具有创建和管理资源的特定权限,例如虚拟私有云 (VPC)、子网、安全组、IAM 角色、Amazon EMR、接口 VPC 端点、S3 Tables 存储桶和 S3 存储桶。
- 在所选 AWS 区域 中有足够的 VPC 容量。
在本文中,我们在美国东部(弗吉尼亚北部)区域(us-east-1)使用 AWS CloudFormation 模板创建解决方案资源。在以下部分,我们将向您展示如何配置资源并实施解决方案。
注意: 在 Amazon EMR 上通过 Trino 查询 Amazon S3 Tables 需要 Trino 475 或更高版本,该版本在 Amazon EMR 7.11 及更高版本中可用。
A 部分:使用 AWS CloudFormation 配置 Amazon S3 Tables 与 Amazon EMR 上的 Trino 集成。
在本文中,您将使用 CloudFormation 模板 emr-trino-s3tables.yaml。
- 此模板部署以下资源:一个包含一个私有子网的 VPC、一个用于私有访问的 S3 Tables 接口 VPC 端点,以及一个运行 Trino 的 Amazon EMR 集群,该集群通过 Apache Iceberg REST 目录端点与 Amazon S3 Tables 集成。
- 它还会创建一个 S3 Tables 存储桶、一个通用 S3 存储桶、IAM 角色和安全组。
- 在部署时,它会动态生成 Trino 目录配置和引导脚本。
要创建解决方案资源,请完成以下步骤:
- 启动堆栈
emr-trino-s3tables.yaml使用 CloudFormation 模板。
- 按下表中的参数值提供参数。
| 参数 | 描述 | 示例值 |
| 堆栈名称 | CloudFormation 堆栈的名称 | emr-s3tables-trino |
| VPC CIDR 块 | 此 VPC 的 IP 范围(CIDR 表示法)。 | 10.0.0.0/16 |
| 私有子网 CIDR 块 | 第二个可用区中私有子网的 IP 范围(CIDR 表示法)。 | 10.0.1.0/24 |
| 资源名称前缀 | 应用于所有资源名称的短前缀 | emr-s3tables |
| S3 Tables 桶名称 | S3 表桶的名称 | trinoemrs3tablebuck |
| EMR 发布版本 | Amazon EMR 的发布版本 | EMR 7.12 |
堆栈创建过程大约需要 15 分钟才能完成。堆栈创建后,您可以查看堆栈的输出选项卡,如下面的屏幕截图所示。
图 3:CloudFormation 堆栈输出

图 3:CloudFormation 堆栈输出
了解部署
CloudFormation 模板执行几项关键任务:
- 基础设施配置: 设置带有 Trino 的 Amazon EMR 集群、VPC、子网、安全组和 S3 表桶。
- 配置: 创建必要的 Trino 配置文件。
- 集成配置:为 S3 Tables 设置 Iceberg REST 连接器。
部分 B:使用 Iceberg REST 端点将 Trino 连接到 Amazon S3 Tables
CloudFormation 模板自动在 Amazon EMR 上的 Trino 中配置 S3 Tables 目录。在下一节中,我们检查驱动此集成的配置。
1. 目录配置详细信息
Amazon EMR 上 Trino 中的目录是授予对特定数据源访问权限的配置。每个 Trino on Amazon EMR 集群可以配置多个目录,从而允许同时访问不同的数据源。
作为此设置的一部分,CloudFormation 模板在以下位置创建目录属性文件 /etc/trino/conf/catalog/s3tables_irc.properties 使用以下配置:
connector.name=iceberg
iceberg.catalog.type=rest
iceberg.rest-catalog.uri=https://s3tables.<REGION>.amazonaws.com/iceberg
iceberg.rest-catalog.warehouse=arn:aws:s3tables:AwsRegion:<ACCOUNT-ID>:bucket/<BUCKET-NAME>
iceberg.rest-catalog.sigv4-enabled=true
iceberg.rest-catalog.signing-name=s3tables
iceberg.rest-catalog.view-endpoints-enabled=false
fs.hadoop.enabled=false
fs.native-s3.enabled=true
s3.region=us-east-1
s3.iam-role=arn:aws:iam::<ACCOUNT-ID>:role/service-role/<ROLE-NAME>2. S3 Tables Iceberg REST 端点配置属性
下表列出了 Trino 中目录配置的关键属性:
| 属性名称 | 描述 |
| iceberg.rest-catalog.uri | REST 服务器 API 端点 URI(必需)。 |
| iceberg.rest-catalog.warehouse | 目录的仓库 ID 或位置(必需)。对于 S3 Tables,这是 S3 表桶的 ARN,如前一个属性示例所示。 |
| iceberg.rest-catalog.sigv4-enabled | 必须设置为'true'(必需) |
| iceberg.rest-catalog.signing-name | 必须设置为's3tables'(必需) |
| iceberg.rest-catalog.view-endpoints-enabled | 必须设置为'false'(必需) |
| fs.hadoop.enabled | 必须设置为'false' |
| fs.native-s3.enabled | 必须设置为'true' |
| s3.iam-role | Amazon 资源名称(ARN) 具有 S3 Tables 权限的 IAM 角色。在本文中,我们使用相同的角色,即 Amazon EMR 的服务角色。 |
| s3.region | AWS 区域,例如 us-east-1 |
此配置在 Trino 和 S3 Tables REST 端点之间建立连接。您可以注册多个目录,每个 S3 表桶一个,由 iceberg.rest-catalog.warehouse 属性决定。
3. 配置 Amazon EMR 服务 IAM 角色信任关系
Amazon EMR 服务角色需要正确的信任关系才能正常运行。导航到 IAM 控制台并配置您的 Amazon EMR 服务角色的信任策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "elasticmapreduce.amazonaws.com"
},
"Action": "sts:AssumeRole"
},
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<ACCOUNT-ID>:role/service-role/AmazonEMR-InstanceProfile"
},
"Action": "sts:AssumeRole"
}
]
}此信任策略建立了两个关键关系:
- Amazon EMR 服务可以承担该角色来管理集群操作。
- EC2 实例配置文件可以承担该角色以使用提升的权限访问 S3 Tables。
4. 在 Amazon EMR 上使用 Trino 处理 S3 Tables
现在您已经设置了 Trino on Amazon EMR 并配置为与 S3 Tables 一起使用,您可以探索如何使用此集成。
4.1. 连接到 Trino on Amazon EMR
导航到 Amazon EMR 并选择使用 AWS Systems Manager Session Manager 连接到主节点以进行无密码 SSH。

图 4:使用 Session Manager 连接到主节点
连接后,您可以使用 Trino CLI 和您的 S3 Tables 目录:
sudo su - hadoop
trino-cli --catalog s3tables_irc这将使用您配置的 S3 Tables 集成连接到 Trino on Amazon EMR。

图 5:Trino CLI 连接到 S3 Tables 目录
4.2. 示例:创建和查询表
在本节中,您将运行一些示例查询以演示功能。
4.2.1 创建命名空间
首先,在 S3 Tables 中创建命名空间(架构)。S3 Tables 中的命名空间是逻辑容器或组织单元,有助于将相关表和对象分组在一起。
CREATE SCHEMA blog_namespace;
USE blog_namespace;4.2.2 创建表
创建具有各种数据类型的表。您不需要显式指定表类型为 Iceberg,因为您连接到的是 Iceberg 目录。您可以使用所有标准的 Iceberg 功能,例如分区和排序。此外,一些重要的支持表维护操作的 Iceberg 表属性配置了默认值。您还可以选择使用 S3 Tables 维护 API 编辑配置。
CREATE TABLE IF NOT EXISTS customers (
customer_sk INT,
customer_id VARCHAR,
salutation VARCHAR,
first_name VARCHAR,
last_name VARCHAR,
preferred_cust_flag VARCHAR,
birth_day INT,
birth_month INT,
birth_year INT,
birth_country VARCHAR,
login VARCHAR
) WITH (
format = 'PARQUET',
sorted_by = ARRAY['customer_id']
);表属性说明:
format = 'PARQUET': 指定 Parquet 作为文件格式,以获得最佳压缩和查询性能。sorted_by = ARRAY['customer_id']: 定义数据文件内的排序顺序,提高对customer_id过滤的查询性能。
验证表创建:
SHOW TABLES;您应该看到 customers 在输出中,确认表存在于 S3 Tables 目录中。
4.2.3 插入数据
您可以在表中插入一些示例数据。您也可以使用 Trino on Amazon EMR 中配置的任何目录中的现有表来读取数据并写入 S3 表,使用 INSERT INTO ... SELECT 语句。
INSERT INTO customers VALUES
(1, 'AAAAA', 'Mrs', 'Martha', 'Rivera', 'Y', 8, 4, 1984, 'US', 'mrivera'),
(2, 'AAAAB', 'Mr', 'Mateo', 'Jackson', 'N', 22, 6, 2001, 'US', 'mjackson'),
(3, 'BAAAA', 'Ms', 'Mary', 'Major', 'Y', 16, 2, 1999, 'US', 'mmajor'),
(4, 'BBAAA', 'Mr', 'Paulo', 'Santos', 'N', 30, 3, 1973, 'US', 'psantos'),
(5, 'AACAA', 'Ms', 'Ana', 'Silva', 'N', 2, 6, 1982, 'CA', 'asilva'),
(6, 'ABAAA', 'Mr', 'Alejandro', 'Rosalez', 'N', 5, 12, 1988, 'US', 'arosalez'),
(7, 'BBAAA', 'Ms', 'Nikki', 'Wolf', 'N', 6, 1, 2006, 'MX', 'nwolf'),
(8, 'ACAAA', 'Mr', 'Arnav', 'Desai', 'N', 15, 7, 1976, 'US', 'adesai');此 INSERT 操作演示了 Trino 将数据写入 S3 Tables 的能力。在幕后,Trino:
- 以 Parquet 格式将数据文件写入 S3。
- 与 S3 Tables REST 端点通信以注册新文件。
- 原子性地提交事务,更新表元数据。
4.2.4 查询数据
执行 SELECT 查询以检索和验证插入的数据:
SELECT * FROM customers LIMIT 10;该查询应返回所有八条客户记录,格式正确。您还可以执行更复杂的分析查询:
-- Count customers by country
SELECT birth_country, COUNT(*) as customer_count
FROM customers
GROUP BY birth_country
ORDER BY customer_count DESC;
-- Find customers born after 1990
SELECT first_name, last_name, birth_year
FROM customers
WHERE birth_year > 1990
ORDER BY birth_year;这些查询展示了Trino的SQL能力以及与S3 Tables的读写集成。
4.3 探索高级功能
带有Iceberg的S3 Tables提供了多种数据管理功能:
4.3.1 时间旅行查询
第1步:检查可用的快照。
-- Query table as of a specific timestamp. Check available snapshots
SELECT * FROM "customers$snapshots";第2步:按特定快照查询表。
SELECT * FROM customers FOR VERSION AS OF <snapshot_id_from_step1>;4.3.2 模式演进
-- Add a new column
ALTER TABLE customers ADD COLUMN email VARCHAR;
-- Rename a column
ALTER TABLE customers RENAME COLUMN login TO username;清理资源
要清理资源,请导航到 CloudFormation 并删除您创建的堆栈。
结论
此解决方案演示了使用Apache Iceberg REST目录规范的Amazon EMR Trino与Amazon S3 Tables之间的集成。在本文中,我们向您展示了如何从Amazon EMR上的Trino创建和查询S3 Tables。该架构为现代数据平台提供了多项优势:
操作简便性:S3 Tables消除了管理Iceberg表元数据、压缩计划和快照生命周期策略的复杂性。该服务自动处理这些操作,使数据团队能够专注于分析,而不是基础设施维护。
大规模性能:该架构专为大规模工作负载设计。Trino将查询执行分布到集群中,而Iceberg的元数据层帮助引擎仅定位相关数据文件。分区裁剪、谓词下推和列式文件格式等功能有助于提高交互式和批处理工作负载的性能。
成本效益:此架构分离了计算和存储,因此您可以根据工作负载需求独立扩展它们。S3 Tables自动压缩小文件以帮助减少存储开销,Amazon EMR集群可以动态扩展,因此您仅在需要时支付计算费用。
开放标准和可移植性:通过使用Apache Iceberg的开放表格式和REST目录规范,此解决方案避免了供应商锁定。其他兼容Iceberg的引擎可以访问S3 Tables中创建的表,包括Apache Spark、Apache Flink和Dremio,从而在工具选择上提供了灵活性。
细粒度访问控制:与IAM和基于资源的策略集成提供了表桶、命名空间和表级别的访问控制。对于列和行级别的细粒度访问,您可以与AWS Lake Formation集成。AWS签名版本4身份验证支持Trino和S3 Tables之间的安全通信。
ACID事务:Iceberg的事务模型保证所有表操作的原子性、一致性、隔离性和持久性。这支持可靠的并发读写,使平台适用于需要数据一致性的生产工作负载。
这种架构模式特别适合构建现代数据湖屋、从传统数据仓库迁移或整合多个分析平台的组织。Amazon EMR的托管计算、Trino的多功能查询引擎以及S3 Tables的自动化表管理的结合,为数据驱动的决策奠定了坚实基础。
要了解有关本文讨论的服务的更多信息,请参阅以下资源:
这篇内容对你有用吗?
反馈只用于改善内容筛选,不等同于收藏