Hudi 的索引机制和类型

14 篇文章 1 订阅

Hudi 的索引

Hudi 通过索引机制把 hoodie key (record key + 分区路径) 映射一个 file id 来提供高效的 Upsert 操作。record key 和数据文件的 group/file id 形成的映射关系从数据的第一个版本开始就不会改变了。简单来说,一条数据的所有版本都可以通过同一个 file id 找到。

对于 Copy-On-Write 的表来说,索引可以避免关联整张表来决定哪些文件需要重写,以加快 upsert/delete 的操作。

对于 Merge-On-Read 的表来说,索引可以限定 base 文件需要合并的数据条数,并且只需要对有更新的记录对应的 base 文件进行合并。

相反,如果没有索引机制的话(例如 Apache Hive ACID),需要所有的base 件合并 update/delete的数据,会造成很大的性能损失和资源占用。

在这里插入图片描述黄色代表更新文件,白色代表 base 文件,图片来源于官网

Hudi 索引的类型

Hudi 当前支持的索引类型:

  • Bloom 索引(默认):对 record key 创建布隆过滤器
  • Simple 索引:对update/delete 操作和存储中提取出来的key,执行轻量级的 join
  • HBase 索引 :通过外部的 HBase存储来管理索引

也可以通过扩展公开的 API 来实现个性化的索引。用户可以通过 hoodie.index.type 来配置索引的类型。

Global index 和 Non Global index

Global index(全局索引): Global index 要求保证 key 在表中所有分区的都是唯一的,保证一个给定的 record key 在表中只能找能唯一的一条数据。Global index 提供了强唯一性保证,但是随着表增大,update/delete 操作损失的性能越高,因此只适用于小表。

Non Global index(非全局索引):非全局索引只能保证数据在分区的唯一性。但是通过对 Hudi 索引的学习,不难了解到 key 与 file id 存在映射关系,同一个 key 的数据(包括 updete/delete)必然会存在同一个分区里面。这种实现方式提供更好的索引查找性能,适用于大表。

Bloom 索引 和 Simple 索引 支持 Global 和 Non Global 选项。
HBase 索引只支持 Global。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
Apache Flink 和 Apache Hudi 都是 Apache 软件基金会的开源项目,它们都是处理大规模数据的工具。Apache Flink 是一个分布式流处理引擎,而 Apache Hudi 是一个分布式数据湖,可以实现数据仓库中数据的更新、删除和插入。 要集成 Apache Flink 和 Apache Hudi,可以按照以下步骤进行操作: 1.下载 Apache Flink 和 Apache Hudi,将它们解压到本地文件夹。 2.启动 Apache Flink 集群。可以使用以下命令启动: ``` ./bin/start-cluster.sh ``` 3.启动 Apache Hudi。可以使用以下命令启动: ``` ./bin/start-hoodie.sh ``` 4.在代码中使用 Apache Flink 和 Apache Hudi。可以使用以下代码示例: ```java import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; import org.apache.flink.streaming.api.functions.source.SourceFunction; import org.apache.hudi.client.HoodieWriteClient; import org.apache.hudi.client.WriteStatus; import org.apache.hudi.client.common.HoodieFlinkEngineContext; import org.apache.hudi.client.common.HoodieSparkEngineContext; import org.apache.hudi.common.model.HoodieTableType; import org.apache.hudi.common.util.CommitUtils; import org.apache.hudi.common.util.ReflectionUtils; import org.apache.hudi.common.util.TypedProperties; import org.apache.hudi.common.util.ValidationUtils; import org.apache.hudi.flink.HoodieFlinkWriteConfiguration; import org.apache.hudi.flink.HoodieFlinkWriter; import org.apache.hudi.flink.HoodieFlinkWriterFactory; import org.apache.hudi.flink.source.StreamReadOperator; import org.apache.hudi.flink.utils.CollectSink; import org.apache.hudi.flink.utils.TestConfigurations; import org.apache.hudi.flink.utils.TestData; import org.apache.hudi.flink.utils.TestDataGenerator; import org.apache.hudi.streamer.FlinkStreamer; import org.apache.kafka.clients.consumer.ConsumerRecord; import java.util.List; import java.util.Properties; public class FlinkHudiIntegrationExample { public static void main(String[] args) throws Exception { // set up the streaming execution environment final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); env.setParallelism(1); // create a Kafka source SourceFunction<ConsumerRecord<String, String>> kafkaSource = KafkaSource.<String, String>builder() .setBootstrapServers("localhost:9092") .setTopics("test_topic") .build(); // create a Hudi sink TypedProperties properties = new TypedProperties(); properties.setProperty("hoodie.datasource.write.recordkey.field", "id"); properties.setProperty("hoodie.datasource.write.partitionpath.field", "ts"); properties.setProperty("hoodie.table.name", "test_table"); properties.setProperty("hoodie.table.type", HoodieTableType.COPY_ON_WRITE.name()); properties.setProperty("hoodie.datasource.write.keygenerator.class", ReflectionUtils.loadClass( "org.apache.hudi.keygen.SimpleKeyGenerator").getName()); properties.setProperty("hoodie.datasource.write.payload.class", ReflectionUtils.loadClass( "org.apache.hudi.example.data.SimpleJsonPayload").getName()); properties.setProperty("hoodie.datasource.write.hive_style_partitioning", "true"); HoodieFlinkWriteConfiguration writeConfig = HoodieFlinkWriteConfiguration.newBuilder() .withProperties(properties) .build(); HoodieFlinkWriter<ConsumerRecord<String, String>> hudiSink = HoodieFlinkWriterFactory.<ConsumerRecord<String, String>>newInstance() .writeConfig(writeConfig) .withEngineContext(new HoodieFlinkEngineContext(env)) .build(); // add the Kafka source and Hudi sink to the pipeline env.addSource(kafkaSource) .map(new StreamReadOperator()) .addSink(hudiSink); // execute the pipeline env.execute("Flink Hudi Integration Example"); } } ``` 这个代码示例展示了如何在 Apache Flink 中使用 Apache Hudi。它使用 Kafka 作为数据源,将数据写入到 Hudi 表中。 以上就是集成 Apache Flink 和 Apache Hudi 的步骤。需要注意的是,集成过程中可能会遇到一些问题,需要根据具体情况进行解决。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

修破立生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值