Hive map阶段缓慢,优化过程详细分析

  • Post author:
  • Post category:其他





背景

同事写了这样一段HQL(涉及公司数据,表名由假名替换,语句与真实场景略有不同,但不影响分析):




  1. CREATE




    TABLE


    tmp


    AS





  2. SELECT




  3. t1.exk,

  4. t1.exv,

  5. M.makename

    AS


    m_makename,


  6. S.makename

    AS


    s_makename,



  7. FROM




  8. (

    SELECT




  9. exk,

  10. exv


  11. FROM


    xx.xxx_log



  12. WHERE


    etl_dt =


    ‘2017-01-12’





  13. AND


    exk


    IN


    (


    ‘xxID’


    ,


    ‘yyID’


    ) ) t1



  14. LEFT




    JOIN


    xx.xxx_model_info M


    ON


    (M.modelid=t1.exv


    AND


    t1.exk=


    ‘xxID’


    )



  15. LEFT




    JOIN


    xx.xxx_style_info S


    ON


    (S.styleid=t1.exv


    AND


    t1.exk=


    ‘yyID’


    )

任务运行过程中非常缓慢,同事反映说这个任务要跑一个多小时。初步问了下,xx.xxx_log表数据量在分区etl_dt = ‘2017-01-12’上大概1亿3000万,xx.xxx_model_info大概3000多,xx.xxx_style_info大概4万多。


分析


第一步,分析HQL语句着手

从同事提供的数据量上看,两个left join显然应该是mapjoin,因为数据量差距悬殊。当前只有HQL语句,所以优化第一步当然要从HQL语句本身出发,看HQL语句是否有不恰当的地方。

从语句上看,就是取三张表的数据,按条件进行join,最后创建并插入一张hive表。语句上看没什么问题。

那就来看执行计划吧~ 我们只看建表后面的SELECT语句,如下




  1. STAGE DEPENDENCIES:


  2. Stage-5

    is


    a root stage


  3. Stage-4 depends

    on


    stages: Stage-5


  4. Stage-0 depends

    on


    stages: Stage-4



  5. STAGE PLANS:

  6. Stage: Stage-5

  7. Map Reduce

    Local




    Work




  8. Alias -> Map

    Local


    Tables:


  9. m


  10. Fetch


    Operator


  11. limit: -1

  12. s


  13. Fetch


    Operator


  14. limit: -1

  15. Alias -> Map

    Local


    Operator Tree:


  16. m

  17. TableScan

  18. alias: m