首页 > 代码库 > Hive任务优化

Hive任务优化

  1. rom logs   
  2.    where log_date = 20130803 and item_id = 3  
  3. )t  

 

设置Job间并行的参数是Hive.exec.parallel,将其设为true即可。默认的并行度为8,也就是最多允许sql中8个Job并行。如果想要更高的并行度,可以通过Hive.exec.parallel. thread.number参数进行设置,但要避免设置过大而占用过多资源。

减少Job数

另外在实际开发过程中也发现,一些实现思路会导致生成多余的Job而显得不够高效。比如这个需求:查询某网站日志中访问过页面a和页面b的用户数量。低效的思路是面向明细的,先取出看过页面a的用户,再取出看过页面b的用户,然后取交集,代码如下:

 

[js] view plaincopy
 
  1. select count(*)   
  2. from   
  3. (select distinct user_id   
  4. from logs where page_name = ‘a’) a  
  5. join   
  6. (select distinct user_id   
  7. from logs where blog_owner = ‘b’) b   
  8. on a.user_id = b.user_id;  

 

这样一来,就要产生2个求子查询的Job,一个用于关联的Job,还有一个计数的Job,一共有4个Job。

但是我们直接用面向统计的方法去计算的话(也就是用group by替代join),则会更加符合M/R的模式,而且生成了一个完全不带子查询的sql,只需要用一个Job就能跑完:

 

[js] view plaincopy
 
  1. select count(*)   
  2. from logs group by user_id  
  3. having (count(case when page_name = ‘a’ then 1 end) > 0  
  4.     and count(case when page_name = ‘b’ then 1 end) > 0)  

 

第一种查询方法符合思考问题的直觉,是工程师和分析师在实际查数据中最先想到的写法,但是如果在目前Hive的query planner不是那么智能的情况下,想要更加快速的跑出结果,懂一点工具的内部机理也是必须的。(作者:孙逸 / 审校:刘亚琼)


作者介绍:孙逸,zamplus,数据仓库工程师。从事数据仓库平台建设与数据产品开发,热衷于研究大数据相关的计算技术,并应用于实践之中,让数据产生真正价值。

Hive任务优化