hive、spark优化
看了文章https://blog.csdn.net/qq_26442553/article/details/99438121,总结了的。感谢@涤生大大的精彩分享
小文件过多
小文件过多引起maptask太多,初始化时间远大于逻辑处理时间。此时我们可以合并小文件。
- hive,调节参数:
set hive.input.format = org.apache.hadoop.hive.ql.io.CombineHiveInputFormat; --hive0.5开始就是默认值,执行map前进行小文件合并
----------------------------------------------------------------------
set mapred.max.split.size=256000000
set mapred.min.split.size=10000000
set mapred.min.split.size.per.node=8000000 --每个节点处理的最小split
----------------------------------------------------------------------
set hive.merge.mapfiles = true ;
set hive.merge.mapredfiles = true ;
set hive.merge.size.per.task = 256000000 ;
set hive.merge.smallfiles.avgsize=160000000 ;
------------------------------------------------------------------------
注意一般来说这四个参数的配置结果大小要满足如下关系。
max.split.size >= min.split.size >= min.size.per.node >= min.size.per.node
注意,
1.调节上面四个参数控制map端任务个数时,如果文件未使用压缩,或者压缩格式不支持split,那么在文件较大的情况下想要通过调节参数增加map数是无效的。
2.如果是可切分的压缩格式,则需要上面👆四个参数一起,进行精准控制调优。
- spark 。
spark 可以通过/repartition(n)/,根据实际情况,对最终结果进行repartion进而达到控制最终落到hdfs的文件数的目的
数据倾斜
1.join倾斜
-
小表join大表
将小表写在前面,通过/*map join */舍掉reduce操作,没有reduce操作就不会有数据倾斜。并且map join的原理是将小表加载到每一个map节点上与大表进行关联,所以对小表 join大表的笛卡尔积的情况,也十分有效。 -
大表join大表
- null值引起的数据倾斜。
预先过滤null值,或者将null处理成非关联值的随机值。 - 非null的热点值引起的倾斜
将热点值和非热点值分开进行计算,最终合并到一起, - sql层面处理。
1、 尽量避免distinct 用group by代替
2、 尽可能的裁剪列和分区,或者进行预聚合,缩小数据集
3、 关联key 的字段类型保持一致。
4、distribute by ()sort by 代替partition by () order by() 因为。orderby是全局排序,只会起一个reduce任务,所以会很慢 - 参数调节
1、设置每个reduce可处理的数据量大小
set hive.exec.reducers.bytes.per.reducer = 1000000000
2、控制倾斜的阈值
ihve 在运行的时候没有办法判断哪个key 会产生多大的倾斜,所以使用这个参数控制倾斜的阈值,如果超过这个值,新的值会发送给那些还没有达到的reduce, 一般可以设置成你处理的总记录数/reduce个数的2-4倍都可以接受.set hive.optimize.skewjoin = true; set hive.skewjoin.key = skew_key_threshold (default = 100000)
- null值引起的数据倾斜。
3.group by 倾斜
首先配置允许在map端进行聚合,然后同样调节倾斜的阈值。
hive.map.aggr=true (默认true) 这个配置项代表是否在map端进行聚合,相当于Combiner
hive.groupby.skewindata=true(默认false)