hive merge file

本文探讨了在使用Hive处理数据时,通过合理设置Map输入合并和输出合并参数,来优化小文件处理过程,减少资源浪费和避免内存溢出的问题。介绍了如何设置关键参数以实现Map前端的小文件合并,以及在任务结束后如何合并输出文件,以提高任务执行效率。

当Hive输入由很多个小文件组成,由于每个小文件都会启动一个map任务,如果文件过小,以至于map任务启动和初始化的时间大于逻辑处理的时间,会造成资源浪费,甚至OOM。
为此,当我们启动一个任务,发现输入数据量小但任务数量多时,需要注意在Map前端进行输入合并
当然,在我们向一个表写数据时,也需要注意输出文件大小

1. Map输入合并小文件
对应参数:
set mapred.max.split.size=256000000;  #每个Map最大输入大小
set mapred.min.split.size.per.node=100000000; #一个节点上split的至少的大小 
set mapred.min.split.size.per.rack=100000000; #一个交换机下split的至少的大小
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;  #执行Map前进行小文件合并

在开启了org.apache.hadoop.hive.ql.io.CombineHiveInputFormat后,一个data node节点上多个小文件会进行合并,合并文件数由mapred.max.split.size限制的大小决定。
mapred.min.split.size.per.node决定了多个data node上的文件是否需要合并~
mapred.min.split.size.per.rack决定了多个交换机上的文件是否需要合并~



2.输出合并
set hive.merge.mapfiles = true #在Map-only的任务结束时合并小文件
set hive.merge.mapredfiles = true #在Map-Reduce的任务结束时合并小文件
set hive.merge.size.per.task = 256*1000*1000 #合并文件的大小
set hive.merge.smallfiles.avgsize=16000000 #当输出文件的平均大小小于该值时,启动一个独立的map-reduce任务进行文件merge

Hive on Tez 中,Hive 的配置参数对于小文件合并(small file merge)和倾斜数据优化(skew data optimization)仍然有效,但其具体行为和生效机制会受到执行引擎(Tez)特性的影响。以下是一些关键点的说明: ### 小文件合并(Small File Merge) 1. **`hive.merge.mapfiles`** 和 **`hive.merge.mapredfiles`**:这两个参数控制是否在 Map-only 或 MapReduce 作业中合并小文件。在 Hive on Tez 中,这些参数仍然适用,但 Tez 的动态分区和任务调度机制可能会对最终的文件合并效果产生影响[^2]。 2. **`hive.merge.size.per.task`**:此参数定义每个任务合并后文件的大小上限,默认为 256 MB。在 Hive on Tez 中,此设置依然有效,但 Tez 的运行时优化可能会影响实际生成的文件数量和大小。 3. **`hive.merge.smallfiles.avgsize`**:当文件的平均大小低于此值时,Hive 会触发小文件合并。该参数在 Hive on Tez 中仍然有效,但需要结合 Tez 的输入分片策略进行调整以达到最佳效果。 ### 倾斜数据优化(Skew Data Optimization) 1. **`hive.groupby.skewindata`**:此参数用于处理 Group By 操作中的数据倾斜问题。当设置为 `true` 时,Hive 会自动对倾斜的 key 进行二次哈希和分发,从而减轻 reducer 的负载不均衡问题。该配置在 Hive on Tez 中依然有效,且其工作机制与 MapReduce 模式下基本一致[^3]。 2. **`hive.optimize.skewjoin`**:此参数用于优化倾斜的 Join 操作。当启用时,Hive 会检测倾斜的 Join 键,并尝试将其拆分为多个子任务进行处理。在 Hive on Tez 中,该参数仍然适用,但 Tez 的 DAG 执行模型可能会提供更灵活的任务调度和资源管理能力,从而进一步优化倾斜 Join 的性能。 ### Hive on Tez 的特殊注意事项 1. **动态分片(Dynamic Partition Pruning)**:在 Hive on Tez 中,动态分片技术可以优化输入数据的读取,减少不必要的数据扫描,这在一定程度上也会影响小文件合并和数据倾斜的表现。 2. **Tez 的并行度控制**:Tez 提供了更细粒度的任务调度和并行度控制机制,例如 `tez.grouping.max-size` 和 `tez.grouping.min-size`,这些参数可以与 Hive 的 `hive.exec.reducers.bytes.per.reducer` 等配置协同工作,影响最终的 reducer 数量和任务执行效率[^2]。 ### 示例配置调整 ```sql -- 启用倾斜 Join 优化 set hive.optimize.skewjoin=true; -- 启用 Group By 数据倾斜优化 set hive.groupby.skewindata=true; -- 设置每个 reducer 的输入大小上限 set hive.exec.reducers.bytes.per.reducer=134217728; -- 128 MB -- 控制是否合并小文件 set hive.merge.mapfiles=true; set hive.merge.mapredfiles=true; set hive.merge.smallfiles.avgsize=16777216; -- 16 MB set hive.merge.size.per.task=268435456; -- 256 MB ``` ### 总结 Hive 的小文件合并和倾斜数据优化配置在 Hive on Tez 中仍然有效,但需要注意 Tez 引擎的特性和运行时行为对这些配置的影响。建议在实际环境中结合具体作业的执行计划和性能指标进行调优。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值