• 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
  • 相关阅读:
    【华为机考题】最少任务处理时常
    AI for Security:智能化安全对抗的困境
    SPA项目之主页面--Mock.js以及组件通信(总线)的运用
    SAS学习2(data步,input语句,从文件中读取数据)
    华为手机的备忘录,你真的会用吗?这4个小功能,很多人都不会用
    A Survey and Framework of Cooperative Perception 论文阅读
    【分享贴】需求变更、项目延误,项目经理应该如何应对?
    Java 入门练习(16 - 20)
    【20-业务开发-基础业务-商品模块-分类管理-前端展示后端具有层级关系的目录数据-商品系统三级分类的逻辑删除前后端代码实现】
    一定要用Photoshop?no!动手用Python做一个颜色提取器! ⛵
  • 原文地址:https://blog.csdn.net/houzhizhen/article/details/132872333