hudi系列-数据写入方式及使用场景

本文介绍了Hudi支持的四种数据写入方式:upsert、insert、bulk_insert和bootstrap。upsert是Hudi的默认写入方式,适合需要保留变更数据的场景;insert适用于append-only数据;bulk_insert用于快速导入历史数据,不进行去重;bootstrap用于重建索引,确保全量数据去重。文中还讨论了不同写入方式对小文件优化和数据去重的影响,并提到了在Flink中应用Hudi的场景。

hudi支持多种数据写入方式:insert、bulk_insert、upsert、boostrap,我们可以根据数据本身属性(append-only或upsert)来选择insert和upsert方式,同时也支持对历史数据的高效同步并嫁接到实时流程。

这里的使用技术组合为flink + hudi-0.11

upsert

这是hudi默认的写入方式,是包含了INSERT和UPDATE两种操作,如何区分两种操作?在数据写入之前会进行一个"tag"过程,即通过查找索引来确定记录的位置,如果是UPDATE操作,那么我们会得到记录的旧位置,否则将会为INSERT的记录分配一个新位置,"相同"的记录被组织在一起,还能进行小文件方面的优化。这种写入方式适合数据会更新(不会重复)而且需要保留变更数据的场景(Changelog Mode),结合flink进行近实时流式计算。

insert

单纯的插入操作,由于不需要判断记录是否属于更新,因此省略了"tag"过程,速度会比upsert快得多,但是不能保证数据是去重的,对于append-only的数据(日志、行为)很适合使用这种方式

  • MOR表:采用的小文件优化策略与upsert一样,就是少维护了基于flink状态的全局索引
  • COW表:每次写都会直接生成新的parquet文件,写过程并不会进行小文件优化,但可以通过clustering进行来重新调整。

<think>好的,我需要回答用户关于Apache Hudi写入方式及实现方法的问题。首先,我得回顾一下Hudi的基本概念。Hudi支持两种表类型:Copy on Write(COW)和Merge on Read(MOR)。这两种类型在写入时处理数据方式不同,COW在写入时直接合并数据,生成新版本的文件,而MOR则是将更新写入日志文件,查询时才合并,适合频繁更新的场景。 接下来,用户可能想知道具体的写入实现方法。根据引用内容,用户提到了使用Flink和Hudi结合的例子,比如创建表的SQL语句。我需要参考这些例子,说明如何通过Flink SQL或者DataStream API进行写入。例如,创建表时需要指定connector为hudi,path指向HDFS路径,并设置表类型等参数。 另外,Hudi写入操作包括插入、更新和删除。需要解释这些操作在COW和MOR下的不同处理方式。比如,COW的更新会重写整个文件,而MOR则追加日志。删除操作可能通过标记记录或物理删除来实现,具体取决于配置。 用户提供的引用中提到了Hudi支持Flink,但用户可能还不熟悉Flink,所以需要简明地说明如何使用Flink进行写入。例如,通过Flink SQL创建表并插入数据,或者使用DataStream API构建管道。同时,要注意到流式写入的配置,如check-interval和streaming enabled参数。 此外,Hudi写入优化方法也是用户可能关心的点,比如小文件合并、索引机制(如布隆索引、HBase索引)来加速更新操作,以及如何通过调整参数来优化写入性能。例如,调整commit间隔、文件大小等。 还要考虑到不同数据场景下的应用,比如增量处理、近实时分析,这些场景下如何选择合适的写入方式和配置。例如,MOR适合需要低延迟更新的场景,而COW适合读多写少的场景。 最后,确保回答结构清晰,分点说明写入方式、实现步骤、代码示例以及相关优化方法。同时,根据引用中的示例代码,提供一个具体的Flink SQL示例,帮助用户理解实际操作步骤。需要验证LaTeX格式是否正确,数学公式用$包裹,独立公式用$$,并检查引用标识是否正确添加。</think>Apache Hudi表的写入方式及实现方法可分为以下核心要点: --- ### 一、Hudi表类型与写入模式 1. **Copy on Write (COW)** - 直接覆盖数据文件,每次更新生成新文件版本 - 适合**低频更新、高频查询**场景 - 示例配置: ```sql 'table.type' = 'COPY_ON_WRITE', 'write.operation' = 'upsert' ``` 2. **Merge on Read (MOR)** - 将更新写入日志文件(Log Files),查询时动态合并 - 支持**近实时写入**,延迟可低至5-10分钟[^2] - 示例配置: ```sql 'table.type' = 'MERGE_ON_READ', 'read.streaming.enabled' = 'true' ``` --- ### 二、写入实现方法 #### 1. **Flink SQL写入(参考引用[1][2])** ```sql CREATE TABLE hudi_table( id INT PRIMARY KEY, name STRING, dt STRING ) PARTITIONED BY (dt) WITH ( 'connector' = 'hudi', 'path' = 'hdfs:///path/to/hudi_table', 'table.type' = 'MERGE_ON_READ', -- 或 COPY_ON_WRITE 'write.tasks' = '4', 'compaction.tasks' = '2' ); INSERT INTO hudi_table SELECT * FROM source_table; ``` #### 2. **DataStream API写入** ```java Configuration conf = new Configuration(); conf.setString(FlinkOptions.PATH, "hdfs:///hudi/path"); conf.setString(FlinkOptions.TABLE_TYPE, MERGE_ON_READ.name()); StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); DataStream<HoodieRecord> dataStream = env.addSource(...); HoodiePipeline.Builder pipeline = HoodiePipeline.builder("tableName") .column("id").primaryKey() .column("name") .column("dt").partitionKey(); dataStream.sinkTo(HoodieSink.of(pipeline, conf)); ``` --- ### 三、关键写入操作 1. **Upsert(插入/更新)** - 自动检测记录是否存在(通过主键) - COW模式:重写整个Parquet文件 - MOR模式:追加到日志文件 2. **Insert Overwrite** ```sql SET execution.checkpointing.interval = 3min; INSERT OVERWRITE hudi_table SELECT ...; ``` 3. **删除操作** - 软删除:标记`_hoodie_is_deleted`字段 - 硬删除:通过`DELETE`操作物理移除记录 --- ### 四、优化策略 1. **小文件合并** 设置`compaction.async.enabled=true`自动合并日志文件[^3] 2. **索引优化** - 布隆索引:默认配置,适合主键离散场景 - 全局索引:`index.global.enabled=true`避免跨分区重复 3. **写入参数调优** ```properties write.batch.size=2000000 // 批次大小 write.rate.limit=500000 // 限流 write.parquet.max.file.size=128MB // 文件大小控制 ``` --- ### 五、应用场景对比 | 场景 | COW适用性 | MOR适用性 | |---------------------|-----------|-----------| | 实时数据湖 | ★★☆ | ★★★ | | 批量ETL | ★★★ | ★★☆ | | 频繁更新(如CDC) | ★☆☆ | ★★★ | ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值