Metadata Table
- 什么是Metadata表
Metadata表即Hudi元数据表,是一种特殊的Hudi表,对用户隐藏。该表用于存放普通Hudi表的元数据信息。
Metadata表包含在普通Hudi表内部,与Hudi表是一一对应关系。
- 为什么引入Metadata表
HDFS的list海量表分区文件是非常耗费rpc请求,很容易导致HDFS的吞吐量下降,影响性能,这对于OBS等对象存储问题更严重。而查询引擎在查询之前必须要经历上述步骤。
当前分区表的分区信息一般存放在Hive Metastore里面。当分区表的分区大到一定程度,查询引擎查询当前表分区信息时性能会严重下降。
- Metadata表是如何解决这些问题的
Metadata表把当前Hudi表的分区信息,以及分区目录下的文件信息作为元数据信息,存储在一张特殊的Hudi表里面,这样当查询引擎需要list表分区文件时只需要访问这张特殊的表即可,由于元数据信息数据量本身不大,所以查询起来可以大大降低HDFS的rpc压力。
Metadata表的实现使用了Hudi MOR表,这意味着和其他任何Hudi表一样,可以被压缩(Compaction)、清理(Clean)、增量更新(incrementally updated)。 而且与其他项目中的类似实现不同,我们选择将文件列表等信息索引为HFile格式(格式可插拔),HFile提供了很好的点查性能,可以高效获取分区文件列表等信息。
- 如何使用Metadata表
Hive查询时执行:set hoodie.metadata.enable=true
SparkSql查询时在启动SparkSql时指定:--conf spark.hadoop.hoodie.metadata.enable=true
Spark写入时直接在option参数里面指定“hoodie.metadata.enable”值为“true”。
更多参数请参考配置参考或Hudi官网:http://hudi.apache.org/docs/configurations.html#metadata-config。
- Metadata表性能提升
测试有25万个分区文件的表,Metadata表相比使用Spark并发Listing要快2~3倍。
- 禁止用户手动操作Metadata表,影响数据安全。
- 启用Metadata,必须在每次写入操作中均开启Metadata,保证数据查询完整。
- Hudi 0.8版本对表执行Compaction、Rollback,不支持同步到metadata表。
- Clean同时启用Metadata能更新Metadata表。
- Metadata表支持在commit数达到一定值后,自动触发compaction、clean、archive,所以1并无必要。