Hive任务的并发控制,指同时运行的 container 的数量,防止先提交的任务占用全部的队列资源,导致后来提交的任务无法申请到足够的资源。
Hive 任务的并发控制,和使用的引擎相关。
Map 任务
mr 引擎使用 mapreduce.job.running.map.limit 来限制同时执行的 map 任务数量。如一个 hive 任务生成 1000 个 map 任务。当 mapreduce.job.running.map.limit 为 10 时,最多可以同时运行 10 个 map 任务。默认值为0,代表不限制同时执行的 map 任务数量。
Reduce 任务
mapreduce.job.running.reduce.limit 来限制同时执行的 reduce 任务数量。默认值为0,代表不限制。
TEZ 没有相关的配置。但是可以通过使用提交的队列限制,因为提交到一个队列中的任务,使用的资源不可能超过队列的资源。
也可以通过以下配置改变执行计划的 Map 和 Reducer 任务的数量。但是通过此方案和 MapReduce 引擎不一样。MapReduce 的方法是生成 100个 Map task,最大同时运行 10 个的方式。而以下的方法仅可以生成 10 个 Map 任务,虽然限制住了资源,但是每个任务运行的数据量变化。这些配置在 MapReduce 框架也有对应的方案。
示例 SQL 如下,数据源自 tpcds scale=1000。
select sum(cnt) cnt
from (
select ws_item_sk, count(1) cnt
from web_sales
group by ws_item_sk
)t;
Explain SQL,执行计划如下:
Reducer 2 <- Map 1 (SIMPLE_EDGE)
Reducer 3 <- Reducer 2 (CUSTOM_SIMPLE_EDGE)
从以下日志可以看到,Map 1 有 38 个 Task, Reducer 2 有 1009 个 Task。
VERTICES MODE STATUS TOTAL COMPLETED RUNNING PENDING FAILED KILLED
----------------------------------------------------------------------------------------------
Map 1 container RUNNING 38 0 4 34 0 0
Reducer 2 container INITED 1009 0 0 1009 0 0
Reducer 3 container INITED 1 0 0 1 0 0
tez.grouping.min-size 默认为 50M,tez.grouping.max-size 默认为 1G.
set tez.grouping.min-size=1024000000;
set tez.grouping.max-size=10240000000;
Map 1 的数量变为 14.
VERTICES MODE STATUS TOTAL COMPLETED RUNNING PENDING FAILED KILLED
----------------------------------------------------------------------------------------------
VERTICES MODE STATUS TOTAL COMPLETED RUNNING PENDING FAILED KILLED
----------------------------------------------------------------------------------------------
Map 1 container RUNNING 14 0 8 6 0 0
Reducer 2 container INITED 1009 0 0 1009 0 0
Reducer 3 container INITED 1 0 0 1 0 0
通过 tez.grouping.split-count 参数可以设置 Map 任务为固定值,一般最终是此值加1.
set tez.grouping.split-count=4;
最终生成 Map 1 的数量为 5.
----------------------------------------------------------------------------------------------
VERTICES MODE STATUS TOTAL COMPLETED RUNNING PENDING FAILED KILLED
----------------------------------------------------------------------------------------------
Map 1 .. container RUNNING 5 1 4 0 0 0
Reducer 2 container INITED 1009 0 0 1009 0 0
Reducer 3 container INITED 1 0 0 1 0 0
reducer 任务的数量是根据输入动态计算的,由以下 2 个参数确定。
hive> set hive.exec.reducers.bytes.per.reducer;
hive.exec.reducers.bytes.per.reducer=256000000
hive> set hive.exec.reducers.max;
hive.exec.reducers.max=1009
以下参数设置每个reduce 处理 25G 数据。
set hive.exec.reducers.bytes.per.reducer=25600000000;
Reducer 2 的 Task 数量从 1009 变为 104.
VERTICES MODE STATUS TOTAL COMPLETED RUNNING PENDING FAILED KILLED
----------------------------------------------------------------------------------------------
Map 1 container RUNNING 38 0 8 30 0 0
Reducer 2 container INITED 104 0 0 104 0 0
Reducer 3 container INITED 1 0 0 1 0 0
set hive.exec.reducers.max=10;
这时 Reducer 2 的 Task 数量变为 10.
VERTICES MODE STATUS TOTAL COMPLETED RUNNING PENDING FAILED KILLED
----------------------------------------------------------------------------------------------
Map 1 container RUNNING 38 0 8 30 0 0
Reducer 2 container INITED 10 0 0 10 0 0
Reducer 3 container INITED 1 0 0 1 0 0