更新时间:2022-12-14 GMT+08:00

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倍。

    1. 禁止用户手动操作Metadata表,影响数据安全。
    2. 启用Metadata,必须在每次写入操作中均开启Metadata,保证数据查询完整。
    3. Hudi 0.8版本对表执行Compaction、Rollback,不支持同步到metadata表。
    4. Clean同时启用Metadata能更新Metadata表。
    5. Metadata表支持在commit数达到一定值后,自动触发compaction、clean、archive,所以1并无必要。