ARTICLE DETAIL

资讯详情

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

Trino Hudi 连接器测试资源生成指南:基于 PTL 环境重建非分区 COW 测试表 hudi_non_part_cow

Trino Hudi 连接器测试资源生成指南:基于 PTL 环境重建非分区 COW 测试表 hudi_non_part_cow 数据湖湖仓一体大数据数据存储【免费下载链接】hudiUpserts, Deletes And Incremental Processing on Big Data.项目地址https://gitcode.com/gh_mirrors/hud/hudi点击查看免费下载本文档对应仓库 hudi-trino/src/test/resources/hudi-testing-data/hudi_non_part_cow.md完整讲解如何在 PTLPresto/Trino Local Testing单节点 Hudi 环境中通过spark-sql重建非分区 Copy-On-WriteCOW测试表hudi_non_part_cow并从 MinIO 下载、打包为测试资源.zip供 Trino Hudi 连接器测试套件复用。读完本文你将掌握该测试资源的完整再生流程、每个关键配置项type、primaryKey、preCombineField的真实作用以及该资源在ResourceHudiTablesInitializer与TestHudiSmokeTest中如何被加载与校验。一、为什么需要重建 hudi_non_part_cow 测试资源Trino Hudi 连接器本仓库hudi-trino模块的测试套件并不依赖真实部署的 Hudi 集群而是将预生成的 Hudi 表数据打包成 zip 资源存放在测试目录中运行时由ResourceHudiTablesInitializer解压并注册到测试元数据里。hudi_non_part_cow就是其中之一它代表一种最基础的 Hudi 表形态非分区Non-Partitioned Copy-On-Write 存储类型用于覆盖连接器最核心的读路径。与它配套的资源文件为 hudi_non_part_cow.zip而 hudi_non_part_cow.md 则是这份二进制资源再生的说明书。根据文档说明该资源使用Trino 423 版本环境生成因此在升级连接器版本、调整数据形态或需要定制数据内容时都需要按本文流程重新生成。整个测试目录中还包含大量同类资源hudi_non_part_mor.md、hudi_multi_pt_v8_mor.md、hudi_trips_cow_v8.md 等它们共同覆盖了分区/非分区、COW/MOR、不同 Hudi 表版本、复杂类型等测试面hudi_non_part_cow在其中扮演最小可读样例的角色。二、前置准备启动 Hudi 单节点环境生成资源的第一步是在终端启动 PTL 提供的 Hudi 单节点环境。PTLPresto Local Testing是 Trino 社区用于本地起测试环境的工具集singlenode-hudi环境会一次性拉起 Hudi 写侧所需的组件包括 Spark、MinIOS3 兼容对象存储、Hive Metastore 等。testing/bin/ptl env up --environment singlenode-hudi执行成功后环境中应包含ptl-spark容器用于运行spark-sql执行建表与数据写入MinIO地址为http://localhost:9001用于存放s3://test-bucket/...下的表数据并可通过其 Web UI 浏览和下载。说明testing/bin/ptl env up中的testing目录属于 PTL 工具自身的工作目录并非本仓库内路径--environment singlenode-hudi对应 PTL 预置的 Hudi 单节点环境定义。请以本机实际安装的 PTL 版本为准。三、生成数据spark-sql 建表并插入两行记录3.1 进入 spark-sql 终端打开ptl-spark容器启动spark-sqlshell# 在 ptl-spark 容器内 spark-sql3.2 创建非分区 COW 表在spark-sql终端依次执行以下 SQL与文档中的语句完全一致spark-sql CREATE TABLE default.hudi_non_part_cow ( id bigint, name string, ts bigint, dt string, hh string ) USING hudi TBLPROPERTIES ( type cow, primaryKey id, preCombineField ts ) LOCATION s3://test-bucket/hudi_non_part_cow;逐项解读这张表的配置配置/元素值含义表名default.hudi_non_part_cow位于defaultschema 下的测试表列定义id bigint, name string, ts bigint, dt string, hh string与测试枚举中定义完全一致见下文第四节USING hudi—声明由 Hudi 数据源管理type cowcowCopy-On-Write写入时直接把新数据合并重写为新的 Parquet base file读时无需合并 log 文件是 Hudi 最直观的存储类型primaryKey idid记录主键用于去重与 upsert 定位preCombineField tstspre-combine 字段同一主键出现多条记录时按该字段取值决定哪条胜出LOCATIONs3://test-bucket/hudi_non_part_cow表数据落在 MinIO 的test-bucket桶下特别注意CREATE TABLE 语句中没有PARTITIONED BY子句这正是非分区表的关键——所有数据直接写入表根目录而不像分区表那样生成dt.../hh...这样的分区目录。从源码侧也可以印证测试枚举 ResourceHudiTablesInitializer.java 中HUDI_NON_PART_COW(nonPartitionRegularColumns())使用的构造器是TestingTable(ListColumn regularColumns)分区列为空、分区映射为空、不创建 RT 表其列定义第 443-451 行与上述 SQL 完全一一对应private static ListColumn nonPartitionRegularColumns() { return ImmutableList.of( column(id, HIVE_LONG), column(name, HIVE_STRING), column(ts, HIVE_LONG), column(dt, HIVE_STRING), column(hh, HIVE_STRING)); }3.3 插入测试数据spark-sql INSERT INTO default.hudi_non_part_cow (id, name, ts, dt, hh) VALUES (1, a1, 1000, 2021-12-09, 10), (2, a2, 2000, 2021-12-09, 11);这次插入会产生一次 Hudi commit写入一个 Parquet base file。表内最终只有两行数据idnametsdthh1a110002021-12-09102a220002021-12-0911这两行数据并非随意选取——测试 TestHudiSmokeTest.java 中的testReadNonPartitionedTable正是以它们为期望值做全表读取校验Test public void testReadNonPartitionedTable() { assertQuery( SELECT id, name FROM HUDI_NON_PART_COW, SELECT * FROM VALUES (1, a1), (2, a2)); }3.4 非分区语义的测试验证由于hudi_non_part_cow没有分区列连接器不应暴露$partition伪列。同一测试类中的 testPartitionColumn 专门验证了这一点assertQueryFails(SELECT \$partition\ FROM HUDI_NON_PART_COW, .* Column \\$partition cannot be resolved);即对非分区表查询$partition列会报错分区表hudi_cow_pt_tbl则能正常返回dt2021-12-09/hh10这样的分区路径。此外该表还广泛用于分区表 JOIN 场景的对照TestHudiSmokeTest.java例如在强制分区过滤partition_filter_required会话设置下用非分区表验证分区谓词缺失/存在时的报错与放行行为是非分区语义回归测试的核心底座。四、下载资源并从 zip 整理出测试目录数据写入 MinIO 后通过 MinIO 客户端 Web UI 下载整张表http://localhost:9001/buckets/test-bucket/browse在test-bucket桶中找到hudi_non_part_cow目录并下载得到hudi_non_part_cow.zip。接下来解压并清理解压hudi_non_part_cow.zip删除解压后多余的杂项文件仅保留 Hudi 表数据本身.hoodie元数据目录 Parquet 数据文件使资源目录干净、可被测试框架直接使用。这一步的清理要求并非随意——从测试框架源码看ResourceHudiTablesInitializer的解压与拷贝逻辑对文件有明确约束。其成员copyDirResourceHudiTablesInitializer.java在拷贝资源时会显式跳过.crc校验文件注释明确写道 hudi blows up if crc files are presentHudi 在存在 crc 文件时会报错// hudi blows up if crc files are present if (path.toString().endsWith(.crc)) { continue; }同时拷贝过程对每个文件计算 SHA-256 哈希并回读校验确保解压/传输不产生静默损坏。因此你在整理 zip 时也应当一并移除.crc之类的隐藏校验文件避免污染测试资源。五、测试资源如何被自动加载源码级闭环生成的hudi_non_part_cow目录连同 zip 中其他表目录进入仓库的 hudi-testing-data 后测试运行期由以下链条自动装配解压HudiTableUnzipper.unzipAllItemsInResource(hudi-testing-data, tempDir)将测试目录下所有 zip 资源解压到独立临时目录HudiTableUnzipper.java拷贝ResourceHudiTablesInitializer通过TrinoFileSystem把解压出的目录整体拷贝到测试用的外部存储并做哈希校验、跳过.crc、完成后清理临时文件ResourceHudiTablesInitializer.java注册元数据按TestingTable枚举逐表向 Hive Metastore 注册外部表含_hoodie_commit_time等 5 个 Hudi 元数据列 业务列见 ResourceHudiTablesInitializer.javahudi_non_part_cow无分区因此分区列为空也不额外创建_rt实时表读取表版本通过HoodieTableMetaClient读取每张表的HoodieTableVersion供后续按版本区分能力的测试使用如 Secondary Index 仅在表版本 ≥ 8 时生效。正因如此即使你本地没有部署任何 Hudi/Hadoop 集群只要重新生成并替换 zip 资源TestHudiSmokeTest等测试就能在纯测试环境HudiQueryRunner中完成对非分区 COW 表的读取、伪列、JOIN 等全链路验证。六、对照非分区 MOR 表的另一种生成方式同目录的 hudi_non_part_mor.md 展示了生成非分区 MOR 表的另一种路径——不依赖 PTL 与 spark-sql而是本地下载 Spark 3.3~3.5 后用 spark-shell DataFrame API直接写file:///tmp/hudi_non_part_mor再上传为资源。其核心配置可作为 COW 表的对照df.write() .format(hudi) .mode(Append) .option(hoodie.table.name, hudi_non_part_mor) .option(hoodie.datasource.write.table.type, MERGE_ON_READ) .option(hoodie.datasource.write.recordkey.field, id) .option(hoodie.datasource.write.operation, bulk_insert) .option(hoodie.metadata.index.column.stats.enable, true) .save(basePath)两者对比可清晰看到 Hudi 表类型与生成方式的差异维度hudi_non_part_cowhudi_non_part_mor表类型type cowSQL 方式hoodie.datasource.write.table.type MERGE_ON_READAPI 方式生成工具PTL 环境 spark-sql本地 Spark spark-shell数据落点s3://test-bucket/...MinIOfile:///tmp/...本地文件系统主键/预合并primaryKey id,preCombineField tshoodie.datasource.write.recordkey.field id测试用途非分区 COW 基础读路径非分区 MOR 的 RO/RT 双表读取与列统计索引文件跳过这种COW 用 spark-sql PTL、MOR 用 spark-shell API的分工也说明生成方式不唯一核心目标是产出一份结构正确、可被ResourceHudiTablesInitializer直接消费的表数据。你可以根据手头环境选择最顺手的一条路径。七、常见注意事项版本一致性文档明确标注该资源使用 Trino 423 生成。Hudi 表版本如 V6/V8会影响部分索引与剪枝能力重新生成时请确认与你验证的 Trino/Hudi 版本匹配避免出现资源结构与测试断言不符的假失败。数据内容不可随意变更hudi_non_part_cow中(1,a1)、(2,a2)两行是多个测试全表读取、JOIN 对照的期望值若自定义数据须同步修改 TestHudiSmokeTest.java 中对应的assertQuery断言。清理杂项文件解压后务必移除.crc等多余文件否则测试初始化时copyDir会跳过它们表现尚可容忍但若这些文件进入.hoodie元数据目录则可能触发 Hudi 读侧报错。桶与路径LOCATION s3://test-bucket/hudi_non_part_cow中桶名test-bucket、目录名hudi_non_part_cow均与 zip 资源目录名对应下载时请保持该目录层级结构不变。资源与文档同步更新md文件本身就是再生日志若你使用了不同版本的 Trino 或调整了建表语句建议同步更新 hudi_non_part_cow.md 中的命令方便后续维护者复现。八、总结hudi_non_part_cow是 Trino Hudi 连接器测试矩阵中非分区 COW这一基础组合的标准样例。通过ptl env up --environment singlenode-hudi拉起环境、用spark-sql建表插入两行数据、再从 MinIO 下载打包即可完整复现这一测试资源。它与测试框架源码形成了严密的对应关系列定义一一映射到TestingTable.HUDI_NON_PART_COW枚举数据内容被testReadNonPartitionedTable直接断言非分区语义被testPartitionColumn反向验证。掌握这套生成 → 下载 → 清理 → 替换资源的闭环是定制与维护 Trino Hudi 连接器测试数据的基础能力。延伸阅读仓库内路径测试资源目录hudi-trino/src/test/resources/hudi-testing-data资源初始化器ResourceHudiTablesInitializer.java解压工具HudiTableUnzipper.java冒烟测试非分区读、$partition 校验、JOIN 对照TestHudiSmokeTest.java非分区 MOR 资源说明hudi_non_part_mor.md赞分享数据湖湖仓一体大数据数据存储【免费下载链接】hudiUpserts, Deletes And Incremental Processing on Big Data.项目地址https://gitcode.com/gh_mirrors/hud/hudi点击查看免费下载相关推荐DataHub Redshift 元数据采集实战指南从权限配置、Lineage 到 Usage 与 ProfilingDataHub Redshift 元数据采集实战指南从权限配置、Lineage 到 Usage 与 Profiling 导读 本文以 DataHub 官方 R数据湖湖仓一体大数据数据存储Hudi 多分区字段 MOR 表的 Spark SQL 建表与 Trino 分区裁剪实战基于 hudi-trino 测试数据集Hudi 多分区字段 MOR 表的 Spark SQL 建表与 Trino 分区裁剪实战基于 hudi trino 测试数据集 导读 本文以 Apache数据湖湖仓一体大数据数据存储Apache Hudi hudi-trino 连接器完全指南RFC-105 架构、JDK 25 构建、测试与端到端集成实战Apache Hudi hudi trino 连接器完全指南RFC 105 架构、JDK 25 构建、测试与端到端集成实战 本篇指南围绕当前仓库中的 hudi数据湖湖仓一体大数据数据存储上一篇OptiScaler技术架构深度解析跨GPU超分辨率与帧生成桥接实现机制下一篇智能渲染优化跨GPU超分辨率与帧生成桥接的突破性方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表