解决MapReduce数据倾斜
2014-08-05 23:59
239 查看
阅读本文可以带着下面问题:
1.map /reduce程序卡住的原因是什么?
2.根据原因,你是否能够想到更好的方法来解决?(企业很看重个人创作力)
map /reduce程序执行时,reduce节点大部分执行完毕,但是有一个或者几个reduce节点运行很慢,导致整个程序的处理时间很长,这是因为某一个key的条数比其他key多很多(有时是百倍或者千倍之多),这条key所在的reduce节点所处理的数据量比其他节点就大很多,从而导致某几个节点迟迟运行不完,此称之为数据倾斜。
用hadoop程序进行数据关联时,常碰到数据倾斜的情况,这里提供一种解决方法。
(1)设置一个hash份数N,用来对条数众多的key进行打散。
(2)对有多条重复key的那份数据进行处理:从1到N将数字加在key后面作为新key,如果需要和另一份数据关联的话,则要重写比较类和分发类(方法如上篇《hadoop job解决大数据量关联的一种方法》)。如此实现多条key的平均分发。
int iNum = iNum % iHashNum;
String strKey = key + CTRLC + String.valueOf(iNum) + CTRLB + “B”;
(3)上一步之后,key被平均分散到很多不同的reduce节点。如果需要和其他数据关联,为了保证每个reduce节点上都有关联的key,对另一份单一key的数据进行处理:循环的从1到N将数字加在key后面作为新key
for(int i = 0; i < iHashNum; ++i){
String strKey =key + CTRLC + String.valueOf(i) ;
output.collect(new Text(strKey), new Text(strValues));}
以此解决数据倾斜的问题,经试验大大减少了程序的运行时间。但此方法会成倍的增加其中一份数据的数据量,以增加shuffle数据量为代价,所以使用此方法时,要多次试验,取一个最佳的hash份数值。
======================================
用上述的方法虽然可以解决数据倾斜,但是当关联的数据量巨大时,如果成倍的增长某份数据,会导致reduce shuffle的数据量变的巨大,得不偿失,从而无法解决运行时间慢的问题。
有一个新的办法可以解决 成倍增长数据 的缺陷:
在两份数据中找共同点,比如两份数据里除了关联的字段以外,还有另外相同含义的字段,如果这个字段在所有log中的重复率比较小,则可以用这个字段作为计算hash的值,如果是数字,可以用来模hash的份数,如果是字符可以用hashcode来模hash的份数(当然数字为了避免落到同一个reduce上的数据过多,也可以用hashcode),这样如果这个字段的值分布足够平均的话,就可以解决上述的问题。-
1.map /reduce程序卡住的原因是什么?
2.根据原因,你是否能够想到更好的方法来解决?(企业很看重个人创作力)
map /reduce程序执行时,reduce节点大部分执行完毕,但是有一个或者几个reduce节点运行很慢,导致整个程序的处理时间很长,这是因为某一个key的条数比其他key多很多(有时是百倍或者千倍之多),这条key所在的reduce节点所处理的数据量比其他节点就大很多,从而导致某几个节点迟迟运行不完,此称之为数据倾斜。
用hadoop程序进行数据关联时,常碰到数据倾斜的情况,这里提供一种解决方法。
(1)设置一个hash份数N,用来对条数众多的key进行打散。
(2)对有多条重复key的那份数据进行处理:从1到N将数字加在key后面作为新key,如果需要和另一份数据关联的话,则要重写比较类和分发类(方法如上篇《hadoop job解决大数据量关联的一种方法》)。如此实现多条key的平均分发。
int iNum = iNum % iHashNum;
String strKey = key + CTRLC + String.valueOf(iNum) + CTRLB + “B”;
(3)上一步之后,key被平均分散到很多不同的reduce节点。如果需要和其他数据关联,为了保证每个reduce节点上都有关联的key,对另一份单一key的数据进行处理:循环的从1到N将数字加在key后面作为新key
for(int i = 0; i < iHashNum; ++i){
String strKey =key + CTRLC + String.valueOf(i) ;
output.collect(new Text(strKey), new Text(strValues));}
以此解决数据倾斜的问题,经试验大大减少了程序的运行时间。但此方法会成倍的增加其中一份数据的数据量,以增加shuffle数据量为代价,所以使用此方法时,要多次试验,取一个最佳的hash份数值。
======================================
用上述的方法虽然可以解决数据倾斜,但是当关联的数据量巨大时,如果成倍的增长某份数据,会导致reduce shuffle的数据量变的巨大,得不偿失,从而无法解决运行时间慢的问题。
有一个新的办法可以解决 成倍增长数据 的缺陷:
在两份数据中找共同点,比如两份数据里除了关联的字段以外,还有另外相同含义的字段,如果这个字段在所有log中的重复率比较小,则可以用这个字段作为计算hash的值,如果是数字,可以用来模hash的份数,如果是字符可以用hashcode来模hash的份数(当然数字为了避免落到同一个reduce上的数据过多,也可以用hashcode),这样如果这个字段的值分布足够平均的话,就可以解决上述的问题。-
相关文章推荐
- MapReduce的分片规则及其数据倾斜的解决思路
- MapReduce中数据倾斜的产生和解决办法详解
- mapreduce解决数据倾斜的思路
- Mapreduce中的DistributedCache应用-解决join算法中数据倾斜问题
- 第137课: Spark面试经典系列之数据倾斜解决之Map 端Reduce及问题思考
- 第138课: Spark面试经典系列之数据倾斜解决之采样分而治之解决方案
- mapreduce处理数据倾斜的一些方法
- mapreduce任务中数据分布倾斜导致reduce负载不均衡的解决方案
- Hadoop MapReduce 性能调优:减小数据倾斜的性能损失
- hadoop join数据倾斜解决方法
- 136课: Spark面试经典系列之数据倾斜解决原理和方法总论.
- 大规模数据相似度计算时,解决数据倾斜的问题的思路之一(分块思想)
- hive数据倾斜原因和解决方法
- 专访周金可:我们更倾向于Greenplum来解决数据倾斜的问题
- Spark数据倾斜解决原理和方法总论
- HBase学习之四: mapreduce处理数据后存储到hbase及错误java.lang.NoClassDefFoundError的解决办法
- 大规模数据相似度计算时,解决数据倾斜的问题的思路之一(分块思想)
- [大牛翻译系列]Hadoop(14)MapReduce 性能调优:减小数据倾斜的性能损失
- MapReduce性能优化_7. 减小数据倾斜的性能损失
- 第140课: Spark面试经典系列之数据倾斜解决之并行度的深度使用