列裁剪

Hive 在读数据的时候,可以只读取查询中所需要用到的列,而忽略其他的列。这样做可以节省读取开销,中间表存储开销和数据整合开销。

set hive.optimize.cp = true; -- 列裁剪,取数只取查询中需要用到的列,默认为真

分区裁剪

在查询的过程中只选择需要的分区,可以减少读入的分区数目,减少读入的数据量。

set hive.optimize.pruner=true; // 默认为true

合并小文件

Map 输入合并

在执行 MapReduce 程序的时候,一般情况是一个文件需要一个 mapper 来处理。但是如果数据源是大量的小文件,这样岂不是会启动大量的 mapper 任务,这样会浪费大量资源。可以将输入的小文件进行合并,从而减少 mapper 任务数量。详细分析

set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat; -- Map端输入、合并文件之后按照block的大小分割(默认)
set hive.input.format=org.apache.hadoop.hive.ql.io.HiveInputFormat; -- Map端输入,不合并

Map/Reduce 输出合并

大量的小文件会给 HDFS 带来压力,影响处理效率。可以通过合并 Map 和 Reduce 的结果文件来消除影响。

set hive.merge.mapfiles=true;  -- 是否合并Map输出文件, 默认值为真
set hive.merge.mapredfiles=true; -- 是否合并Reduce 端输出文件,默认值为假
set hive.merge.size.per.task=25610001000; -- 合并文件的大小,默认值为 256000000

合理控制 map/reduce 任务数量

合理控制 mapper 数量

减少 mapper 数可以通过合并小文件来实现, 增加 mapper 数可以通过控制上一个 reduce 的输出数量

默认的 mapper 个数计算方式