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

本文分析了一例Hive查询中map阶段缓慢的问题。通过执行计划和数据量分析,排除了SQL语句和数据切分问题。接着检查了机器负载,发现并非机器性能导致。进一步通过分段SQL测试定位到mapjoin过程中的类型转换问题,特别是double类型的数据导致的HashMap到LinkedList降级,从而影响性能。最后,提出在JOIN前手动进行类型匹配以避免此问题,以提高查询效率。
摘要由CSDN通过智能技术生成

背景

同事写了这样一段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.  
  6. STAGE PLANS: 
  7.   Stage: Stage-5 
  8.     Map Reduce Local Work 
  9.       Alias -> Map Local Tables: 
  10.         m  
  11.           Fetch Operator 
  12.             limit: -1 
  13.         s  
  14.           Fetch Operator 
  15.             limit: -1 
  16.       Alias -> Map Local Operator Tree: 
  17.         m  
  18.           TableScan 
  19.             alias: m 
  • 5
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值