hive、spark优化

hive、spark优化

看了文章https://blog.csdn.net/qq_26442553/article/details/99438121,总结了的。感谢@涤生大大的精彩分享

小文件过多

小文件过多引起maptask太多,初始化时间远大于逻辑处理时间。此时我们可以合并小文件。

  1. 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.如果是可切分的压缩格式,则需要上面👆四个参数一起,进行精准控制调优。

  1. spark 。
    spark 可以通过/repartition(n)/,根据实际情况,对最终结果进行repartion进而达到控制最终落到hdfs的文件数的目的
数据倾斜
1.join倾斜
  1. 小表join大表
    将小表写在前面,通过/*map join */舍掉reduce操作,没有reduce操作就不会有数据倾斜。并且map join的原理是将小表加载到每一个map节点上与大表进行关联,所以对小表 join大表的笛卡尔积的情况,也十分有效。

  2. 大表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)
      
3.group by 倾斜

首先配置允许在map端进行聚合,然后同样调节倾斜的阈值。

hive.map.aggr=true  (默认true) 这个配置项代表是否在map端进行聚合,相当于Combiner

hive.groupby.skewindata=true(默认false)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值