实例1:
crl_1406_orderdetail 665061406840
crl_1406_orders 326723658130
SQL代码:
select c1.sale_ord_id,c2.sale_ord_id
from crl_1406_orders c1 left outer join crl_1406_orderdetail c2on c1.sale_ord_id = c2.sale_ord_id;问题点1:job异常慢,可能reduce为1,这时可以设置reduce数,设置传输格式,并行等
set mapred.output.compress=true;
set hive.exec.compress.output=true;
set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;
set io.compression.codecs=org.apache.hadoop.io.compress.GzipCodecodec;
#设置20个reduces set mapred.reduce.tasks=200;
#设置并行 set hive.exec.parallel=true;
问题点2:raduce为1
1 没有使用group by 2 使用了order by 3 笛卡尔积
问题3:如何欺骗hive分配reduce呢 ?
1 使用聚合函数 ,加 group by
2 然后小表放前面,大表一般往后排,从小到大,这样就能欺骗hive分配多个reduce,达到调优的效果
设置并行对性能要求有点高,所以适度设置并行数量
问题4:并行参数,详设置
当参数为false时,三个job是顺序的执行 set hive.exec.paralllel=false
当两个子查询的sql并无关系,可以并行的跑 set hive.exec.parallel=true;
hive>set hive.exec.paralllel.thread.number; (默认并行数为8)
转自 :