Hive 基于Tez引擎 map和reduce数的参数控制原理与调优经验
1.概述
主要对基于Tez的map数和reduce数测试与调优
如果需要查看基于MapReduce的调优可以看这篇:
Hive 基于MapReduce引擎 map和reduce数的参数控制原理与调优经验
https://blog.csdn.net/qq_35260875/article/details/110181866?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22110181866%22%2C%22source%22%3A%22qq_35260875%22%7D&ctrtid=Lp7kw
2.数据准备
(1)表信息
本次测试的表和sql都是使用的TPC-DS
Tez文件存储格式为orc。
| 表名 | 总数 | 占用空间 | 文件数 |
| date_dim | 73049 | 354.1 K | 1 |
| item | 48000 | 3.0 M | 1 |
| store | 118 | 12.3 K | 1 |
| store_sales | 23039641872 | 829.2 G | 1874 |
store_sales的表结构:

(2)SQL语句
测试SQL为CPU密集型,密集型的含义:在SQL运行期间CPU占比会很高

3.map数的控制
3.1 map数控制测试
影响map个数的tez参数,可以通过在Hive中使用set的形式来使用,set只针对当前session。如果需要全局,则需要修改hive-site.xml和tez-site.xml
| 参数 | 默认值 | 说明 |
| tez.grouping.max-size | 1073741824(1GB) | group分割大小的最大值 |
| tez.grouping.min-size | 16777216(16MB) | group分割大小的最小值 |
| tez.grouping.split-count | 未设置 | group的分割组数 |
mapreduce.input.fileinputformat.split.maxsize这个参数对Tez中的map数也是有影响的。默认为256MB,但是这次测试不针对这个参数
(1)tez.grouping.max-size
测试1:
tez.grouping.max-size =1073741824; 1GB

共有363个map数
测试2:
tez.grouping.max-size =536870912; 512MB

共有701个map数

测试3:
tez.grouping.max-size =268435456; 256MB

共有818个map数

测试1:
tez.grouping.max-size =2147483648; 2GB

共有363个map数
因为2GB大于文件的分割长度
(2)tez.grouping.split-count
测试1:
tez.grouping.split-count =300;
共有363个map数

测试2:
tez.grouping.split-count =500;

共有749个map数

测试3:
tez.grouping.split-count =1000;

共有895个map数

当设置的值大于原始的895时,tez会直接使用895
测试4:
tez.grouping.split-count =200;

共有244个map数

3.2 map数控制结果
(1)tez.grouping.max-size
| tez.grouping.max-size值 | Map数 |
| 1073741824 | 363 |
| 536870912 | 701 |
| 268435456 | 818 |
| 2147483648 | 363 |
(2)tez.grouping.split-count
| tez.grouping.split-count值 | Map数 |
| 300 | 363 |
| 500 | 749 |
| 1000 | 895 |
| 200 | 244 |
4.reduce数的控制
影响reduce个数的参数
| 参数 | 默认值 | 说明 |
| mapred.reduce.tasks | -1 | 指定reduce的个数 |
| hive.exec.reducers.bytes.per.reducer | 67108864 | 每个reduce的数据处理量 |
| hive.exec.reducers.max | 1009 | reduce的最大个数 |
| hive.tez.auto.reducer.parallelism | true | 是否启动reduce自动并行 |
前面三个参数的作用和基于MR的相同,故不在做分析,只分析hive.tez.auto.reducer.parallelism参数
(1)hive.tez.auto.reducer.parallelism
hive.tez.auto.reducer.parallelism启用之后,Tez会估计数据量大小,设置并行度。在运行时会根据需要调整估计值。
测试1:
set hive.exec.reducers.max=20;
set hive.tez.auto.reducer.parallelism = false;

测试2:
set hive.exec.reducers.max=20;
set hive.tez.auto.reducer.parallelism = true;

从dag syslog中可以看到,开启并行执行之后,Reducer 2从20变成了7。
Reducer 3 4 5 6从20变成了5


5.调优流程
(1)map
Tez内部对map数已经有了很多的优化,需要通过dag的系统日志来分析,在有限的资源内,结合集群的资源来提高并发,集群资源越多,map数就可以设置大一点。
(2)reduce
需要根据集群的资源以及map端实际的输出数据量来设置reduce数。
6.总结推荐使用
(1)map
- tez.grouping.split-count结合集群的资源来设置,例如测试sql:总共分割895,测试过程中895的性能好。
(2)reduce
- 推荐reduce数为集群能启动的最大container数的80%,或者小于这个数。
- mapred.reduce.tasks这个参数一般不推荐使用。
- 是否开启并行,需要根据实际sql的测试结果来判断。最好开启和关闭并行都测试一下
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
