mapred任务性能优化本质上就是和shuffle搏斗-hive hadoop spark

本文探讨了Hive、Hadoop和Spark中的性能优化,尤其是针对shuffle操作和数据倾斜问题。提出了包括map端聚合、调整reduce任务数量和数据规模、以及使用广播和mapJoin等方法来减少shuffle次数和数据规模。同时,详细介绍了Hive中解决数据倾斜的多种策略,如map端预聚合、设置reduce任务的最大数据规模和优化参数。在Spark中,解决数据倾斜的方案包括在key上添加随机数、自定义partitioner、map端预聚合和手动重分区。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

hive中解决数据倾斜的思路

1.由key为null值造成的倾斜,将空置变成字符串加随机数

2.由group by造成的倾斜,map端聚合

set hive.groupby.skewindata=true;

hive.groupby.mapaggr.checkinterval = 100000 (默认)

hive.map.aggr.hash.min.reduction=0.5(默认)

3.控制reduce节点上的数据规模

set hive.optimize.skewjoin = true;  — 优化歪斜:true

set hive.skewjoin.key = skew_key_threshold (default = 100000)— 歪斜键阈值,数据行数

行数超过阈值的reduce节点上就不再接收新数据,map端发送到其他reduce节点上去

下面是设置单个reduce节点上最大数据规模,也可以设置reduce节点个数,根本目的和上面是一样的,不要让单台reduce上有太多数据

set hive.exec.reducers.bytes.per.reducer = 1000000000(10的9次方字节是1G)— 字节数.单个.reducer

set mapred.reduce.tasks=800;

从这么长时间学习hadoop spark hive来看,性能调优问题的思路都一样

本质上就是和shuffle搏斗,以及解决数据倾斜问题(shuffle涉及到io和网络传输)

都是在reduceByKey或者hive中group by中造成的

解决的思路主要是下面几点:

1.减少shuffle次数

用broadcast+filter或者hive中的mapjoin来代替两个大表直接join

2.减小shuffle数据规模

比如使用reduceByKey代替groupByKey,先在map端聚合一次减小数据规模

比如在join和union之前先去重

比如在reduceByKey之前先用filter把rdd的规模过滤到最小

3.解决数据倾斜问题

map端是各个节点处理自己节点上的数据,不涉及数据倾斜

主要是由于key的集中分布导致过多的局部key被发送到个别的reduce节点上,导致个别节点上的reduceByKey极慢,大家都在等着他

表现也很明显,很多reduce节点都完成了,就他一个完不了

hive上数据倾斜解决思路

首先明确涉及到reduce算子的地方才会有shuflle,才会有数据倾斜,对应的hive算子就是group by/sort by/distinct

下面就是个总体思路,具体的参数调节都在上面写了

(1)map端进行combine

(2)设置单个reduce上的最大数据规模,或者增大reduce任务个数

spark上解决数据倾斜思路

第一种思路

1.先在key上添加随机数,注意这个随机数是介于0-task个数之间的随机整数,不是真的一个32位随机数,那样会导致每个key都成唯一的了,reduceByKey就没有意义了

2.汇总

3.去掉随机数继续汇总

第二种思路

使用自定义partitioner

第三种思路

在map端combine,先合并一次减少数据量

第四种思路

reduceByKey之前进行手动重分区

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值