聊一聊Flink 写 Hive 的小文件问题

本文探讨了Flink 1.11及后续版本写入Hive时可能出现的小文件问题,分析了'sink.shuffle-by-partition.enable'参数对文件生成的影响,并提供了减少小文件的策略,包括设置该参数为true、使用Flink 1.12的小文件合并功能、调整checkpoint周期以及定期合并小文件。
摘要由CSDN通过智能技术生成

背景

Flink 1.11 引入了写Hive的功能后,已经在上线了一段时间。下面就聊聊我自己对Flink 写Hive 小文件的一些问题和看法。

 

问题1:

1.Flink 写 Hive 可能会产生小文件吗?

简单的说,答案是会。

简单总结下Flink 读kafka写Hive的流程

1.Flink 将kafka数据根据设置的分区策略,实时写入对应分区hdfs 目录的临时文件  inprogress,如下图所示。

在inprogress文件的数据,通过hive是无法查询到的。

2.打checkpoint时,将inprogress文件的数据刷到正式文件中,并提交kafka offset。

 

这里有一个关键的点:Flink中一个写hive的并行度,同一时间只能写一个hdfs文件

那么就有一个问题,如果我设置3个并行度,一个checkpoint周期是不是会生成3个文件呢?

这里有一个关键的参数:'sink.shuffle-by-partition.enable'

以上图hive表为例,一级分区为年月日,二级分区为小时,按照数据的event时间分区。

 

'sink.shuffle-by-partition.enable'=f

当使用 Flink Hive 表时,如果元数据没有及时更新,导致数据无法查到,可以尝试以下几个解决方案: 1. 手动刷新 Hive 元数据:在 Flink 入数据到 Hive 表后,可以手动执行 Hive 的 `MSCK REPAIR TABLE` 命令来刷新表的元数据。这个命令会检查表的分区信息,并将新添加的分区添加到 Hive 的元数据中。例如,在 Hive 命令行中执行以下命令来刷新表的元数据: ```sql MSCK REPAIR TABLE your_table; ``` 2. 配置表的自动刷新:可以在 Hive 表的属性中配置自动刷新元数据的设置。在创建表或者修改表结构时,可以添加 `tblproperties('auto.purge'='true')` 属性,这样 Hive 会自动刷新元数据。例如: ```sql CREATE TABLE your_table ( -- 表的列定义 ) STORED AS PARQUET LOCATION '/path/to/table' TBLPROPERTIES ( 'auto.purge' = 'true' ); ``` 3. 使用外部表:如果你希望 Flink 入的数据能够立即被查询到,可以考虑使用 Hive 的外部表。外部表将数据存储在外部文件系统中,并通过 Hive 表进行管理。当 Flink 入数据到外部表时,数据会直接入到外部文件系统,而不会影响 Hive 的元数据信息。这样可以确保入的数据可以立即被查询到。创建外部表的方式如下: ```sql CREATE EXTERNAL TABLE your_table ( -- 表的列定义 ) STORED AS PARQUET LOCATION '/path/to/table'; ``` 需要注意的是,外部表需要手动管理数据的一致性和清理,因为 Hive 不会自动删除外部表的数据。 4. 使用 HiveCatalog:如果你正在使用 FlinkHiveCatalog 连接器连接 Hive,可以尝试在入数据后,调用 `catalog.refreshTable()` 方法来手动刷新 Hive 表的元数据。例如: ```java HiveCatalog hiveCatalog = ... // 初始化 HiveCatalog TableEnvironment tableEnv = ... // 初始化 TableEnvironment // Flink 入数据到 Hive 表 ... // 刷新 Hive 表的元数据 tableEnv.getCatalog(hiveCatalog.getName()).ifPresent(catalog -> { try { catalog.refreshTable(new ObjectPath("your_database", "your_table")); } catch (Exception e) { // 异常处理 } }); ``` 通过以上方法,你可以手动刷新 Hive 表的元数据,确保入的数据能够立即被查询到。根据具体情况选择适合的解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值