ARTICLE DETAIL

资讯详情

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

Hudi Trino 连接器测试表 hudi_trips_cow_v8 构建指南:Table Version 8 COW 表与 MDT 列统计实践

Hudi Trino 连接器测试表 hudi_trips_cow_v8 构建指南:Table Version 8 COW 表与 MDT 列统计实践 数据湖湖仓一体大数据数据存储【免费下载链接】hudiUpserts, Deletes And Incremental Processing on Big Data.项目地址https://gitcode.com/gh_mirrors/hud/hudi点击查看免费下载导读hudi_trips_cow_v8是 Hudi 仓库为 Trino 连接器hudi-trino模块准备的核心测试表资源一张基于 Hudi 1.0.2 生成的、Table Version 8 的非分区 Copy-on-WriteCOW表启用了元数据表MDT与列统计column stats索引并以单个大 Parquet 文件承载 40000 条出行trips记录。本文围绕该表的构建脚本hudi_trips_cow_v8.md展开讲清表的形态、Spark 创建脚本的每一个细节并结合hudi-trino测试框架中的加载逻辑与统计测试用例说明这张表如何在 Trino 侧验证投影下推、Parquet Reader 与基于统计的成本优化CBO。读完本文你将掌握如何复现这张测试表并理解它在 Trino Hudi 连接器测试体系中的定位。一、文档定位测试数据生成脚本而非使用手册该文档位于hudi-trino/src/test/resources/hudi-testing-data/目录与同名的hudi_trips_cow_v8.zip压缩包配对存在。从仓库的组织方式看这一目录下的每个*.md文件都对应一个同名的*.zipfixture如hudi_comprehensive_types_v8_mor.md/.zip、hudi_multi_fg_pt_v8_mor.md/.zip等其作用有二记录 fixture 的生成方式说明这张测试表当初是用什么版本、什么配置、什么脚本写出来的便于日后维护者按同样参数重放描述表结构特征用简短要点列出该表的形态作为测试用例选型的依据。因此本文的核心解读对象是文档正文中的Create script一节它直接给出了可复现的 Spark Scala 写入代码。二、表结构设计要点原文档用四条要点概括了这张表的形态这些要点决定了它在测试中的用途COW 表Table Version 8且启用了 MDT 与列统计表版本 8V8意味着使用了较新的 HoodieTableConfig 布局MDTMetadata Table启用后文件列表、列统计、分区统计等元数据统一存放在.hoodie/metadata目录中Trino 连接器查询时可直接读取 MDT 而无需全量列目录list files使用 Hudi 1.0.2 release 生成这是 fixture 的生成版本代表 V8 表格式在 1.0.x 系列下的典型形态非分区表写入时PARTITIONPATH_FIELD_OPT_KEY显式置为空字符串表内没有分区目录层级一个大 Parquet 文件40000 条记录集中写入单个数据文件专为测试投影projection与 Reader设计——单文件场景便于控制读取路径、验证列裁剪与 Parquet 页级读取行为。在测试框架侧ResourceHudiTablesInitializer.TestingTable枚举中为这张表登记了完整列定义ResourceHudiTablesInitializer.javaHudi 元数据列HUDI_META_COLUMNS_hoodie_commit_time、_hoodie_commit_seqno、_hoodie_record_key、_hoodie_partition_path、_hoodie_file_name业务列tripsRegularColumnsbegin_lat、begin_lon、driver、end_lat、end_lon、fare以上为 DOUBLE/STRING 混合、partitionpath、rider、uuidSTRING以及tsLONG。由于是非分区表该枚举没有为其注册分区列与分区路径加载时只创建一张 read-optimizedro表不创建实时rt表。三、创建脚本逐段解析原文档提供的 Spark Scala 脚本如下它是整个 fixture 的配方import scala.collection.JavaConversions._ import org.apache.spark.sql.SaveMode._ import org.apache.hudi.DataSourceReadOptions._ import org.apache.hudi.DataSourceWriteOptions._ import org.apache.hudi.common.table.HoodieTableConfig._ import org.apache.hudi.config.HoodieWriteConfig._ import org.apache.hudi.keygen.constant.KeyGeneratorOptions._ import org.apache.hudi.common.model.HoodieRecord import org.apache.hudi.QuickstartUtils._ import spark.implicits._ val tableName hudi_trips_cow_v8 val basePath file:///tmp/hudi_trips_cow_v8 val dataGen new DataGenerator val inserts convertToStringList(dataGen.generateInserts(40000)) val df spark.read.json(spark.sparkContext.parallelize(inserts, 1)) df.write.format(hudi). options(getQuickstartWriteConfigs). option(RECORDKEY_FIELD_OPT_KEY, uuid). option(PARTITIONPATH_FIELD_OPT_KEY, ). option(TABLE_NAME, tableName). mode(Overwrite). save(basePath)逐段解读如下1. 导入集合与数据源选项import scala.collection.JavaConversions._JavaConversions是 Scala 2.11/2.12 时代把 Java 集合隐式转换为 Scala 集合的辅助类配合QuickstartUtils返回的 JavaList使用在新版 Scala 中已被scala.jdk.CollectionConverters取代。DataSourceWriteOptions._提供写入端常量如RECORDKEY_FIELD_OPT_KEY、PARTITIONPATH_FIELD_OPT_KEY、TABLE_NAMEHoodieTableConfig._提供表配置键KeyGeneratorOptions._提供键生成器选项。2. 定义表名与路径val tableName hudi_trips_cow_v8 val basePath file:///tmp/hudi_trips_cow_v8表名与测试枚举HUDI_TRIPS_COW_V8的小写名一致getTableName()返回name().toLowerCase(Locale.ROOT)。路径使用本地文件系统便于在开发机上直接复现。3. 用 Quickstart 数据生成器产出 40000 条插入记录val dataGen new DataGenerator val inserts convertToStringList(dataGen.generateInserts(40000)) val df spark.read.json(spark.sparkContext.parallelize(inserts, 1))QuickstartUtils.DataGenerator是 Hudi 官方 quickstart 用的演示数据生成器产出 JSON 字符串格式的记录含uuid、driver、rider、fare、begin_lat、begin_lon、end_lat、end_lon、partitionpath、ts等字段。parallelize(inserts, 1)用单个分区并行化这批记录随后spark.read.json将其解析为 DataFrame——这保证了后续写入时数据紧凑最终落成单个大 Parquet 文件。4. 以 Overwrite 模式写入 Hudi COW 表df.write.format(hudi). options(getQuickstartWriteConfigs). option(RECORDKEY_FIELD_OPT_KEY, uuid). option(PARTITIONPATH_FIELD_OPT_KEY, ). option(TABLE_NAME, tableName). mode(Overwrite). save(basePath)getQuickstartWriteConfigs同样是QuickstartUtils提供的默认写配置集合包含预合并字段ts、索引类型、bulk insert 并行度等常用项RECORDKEY_FIELD_OPT_KEY uuid以uuid作为记录键PARTITIONPATH_FIELD_OPT_KEY 空分区路径即非分区表mode(Overwrite)覆盖写入保证 fixture 可重复生成。默认配置下 Hudi 会按 COW 表类型写入也可通过TABLE_TYPE_OPT_KEY显式指定COPY_ON_WRITE并启用元数据表与列统计索引——这与文档所述的MDT and column stats enabled相符。生成完毕后将该目录打包为hudi_trips_cow_v8.zip即为仓库中的 fixture。四、MDT 与列统计这张表新在哪里文档强调 V8 MDT column stats这并非无意义的修饰。对比同目录下以 V6 生成的表如hudi_comprehensive_types_v6_morV8 表的差异直接影响 Trino 连接器的读取路径。在 UncompactedMetadataHudiTablesInitializer.java 的类注释中仓库明确记录了这类 fixture 的边界像hudi_trips_cow_v8这样的 zip fixture 虽然 MDT 处于启用状态且未压缩uncompacted但它们早于 native-log 写入路径其 MDT 增量日志是#HUDI#block 格式日志承载HFILE_DATA_BLOCK连接器通过既有的 HFile content reader 即可读取而当下HUDI-19279 场景下新写入的 MDT 会产生整文件为 HFile 的*.log.hfile原生日志这才会命中getFileFormatUtils(HFILE)这条曾未实现的路径。也就是说hudi_trips_cow_v8覆盖的是MDT 旧式日志格式下连接器的正常读取而UncompactedMetadataHudiTablesInitializer动态生成的两张表hudi_uncompacted_mdt_pt_cow与损坏版hudi_corrupted_mdt_pt_cow则用于补齐原生 HFile 日志与MDT 读取失败时的降级路径两类场景。两者互为补充构成了 Trino 连接器对 MDT 读取的完整测试矩阵。从表结构设计还能看到一个刻意为之的细节该 initializer 在 commit 1 关闭 MDT、commit 2 起开启 MDT目的是让 MDT bootstrap 面对已有数据而非空表——空表 bootstrap 会让列统计索引定义注册为空字段列表永久性禁用基于统计的剪枝对应 HUDI-8801 的 Java client 缺陷。这说明测试表何时启用 MDT 不是随意的而是直接决定列统计索引能否被连接器canApply()采纳。五、在 Trino 测试框架中的加载与使用5.1 资源加载链路测试运行时ResourceHudiTablesInitializer.initializeTables()ResourceHudiTablesInitializer.java会执行以下步骤通过HudiTableUnzipper.unzipAllItemsInResource(hudi-testing-data, tempDir)把hudi-testing-data目录下的所有 zip fixture 解压到临时目录用 Trino 的TrinoFileSystem将解压结果整体拷贝到测试外部位置跳过.crc校验文件避免 Hudi 读侧报错并对每个文件做 SHA-256 哈希比对防止拷贝损坏遍历TestingTable.values()枚举为每张表向测试内置的 Hive Metastore 注册外部表EXTERNAL_TABLE存储格式为 Parquet SerDe HUDI_PARQUET_INPUT_FORMAT非分区表无需注册分区通过HoodieTableMetaClient读取表配置把实际表版本写回枚举供测试用例断言。5.2 这张表被哪些测试使用在 TestHudiSmokeTest.java 中HUDI_TRIPS_COW_V8至少承担两类验证基础查询正确性约 L212-L216SELECT count(*)与SELECT driver, count(*) ... group by 1验证 40000 行全量扫描与分组聚合结果正确——这是 COW 表读路径的冒烟级校验。基于 MDT 的表统计与 CBO 决策testTableStatistics约 L339-L386Language(SQL) String query EXPLAIN (FORMAT JSON) SELECT t1.uuid, t1.driver, t1.fare, t1.ts FROM HUDI_TRIPS_COW_V8 t1 INNER JOIN HUDI_TRIPS_COW_V8 t2 ON t1.uuid t2.uuid WHERE t2.ts 0;该用例以布尔参数tableStatisticsEnabled分别运行两次开启统计时异步表统计首次触发后第二次 EXPLAIN 中 ScanFilterProject 节点的outputRowCount应等于40000.0正是 fixture 的记录数、outputSizeInBytes大于 20000 字节由于两侧都是 4 万行优化器将 inner join 的分布类型选为REPLICATED关闭统计时outputRowCount与outputSizeInBytes均为NaNjoin 分布退回PARTITIONED。由此可以推断这张表的 40000 行规模与列统计索引是表统计驱动 join 策略测试的定量前提——行数估计必须精确命中 40000才能让优化器做出可断言的 REPLICATED 决策。六、如何在本地复现该 fixture如果你需要在本地重建同样的测试数据例如验证新生成的 zip 是否与脚本一致可按下述步骤操作准备 Spark与 Hudi 1.0.2 兼容的 Spark 2.11/2.12 环境与 hudi-spark bundle确保org.apache.hudi.QuickstartUtils在 classpath 中在spark-shell中按上文脚本逐行执行或将其整理为 Scala 文件以spark-submit运行检查输出目录/tmp/hudi_trips_cow_v8下应只有一个数据 Parquet 文件可先查看df.rdd.getNumPartitions确认并行度配置、存在.hoodie目录内含hoodie.properties、时间线 instant 与metadata目录通过hoodie.properties核对hoodie.table.version8、hoodie.metadata.enabletrue、hoodie.metadata.index.column.stats.enabletrue等关键项将整个目录打包为hudi_trips_cow_v8.zip保持表目录位于 zip 根下替换或新增到hudi-trino/src/test/resources/hudi-testing-data/中即可被ResourceHudiTablesInitializer自动加载。注意事项fixture 与测试强绑定测试用例对行数40000、列结构如tripsRegularColumns有硬编码断言修改生成脚本后必须同步更新 ResourceHudiTablesInitializer.java 中对应枚举的列定义与 TestHudiSmokeTest.java 中的期望值分区一致性非分区表的枚举定义里不能带分区列否则 Metastore 注册会与数据目录形态不一致MDT 版本差异若用新版 Hudi 重新生成MDT 日志会变成整文件原生 HFile*.log.hfile格式届时这张表就从旧式 block 日志覆盖变成原生 HFile 覆盖——需要对照 UncompactedMetadataHudiTablesInitializer.java 的说明重新评估其覆盖语义。七、小结hudi_trips_cow_v8是 Trino Hudi 连接器测试数据体系中的一张定标表它以 V8 COW 启用 MDT/列统计 单大 Parquet 40000 行的精确组合同时支撑了读路径冒烟测试与基于统计的 CBO 行为验证。其生成脚本hudi_trips_cow_v8.md简洁可复现而加载与断言逻辑ResourceHudiTablesInitializer.java、TestHudiSmokeTest.java则展示了测试 fixture 与连接器实现之间层层咬合的关系。理解这张表也就理解了 Trino Hudi 连接器如何针对特定表格式特征构造测试样本的整体方法论。赞分享数据湖湖仓一体大数据数据存储【免费下载链接】hudiUpserts, Deletes And Incremental Processing on Big Data.项目地址https://gitcode.com/gh_mirrors/hud/hudi点击查看免费下载相关推荐Trino Hudi 连接器测试资源生成指南基于 PTL 环境重建非分区 COW 测试表 hudi_non_part_cowTrino Hudi 连接器测试资源生成指南基于 PTL 环境重建非分区 COW 测试表 hudi_non_part_cow 本文档对应仓库 hudi tri数据湖湖仓一体大数据数据存储Apache Hudi 非分区 MOR 测试表生成指南基于 hudi_non_part_mor 的 Trino 连接器测试实践Apache Hudi 非分区 MOR 测试表生成指南基于 hudi_non_part_mor 的 Trino 连接器测试实践 本文以 Hudi 仓库中 hu数据湖湖仓一体大数据数据存储Hudi 字段名含大写字母的 COW 分区表Spark 建表脚本与 Trino 大小写列名兼容实践Hudi 字段名含大写字母的 COW 分区表Spark 建表脚本与 Trino 大小写列名兼容实践 导读 本篇文章围绕 Hudi 官方测试数据生成脚本 hud数据湖湖仓一体大数据数据存储上一篇如何高效实现数据可视化ECharts多图表组合实战深度解析下一篇RPA-Python与Plume集成去中心化博客自动化终极指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表