• Hive 任务限制同时运行的任务数量的配置


    Hive任务的并发控制,指同时运行的 container 的数量,防止先提交的任务占用全部的队列资源,导致后来提交的任务无法申请到足够的资源。

    Hive 任务的并发控制,和使用的引擎相关。

    MapReduce(MR)引擎

    • 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 引擎

    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;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    Explain SQL,执行计划如下:

    Reducer 2 <- Map 1 (SIMPLE_EDGE)
    Reducer 3 <- Reducer 2 (CUSTOM_SIMPLE_EDGE)
    
    • 1
    • 2

    从以下日志可以看到,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 
    
    • 1
    • 2
    • 3
    • 4
    • 5

    通过设置 split size

    tez.grouping.min-size 默认为 50M,tez.grouping.max-size 默认为 1G.

    set tez.grouping.min-size=1024000000;
    set tez.grouping.max-size=10240000000;
    
    • 1
    • 2

    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  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    通过设置 tez.grouping.split-count 设置 Map 数量为固定值

    通过 tez.grouping.split-count 参数可以设置 Map 任务为固定值,一般最终是此值加1.

    set tez.grouping.split-count=4;
    
    • 1

    最终生成 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  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    设置 reduce 数量

    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
    
    • 1
    • 2
    • 3
    • 4

    通过设置每个reduce 处理数据量来调整 reduce 数量

    以下参数设置每个reduce 处理 25G 数据。

    set hive.exec.reducers.bytes.per.reducer=25600000000;
    
    • 1

    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 
    
    • 1
    • 2
    • 3
    • 4
    • 5

    通过 hive.exec.reducers.max 设置最大值

    set hive.exec.reducers.max=10;
    
    • 1

    这时 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 
    
    • 1
    • 2
    • 3
    • 4
    • 5
  • 相关阅读:
    Python卡方分布
    蓝桥杯刷题--python-20-多路归并,贡献法
    python如何实现数据可视化,如何用python做可视化
    利用OpenCV的函数LUT()对矩阵的数据进行查表映射
    从XXL-job路由策略的“服务容错“说起
    [附源码]计算机毕业设计springboot小太阳幼儿园学生管理系统
    09-单比特信号的跨时钟域处理
    Git - branch name
    领英精灵和领英助理哪个好,看这一篇就够了
    AI艺术的背后:详解文本生成图像模型【基于GAN】
  • 原文地址:https://blog.csdn.net/houzhizhen/article/details/132872333