hive文件合并方法

当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

 

Reference:
Hive AdminManual 

 

本文转自:http://blog.youkuaiyun.com/yfkiss/article/details/8590486

<think>我们正在讨论Hive合并文件方法。根据引用内容,Hive提供了多种参数来合并文件,主要分为两种场景:在Map-only任务结束时合并和在Map-Reduce任务结束时合并。 关键参数: 1. `hive.merge.mapfiles`:在Map-only任务结束时合并文件,默认true。 2. `hive.merge.mapredfiles`:在Map-Reduce任务结束时合并文件,默认false(需要手动开启)。 3. `hive.merge.size.per.task`:合并后每个文件的大小,默认256000000(约256MB)。 4. `hive.merge.smallfiles.avgsize`:平均文件大小阈值,当输入文件的平均大小小于该值时,会触发合并操作,默认16000000(约16MB)。 此外,引用中还提到可以通过调整查询方式来合并文件,例如使用`select * from 表`只产生一个Map任务来合并文件,并输出到新表。 因此,合并文件方法主要有两种: 方法一:在执行任务前设置合并参数(针对整个会话或任务) 方法二:通过一个单独的合并任务(如使用INSERT OVERWRITE语句)来合并已有表的小文件。 下面详细说明:</think>### Hive 合并文件方法Hive合并文件主要通过参数配置实现,核心是控制 Map/Reduce 任务输出文件合并机制。以下是具体方法: #### 1. **Map-only 任务合并**(默认开启) ```sql -- 在 Map-only 任务结束时自动合并文件(默认 true) SET hive.merge.mapfiles = true; ``` 适用于 `SELECT` 查询等无 Reduce 阶段的任务[^1]。 #### 2. **Map-Reduce 任务合并**(需手动开启) ```sql -- 在 Map-Reduce 任务结束时合并文件(默认 false) SET hive.merge.mapredfiles = true; ``` 适用于含 Reduce 阶段的任务(如 `GROUP BY`)[^3]。 #### 3. **关键控制参数** ```sql -- 合并后单个文件的目标大小(默认 256MB) SET hive.merge.size.per.task = 256000000; -- 触发合并的平均文件大小阈值(默认 16MB) SET hive.merge.smallfiles.avgsize = 16000000; ``` 当输出文件的**平均大小**低于 `hive.merge.smallfiles.avgsize` 时,系统自动触发合并,直至文件接近 `hive.merge.size.per.task` 指定的大小[^3]。 #### 4. **手动合并现有表文件** ```sql -- 通过重写表数据强制合并文件 INSERT OVERWRITE TABLE target_table SELECT * FROM source_table; -- 产生新文件时会自动合并 ``` 此操作会启动新 Map-Reduce 任务,根据参数设置合并输出文件[^2]。 #### 5. **执行流程示例** ```sql -- 步骤 1: 设置合并参数 SET hive.merge.mapfiles = true; SET hive.merge.mapredfiles = true; SET hive.merge.size.per.task = 256000000; SET hive.merge.smallfiles.avgsize = 100000000; -- 阈值设为 100MB -- 步骤 2: 执行数据操作(自动触发合并) INSERT OVERWRITE TABLE user_merged SELECT * FROM user_log; ``` > **注意事项** > - 合并会增加任务执行时间和资源消耗,需权衡存储优化与计算成本 > - 对于分区表,可针对特定分区执行合并:`INSERT OVERWRITE TABLE ... PARTITION(dt='2023')` > - 建议在低峰期执行批量合并操作
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值