博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hadoop job解决大数据量关联时数据倾斜的一种办法
阅读量:6443 次
发布时间:2019-06-23

本文共 1244 字,大约阅读时间需要 4 分钟。

转自:

http://www.geminikwok.com/2011/04/02/hadoop-job解å³å¤§æ°æ®éå³èæ—¶æ°æ®å¾æçä¸ç§åæ³/

数据倾斜是指,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),这样如果这个字段的值分布足够平均的话,就可以解决上述的问题。-

 

第二种方法并不好把握,也不是很通用

转载地址:http://ufpwo.baihongyu.com/

你可能感兴趣的文章
css特效实现html表格显示部分内容,当鼠标移上去显示全部。
查看>>
oracle-rownum的理解
查看>>
我的友情链接
查看>>
使用cin.get()而不是system("pause")来避免c++程序一闪而过
查看>>
20分钟mysql入门教程
查看>>
简单的交换两个变量的数值
查看>>
Linux服务器上配置2个Tomcat或者多个Tomcat
查看>>
学习计划书
查看>>
CentOS7安装过程中,磁盘大于2T的报错处理
查看>>
第2章 多态
查看>>
2.6 相对和绝对路径 2.7 cd命令 2.8 创建和删除目录mkdir/rmdir 2.9 rm
查看>>
誉天蝉联“2014年度华为十佳培训合作伙伴”奖项
查看>>
单例模式2014-12
查看>>
【算法学习笔记】54.约瑟夫问题 模拟、逆推动规 SJTU OJ 1038 二哥的约瑟夫
查看>>
python迭代器和生成器(3元运算,列表生成式,生成器表达式,生成器函数)
查看>>
Spring Data JPA在Spring Boot中的应用
查看>>
MySQL聚集索引和非聚集索引
查看>>
反射中的 Class.forName() 与 ClassLoader.loadClass() 的区别
查看>>
Android 开发技术周报
查看>>
作业 20181113-1 版本控制报告
查看>>