1.概述

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

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

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

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的表结构:

hivemapper Hivemapper行车记录仪_Tez

(2)SQL语句

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

hivemapper Hivemapper行车记录仪_Hive调优_02

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

hivemapper Hivemapper行车记录仪_hive_03

共有363个map数

测试2:

tez.grouping.max-size =536870912; 512MB

hivemapper Hivemapper行车记录仪_调优_04

共有701个map数

hivemapper Hivemapper行车记录仪_Tez_05

测试3:

tez.grouping.max-size =268435456; 256MB

hivemapper Hivemapper行车记录仪_Tez_06

共有818个map数

hivemapper Hivemapper行车记录仪_hivemapper_07

测试1:

tez.grouping.max-size =2147483648; 2GB

hivemapper Hivemapper行车记录仪_Tez_08

共有363个map数

因为2GB大于文件的分割长度

(2)tez.grouping.split-count

测试1:

tez.grouping.split-count =300;

共有363个map数

hivemapper Hivemapper行车记录仪_hive_09

测试2:

tez.grouping.split-count =500;

hivemapper Hivemapper行车记录仪_调优_10

共有749个map数

hivemapper Hivemapper行车记录仪_Hive调优_11

测试3:

tez.grouping.split-count =1000;

hivemapper Hivemapper行车记录仪_Tez_12

共有895个map数

hivemapper Hivemapper行车记录仪_调优_13

当设置的值大于原始的895时,tez会直接使用895

测试4:

tez.grouping.split-count =200;

hivemapper Hivemapper行车记录仪_hive_14

共有244个map数

hivemapper Hivemapper行车记录仪_Tez_15

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;

hivemapper Hivemapper行车记录仪_Tez_16

测试2:

set hive.exec.reducers.max=20;

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

hivemapper Hivemapper行车记录仪_hive_17

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

Reducer 3 4 5 6从20变成了5

hivemapper Hivemapper行车记录仪_Tez_18

hivemapper Hivemapper行车记录仪_Hive调优_19

5.调优流程

(1)map

Tez内部对map数已经有了很多的优化,需要通过dag的系统日志来分析,在有限的资源内,结合集群的资源来提高并发,集群资源越多,map数就可以设置大一点。

(2)reduce

需要根据集群的资源以及map端实际的输出数据量来设置reduce数。