ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

分析师想查数据湖?Trino 不用搬数据,直接查 OSS Tables【详解 OSS Tables 系列】

分析师想查数据湖?Trino 不用搬数据,直接查 OSS Tables【详解 OSS Tables 系列】 交互式分析的诉求在 OSS Tables 的生态里Trino 是分析快刀只读不写分析师写一条 SQL 就能秒级查湖里的数据不需要提 Spark 作业也不用跑 Flink 任务。数据通过 Spark、Flink 或 Kafka Connect 写进了 OSS Tables下一个问题就是谁来查BI 分析师不会写 Spark 作业数据科学家也不想为了一次即席查询去提交一个 Flink 任务但他们需要的东西很简单打开 SQL 客户端写一条 SELECT几秒内拿到结果。Trino原 PrestoSQL就是干这个的它是一个分布式 SQL 查询引擎以低延迟交互式查询为主也能通过容错执行承担批式作业本文聚焦即席查询场景专注于交互式查询。对接数据湖是 Trino 最典型的用法场景。但 Trino 查 OSS Tables 有一个现实问题OSS Tables 返回的数据路径使用 oss:// 前缀而 Trino 的原生 S3 文件系统只认 s3://、s3a://、s3n:// 三种协议且 Trino 社区目前还没有原生支持 oss://所以需要对源码做少量修改来注册这个协议。当然改动很小只涉及两个模块做完之后Trino 就能像查 S3 上的 Iceberg 表一样直接查 OSS Tables。OSS Tables 兼容 Apache Iceberg REST Catalog 协议。可以通过 Trino 的原生 S3 文件系统fs.native-s3对接 OSS Tables使用标准 SQL 查询和写入 Table Bucket 中的数据。该方式需要对 Trino 源码进行少量修改以支持oss://协议适合对编译环境有掌控的场景。重要 由于 Trino 社区尚未原生支持oss://文件系统协议如需使用 Trino 访问 OSS Tables需要修改 Trino 源码并重新编译两个模块生成 jar 包后在 Trino 环境中替换并重启。步骤一修改Trino源码OSS Tables 返回的数据路径使用oss://前缀而 Trino 原生 S3 文件系统仅识别s3://、s3a://、s3n://协议。需要在以下两个模块中注册oss协议。修改 trino-filesystem-s3找到 S3 Location 校验逻辑将oss添加到允许的 scheme 集合中// 修改前 checkArgument(Set.of(s3, s3a, s3n).contains(location.scheme().get()), Wrong scheme for S3 location: %s, location); // 修改后 checkArgument(Set.of(s3, s3a, s3n, oss).contains(location.scheme().get()), Wrong scheme for S3 location: %s, location);修改 trino-filesystem-manager在文件系统工厂绑定处添加ossscheme 的映射factories.addBinding(s3).to(Key.get(TrinoFileSystemFactory.class, FileSystemS3.class)); factories.addBinding(s3a).to(Key.get(TrinoFileSystemFactory.class, FileSystemS3.class)); factories.addBinding(s3n).to(Key.get(TrinoFileSystemFactory.class, FileSystemS3.class)); // 在已有的 s3/s3a/s3n 绑定后添加 factories.addBinding(oss).to(Key.get(TrinoFileSystemFactory.class, FileSystemS3.class));编译并替换编译上述两个模块后将生成的 JAR 包替换 Trino 部署目录中对应的原始 JAR然后重启 Trino 服务。# 编译 trino-filesystem-s3 mvn -pl lib/trino-filesystem-s3 -am package -DskipTests # 编译 trino-filesystem-manager mvn -pl lib/trino-filesystem-manager -am package -DskipTests # 替换 JAR以 Trino 安装目录 /opt/trino 为例 cp lib/trino-filesystem-s3/target/trino-filesystem-s3-*.jar /opt/trino/lib/ cp lib/trino-filesystem-manager/target/trino-filesystem-manager-*.jar /opt/trino/lib/步骤二创建Table Bucket在开始写入数据之前需要创建 Table Bucket 和 Namespace。可以使用 ossutil 或 AWS CLI 创建。方式一使用ossutil1. 安装或升级 ossutil请安装ossutil 2.3.0以上版本如已安装 ossutil可执行以下命令升级到最新版本ossutil update -f2. 配置凭证执行ossutil config命令按提示输入 AccessKey ID、AccessKey Secret 和 Region。3. 创建 Table Bucketossutil tables-api create-table-bucket --name {table bucket名称} --endpoint http://{endpint} --region {region}命令执行成功后返回结果中包含 Table Bucket ARN请记录该值。4. 创建 Namespaceossutil tables-api create-namespace --table-bucket-arn {Table Bucket ARN} --namespace {Namespace名称} --endpoint http://{endpint}重要Namespace 和 Table 名称不能包含连字符-可使用下划线_这是因为名称会用于 SQL 语句中的标识符。5. 创建 Table您可以选择以下任一方式创建 Iceberg 表通过其他计算引擎创建如 Spark。通过 ossutil 创建先将表 schema 保存为 JSON 文件再调用create-table。以下示例的 schema 文件schema.json定义了 3 个字段{ iceberg: { schema: { fields: [ {name: event_id, type: string, required: true}, {name: event_time, type: string}, {name: event_type, type: string} ] } } }基于 schema 文件创建 Tableossutil tables-api create-table --table-bucket-arn {bucketArn} --namespace {namespace名称} --name {表名称} --format ICEBERG --metadata file://{文件路径} --endpoint --endpoint http://{endpint}方式二使用AWS CLIOSS Tables 兼容 S3 Tables API也可以使用 AWS CLI 管理 Table Bucket。1. 安装 AWS CLIcurl https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip -o awscliv2.zip unzip awscliv2.zip sudo ./aws/install2. 配置凭证执行aws configure命令按提示输入 AccessKey ID、AccessKey Secret 和 Region。3. 创建 Table Bucketaws s3tables --endpoint http://{endpint} create-table-bucket --region {region} --name {table bucket名称}命令执行成功后返回结果中包含 Table Bucket ARN。4. 创建 Namespaceaws s3tables --endpoint http://{endpoint} create-namespace --table-bucket-arn {Table Bucket ARN} --namespace {namespace名称}5. 创建 Table通过其他计算引擎如 Spark创建表使用 AWS CLI 创建。使用 AWS CLI 时先将完整的入参保存为 JSON 文件create-table.json再调用create-table。{ tableBucketARN: {BucketArn}, namespace: {namespace名称}, name: {表明}, format: ICEBERG, metadata: { iceberg: { schema: { fields: [ {name: event_id, type: string,required: true}, {name: event_time, type: string}, {name: event_type, type: string} ] } } } }aws s3tables --endpoint http://{endpoint} create-table --cli-input-json file://{文件路径}6. 管理后台维护任务OSS Tables 支持自动执行 Iceberg 表的后台维护如文件清理、文件合并等通过 AWS CLI 可以查询和配置维护任务。查询 Table 维护任务状态aws s3tables get-table-maintenance-job-status \ --table-bucket-arn{bucketArn} \ --namespace{namespace名称} \ --name{表名}配置 Bucket 级维护策略文件清理aws s3tables put-table-bucket-maintenance-configuration \ --table-bucket-arn {tableArn} \ --type icebergUnreferencedFileRemoval \ --value {status:enabled,settings:{icebergUnreferencedFileRemoval:{unreferencedDays:4,nonCurrentDays:10}}}配置 Table 级维护策略小文件合并aws s3tables put-table-maintenance-configuration \ --table-bucket-arn {bucketArn} \ --type icebergCompaction \ --namespace {namespace名称} \ --name {表名} \步骤三配置Trino CatalogOSS Tables 提供 Iceberg REST Catalog 端点Trino 通过 Iceberg Connector 的 REST Catalog 模式连接。Endpoint格式如下内网https://{region}-internal.oss-tables.aliyuncs.com/iceberg外网https://{region}.oss-tables.aliyuncs.com/icebergOSS Tables 提供S3FileIO访问OSS数据面使用的访问端点Spark 通过该端点访问表数据。Endpoint格式如下内网https://oss-{region}-internal.aliyuncs.com外网https://oss-{region}.aliyuncs.com创建 Catalog 配置文件在 Trino 的etc/catalog/目录下创建配置文件例如oss_tables.propertiesconnector.nameiceberg iceberg.catalog.typerest iceberg.rest-catalog.urihttps://{region}-internal.oss-tables.aliyuncs.com/iceberg iceberg.rest-catalog.warehouseTable Bucket ARN iceberg.rest-catalog.securitySIGV4 iceberg.rest-catalog.signing-nameosstables iceberg.rest-catalog.view-endpoints-enabledfalse fs.hadoop.enabledfalse fs.native-s3.enabledtrue s3.endpointhttps://oss-{region}-internal.aliyuncs.com s3.regionRegion s3.aws-access-keyAccessKey ID s3.aws-secret-keyAccessKey Secret s3.path-style-accesstrue配置参数说明参数是否必填说明connector.name是固定为iceberg使用 Iceberg Connector。iceberg.catalog.type是固定为rest指定使用 REST Catalog。iceberg.rest-catalog.uri是REST Catalog 端点 URL。格式内网https://{region}-internal.oss-tables.aliyuncs.com/iceberg外网https://{region}.oss-tables.aliyuncs.com/icebergiceberg.rest-catalog.warehouse是Table Bucket ARN。格式acs:osstables:Region:阿里云账号ID:bucket/Table Bucket名称。iceberg.rest-catalog.security是固定为SIGV4启用 SigV4 签名认证。iceberg.rest-catalog.signing-name是固定为osstablesOSS Tables 服务的 SigV4 签名服务名。fs.native-s3.enabled是固定为true启用 Trino 原生 S3 文件系统替代 Hadoop 文件系统。fs.hadoop.enabled是固定为false禁用 Hadoop 文件系统。使用原生 S3 文件系统时必须关闭。s3.endpoint是OSS 数据面端点。格式内网https://oss-{region}-internal.aliyuncs.com外网https://oss-{region}.aliyuncs.coms3.path-style-access是固定为true使用 Path-Style 访问模式。步骤四使用SQL操作数据配置完成并重启 Trino 后您可以使用 Trino CLI 或 JDBC 客户端连接通过标准 SQL 操作 OSS Tables 中的数据。建表示例CREATE TABLE ${catalog}.${namespace}.orders ( order_id BIGINT, customer VARCHAR, amount DECIMAL(10,2), order_date DATE, created_at TIMESTAMP(6) ) WITH ( format PARQUET, partitioning ARRAY[day(order_date)], );查询示例SELECT * FROM ${catalog}.${namespace}.orders limit 10;权限配置使用 RAM 用户或 STS 临时凭证访问 OSS Tables 时需确保对应身份具备所需的操作权限。资源定义Table Bucket ARNacs:osstables:Region:阿里云账号ID:bucket/bucket_nameTable ARNacs:osstables:Region:阿里云账号ID:bucket/bucket_name/table/table_idAction 定义下表列出 OSS Tables 支持的 Action及其是否支持跨账号授权分类Action跨账号访问Table Bucket 级别oss:CreateTableBucket不允许oss:GetTableBucket允许oss:ListTableBuckets不允许oss:CreateNamespace允许oss:GetNamespace允许oss:ListNamespaces允许oss:DeleteNamespace允许oss:DeleteTableBucket允许oss:PutTableBucketPolicy不允许oss:GetTableBucketPolicy不允许oss:DeleteTableBucketPolicy不允许oss:GetTableBucketMaintenanceConfiguration允许oss:PutTableBucketMaintenanceConfiguration允许oss:PutTableBucketEncryption不允许oss:GetTableBucketEncryption不允许oss:DeleteTableBucketEncryption不允许Table 级别oss:GetTableMaintenanceConfiguration允许oss:PutTableMaintenanceConfiguration允许oss:PutTablePolicy不允许oss:GetTablePolicy不允许oss:DeleteTablePolicy不允许oss:CreateTable允许oss:GetTable允许oss:GetTableMetadataLocation允许oss:ListTables允许oss:RenameTable允许oss:UpdateTableMetadataLocation允许oss:GetTableData允许oss:PutTableData允许oss:GetTableEncryption不允许oss:PutTableEncryption不允许oss:DeleteTable允许Iceberg REST操作与权限映射下表列出 Iceberg REST Catalog 各操作所需的 OSS ActionIceberg REST 操作所需 OSS ActiongetConfigoss:GetTableBucketlistNamespacesoss:ListNamespacescreateNamespaceoss:CreateNamespaceloadNamespaceMetadataoss:GetNamespacedropNamespaceoss:DeleteNamespacelistTablesoss:ListTablescreateTableoss:CreateTable、oss:PutTableDataloadTableoss:GetTableMetadataLocation、oss:GetTableDataupdateTableoss:UpdateTableMetadataLocation、oss:PutTableData、oss:GetTableDatadropTableoss:DeleteTablerenameTableoss:RenameTabletableExistsoss:GetTablenamespaceExistsoss:GetNamespace
返回列表