
# Hive小文件参数调优
在Hive中，小文件并没有严格统一的定义，通常是指大小远小于HDFS块大小的文件。这类文件因体积过小，会对Hive的存储效率和查询性能产生负面影响。
小文件过多，会对系统产生以下影响：
- HDFS存储效率低 HDFS的元数据（文件信息、块信息等）由NameNode管理，每个小文件都会占用NameNode的内存。大量小文件会耗尽NameNode的内存资源，影响HDFS的稳定性和扩展性。
  
- Hive查询性能下降
  - Hive查询时，每个小文件通常会对应一个Map任务，大量小文件会导致Map任务数量激增。
  
  - 过多的Map任务会增加任务调度、启动、资源分配的开销，且任务间的通信成本上升，最终导致查询延迟增加。
   
- 资源利用率低 每个Map任务处理的数据量过小，导致 CPU、内存等资源无法充分利用，造成资源浪费。
  
#### 前提条件
已登录Hive客户端，具体操作请参见[Hive客户端使用实践](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_0952.html)。
#### Hive小文件参数调优
1. 已登录Hive客户端，具体操作请参见[Hive客户端使用实践](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_0952.html)。
2. 配置小文件合并输入格式。 
   "hive.input.format"参数用于配置Hive默认的输入格式类，Hive通过该类将底层数据文件解析为可供查询的记录（row），是SQL查询能够读取底层数据的基础。
   参数取值"org.apache.hadoop.hive.ql.io.CombineHiveInputFormat"表示合并小文件的输入格式，通过将多个小文件的输入分片（InputSplit）合并为一个，减少 Map 任务数量，优化小文件场景的查询性能。
   ```
   set hive.input.format = org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
   ```
   
   
3. 调整小文件合并相关配置。 
   表1小文件大小场景参数 
   | **参数**                        | **参数说明**                                                                                                                                                                                                                                                                                                                                                                                                                                                   | 取值示例      |
   |:---|:---|:---|
   | hive.merge.mapfiles           | 指定Hive在MapReduce作业的Map阶段结束后，是否自动合并生成的小文件。 - true：默认值，表示开启Map输出文件合并。  - false：关闭小文件合并。                                                                                                                                                                 | true      |
   | hive.merge.mapredfiles        | Hive执行引擎为MapReduce时，指定Hive在MapReduce作业的Reduce阶段结束后，是否自动合并生成的小文件，默认关闭。 适合开启（true）的场景： - Reduce任务数量过多，导致输出大量小文件。  - 动态分区写入时，每个分区的Reduce输出文件过小。  - 执行INSERT、CTAS等写操作后，表中产生大量小文件，影响后续查询。   | false     |
   | hive.merge.tezfiles           | Hive执行引擎为Tez时，指定Hive在Tez作业执行后，是否自动合并生成的小文件，默认关闭。 在处理大量数据或生成大量小文件的场景下（如ETL、聚合操作等），可开启该功能以减少文件碎片，提高存储和读取效率。                                                                                                                                                                                                                                                                                                                   | true      |
   | hive.merge.sparkfiles         | Hive执行引擎为Spark时，指定Hive在Spark作业执行后，是否自动合并生成的小文件，默认关闭。 在处理大量数据或生成大量小文件的场景下（如ETL、聚合操作等），可开启该功能以减少文件碎片，提高存储和读取效率。                                                                                                                                                                                                                                                                                                               | true      |
   | hive.merge.smallfiles.avgsize | 平均文件大小阈值，当Hive作业输出文件的平均大小小于该阈值时，Hive会自动触发合并任务，将多个小文件合并为更大的文件（单位：字节）。                                                                                                                                                                                                                                                                                                                                                                                       | 16000000  |
   | hive.merge.size.per.task      | 设定合并任务生成的单个文件的目标大小（单位：字节）。 当Hive触发小文件合并时，会根据该参数将多个小文件合并为大小接近此值的文件。 建议设置为HDFS块大小的整数倍（如128MB、256MB、512MB），避免文件跨块存储，提高读取效率；若设置过大（远大于块大小），可能导致单个文件占用多个块，增加并行读取的复杂度。                                                                                                                                                                                                                           | 256000000 |
      
   配置示例：
   ```
   set hive.merge.mapfiles = true;
   set hive.merge.mapredfiles = false;
   set hive.merge.smallfiles.avgsize = 134217728;    -- 触发合并的平均文件大小阈值为128 MB。
   set hive.merge.size.per.task = 268435456;    -- 合并后单文件目标大小256 MB。
   ```
   
   
4. 调整合并小文件时的分片大小。 
   表2小文件大小场景参数 
   | **参数**                         | **参数说明**                                                                                                                                                                                                                                                                                                               | 取值示例      |
   |:---|:---|:---|
   | mapred.max.split.size          | 用于设定单个输入分片（InputSplit）的最大大小（单位：字节）。 通过控制分片大小，间接控制Map任务数量，平衡单个Map任务的处理效率与任务调度开销。                                                                                                                                                                                                        | 256000000 |
   | mapred.min.split.size          | 用于设定单个输入分片的最小大小（单位：字节）。 当表包含大量小文件时，通过调大该参数，可促使Hadoop合并小文件为较大的分片，避免Map任务数量过多。                                                                                                                                                                                                           | 1（默认不限制）  |
   | mapred.min.split.size.per.node | 设定单个节点上合并小文件时的最小分片大小（单位：字节）。 当多个小文件存储在同一节点时，系统会尝试将它们合并为一个分片，而该参数定义了这种合并操作的最小阈值。 通过控制同一节点上小文件的合并阈值，提高Map任务的数据本地性，减少跨节点传输开销。在Hive中，需结合全局和机架级分片参数，根据小文件的分布特点调整，以平衡合并效率与本地化率。                                                                             | 1         |
   | mapred.min.split.size.per.rack | 设定同一机架内（跨节点但同属一个机架）合并小文件时的最小分片大小（单位：字节）。 当同一节点的小文件不足以达到合并阈值时，系统会尝试在同一机架内的不同节点间合并小文件，该参数定义了这种跨节点合并的最小阈值。 相关参数优先级： mapred.min.split.size（全局） \> mapred.min.split.size.per.node（节点） \> mapred.min.split.size.per.rack（机架） | 1         |
      
   配置示例：
   ```
   set mapred.max.split.size = 256000000;
   set mapred.min.split.size = 67108864;  -- 全局最小分片64 MB
   set mapred.min.split.size.per.node = 67108864;  -- 节点级最小分片64 MB
   set mapred.min.split.size.per.rack = 134217728;  -- 机架级最小合并分片大小128 MB
   ```
   
   
 
#### 相关文档
更多关于Mapreduce调优，请参考[MapReduce性能调优](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_0843.html)。
