Hive 基于Tez引擎 map和reduce数的参数控制原理与调优经验

1.概述

主要对基于Tez的map数和reduce数测试与调优

如果需要查看基于MapReduce的调优可以看这篇:

Hive 基于MapReduce引擎 map和reduce数的参数控制原理与调优经验icon-default.png?t=M3K6https://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的表结构:

Hive 基于Tez引擎 map和reduce数的参数控制原理与调优经验_第1张图片

(2)SQL语句

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

Hive 基于Tez引擎 map和reduce数的参数控制原理与调优经验_第2张图片

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;

Hive 基于Tez引擎 map和reduce数的参数控制原理与调优经验_第3张图片

测试2:

set hive.exec.reducers.max=20;

set hive.tez.auto.reducer.parallelism = true;

Hive 基于Tez引擎 map和reduce数的参数控制原理与调优经验_第4张图片

从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

  1. tez.grouping.split-count结合集群的资源来设置,例如测试sql:总共分割895,测试过程中895的性能好。

(2)reduce

  1. 推荐reduce数为集群能启动的最大container数的80%,或者小于这个数。
  2. mapred.reduce.tasks这个参数一般不推荐使用。
  3. 是否开启并行,需要根据实际sql的测试结果来判断。最好开启和关闭并行都测试一下

你可能感兴趣的:(Hive,大数据,数据仓库,Tez,Hive调优)