Return to site

Hive优化

Hive技术提升

· Hive,bigdata

这部分内容来自于书《Hadoop构建数据仓库实践》一书的 Chapter8.5, Hive优化 P246-P254页。

1 启用压缩

压缩可以使磁盘上存储的数据量变小, 例如文本文件格式能够压缩40%甚至更高给, 这样可以通过降低IO来提高查询速度。

建议总是启用压缩, 压缩与解压缩会消耗CPU资源, 但Hive产生的MR 作业往往是IO密集型的, 因此CPU开销通常不是问题。

为了启用压缩

set io.compression.codecs;

Hive查询提交后会转换为一系列中间阶段的MapReduce作业

hive-site.xml 设置 hive.exec.compress.intermediate 属性以启用中间数据压缩

<name>hive.exec.compress.intermediate</name>

<value>true</value>

<description> This controls whether intermediate files produced by Hive between multiple map-reduce jobs are compressed. The compression codes and other options are determined from hadoop config variables mapred.output.compress </description>

<name>hive.intermediate.compression.codec</name>

<value>org.apache.hadoop.io.compress.SnappyCodec</value>

2 优化 连接 (JOIN)

(1) 自动Map连接

当一个大表和小表时, 自动Map连接是一个非常有用的特性。 如果启用该特点, 小表将保存在每个节点的本地缓存中, 并在Map阶段与大表进行连接。 开启自动Map连接提供两个好处。 首先将小表装进缓存将节省每个数据节点上的读取时间。 其次它避免了Hive查询中的倾斜连接, 因为每个数据块(小表) 的连接操作 已经在Map阶段就完成了。

set hive.auto.convert.join = true; 是否启用转换机制。

set hive.auto.convert.join.noconditionaltask = true; 是否启用转换: 参与连接的表(或分区)有N个, 如果打开这个参数, 并且有N-1个表的大小总和小于 下面的参数, 那么转为Map连接。

set hive.auto.convert.join.noconditionaltask.size = 10000000 ( 10MB) 如果上面的参数是false, 本参数不起作用。

set hive.auto.convert.join.use.nonstaged = true; 如果从一个小的输入流可以直接应用于join操作而不需要过滤或者投影, 那么不需要通过MapReduce的本地任务在分布式缓存中预存。 当前该参数在vectorization 或 tez执行引擎中不工作。

(2) 倾斜连接

两个大表连接时, 会先基于连接Key分别对两个表进行排序, 然后连接它们。

Mapper 将特定键值的所有行发送给同一个Reducer。

一系列Mapper读取表中的数据基于Key的值发送给Reducer. 如 id =1 发给R1, id=2发给R2, … 这些Reducer 产生 A、B交集并输出。

<name>hive.optimize.skewjoin</name> 是否为连接表中的倾斜Key创建单独的执行计划

<value> true </value>

<name>hive.skewjoin.key</name> 决定如何确定连接中的倾斜Key。 在连接操作中, 如果同一Key所对应的数据超过该值, 则认为该Key是一个倾斜连接Key

<value>10万</value>

<name>hive.skewjoin.mapjoin.map.tasks</name>

指定倾斜连接中, 用于Map连接作业的任务数。 该参数应该和下面参数配合使用, 控制细粒度。

<value>1万</value>

<name>hive.skewjoin.mapjoin.min.split</name> 通过指定最小split大小, 确定Map连接作业的任务数, 该参数和上面一起使用。

<value>33554432</value>

(3)桶Map连接

set hive.optimize.bucketmapjoin = true 是否开启桶map连接。

set hive.optimize.bucketmapjoin.sortedmerge = true 是否在Map连接中使用归并排序。

3 避免order by 进行全局排序

order by 只用一个Reducer 产生结果。 大数据集 效率过低。

如果不需要全局有序, 可以使用sort by 对每个reducer结果排序。

select id, name , dept from employee

distribute by dept sort by id asc, name desc

4 启用Tez\Spark执行引擎

替换传统的mr 会大幅提升Hive查询性能

要求安装好Tez

set hive.execution.engine=tez

5 优化limit操作

set hive.limit.optimize.enable 是否启用limit优化

set hive.limit.row.max.size 在使用limit 做数据的子集查询时保证的最小行数据量

set hive.limit.optimize.limit.file 在使用limit做数据子集查询时, 采样的最大文件数

set hive.limit.optimize.fetch.max 使用简单limit数据抽样时, 允许的最大行数

6 启用并行执行

每条HiveQL语句都转化成一个或多个执行阶段, 可能是一个MapReduce阶段, 采样阶段, 归并阶段, 限制阶段。 默认时, Hive在任意时刻只能执行一个阶段。 如果组成一个特定作业的多个执行阶段是彼此独立, 就可以并行执行,从而整个作业得以更快完成。

set hive.exec.parallel=true 是否执行并行作业

set hive.exec.parallel.thread.number = 8 ; 最多可以并行执行的作业数。

7 启用 MapReduce 严格模式 (可以作为面试题目)

set hive.mapred.mode=strict

将会严格限制三类查询: 查询分区表时 where 必须指定分区的过滤条件。

对于orderby 必须加 limit 限制 笛卡尔积

​8 使用单一Reduce执行多个Group By

将一个查询中多个group by 操作联合在一起发送给单一MapReduce作业

set hive.multigroupby.singlereducer=true

Whether to optimize multi group by query to generate single M/R job plan. If the multi group by query has common group by keys, it will be optimized to generate single M/R job.

9 控制并行Reduce任务

Hive通过将查询划分成一个或多个MapReduce任务达到并行。 确定最佳的mapper个数和reducer个数取决于多个变量。

例如输入的数据量, 以及对这些数据执行的操作类型, 如果mapper reducer太多 会导致小任务大开销的问题。 如果设置的过小, 那么就可能没有充分利用好集群内存的条件(把大炮当锤子用)

set hvie.exec.reducers.bytes.per.reducer = 256MB; 每个reducer字节数, 默认值为256MB, Hive是按照输入的数据量大小来确定reducer个数。 例如如果输入数据是1GB则使用4个reducer

set hive.exec.reducers.max=1009 设置最大的reducer个数

10 启用向量化

向量化是Hive0.13.1 版本后引入的。

查询执行向量化, 使Hive从单行处理数据改为batch , 大提高了表的扫描聚合和连接等操作的性能。

set hive.vectorized.execution.enabled = true;

set hive.vectorized.execution.reduce.enabled = true

set hive.vectorized.execution.reduce.groupby.enabled=true;

11 启用基于成本的优化器

Hive0.14版本开始提供基于成本优化器。

12 使用ORC文件格式

ORC文件格式可以有效提升Hive查询性能。

参考

这本书的豆瓣链接是https://book.douban.com/subject/27075781/, 我认为尽管已经是2017年的书了, 但是数据仓库领域不可多得的一本中文好书

All Posts
×

Almost done…

We just sent you an email. Please click the link in the email to confirm your subscription!

OKSubscriptions powered by Strikingly