设为首页 收藏本站
查看: 977|回复: 0

[经验分享] Hadoop Shuffle过程分析

[复制链接]

尚未签到

发表于 2016-12-7 06:04:22 | 显示全部楼层 |阅读模式
hadoop shuffle 优化

在hadoop中,在map/reduce的shuffle阶段,jetty用于数据传输。提高map/reduce的效率,针对shuffle的优化也是很重要的。它可以在以下几个方面进行优化:


  • 优化jetty
  • 减少map输出
  • 用netty来替换jetty
  • 压缩传输

Hadoop Map阶段的输出机制

一个作业由Map Task和Reduce Task组成。通常Map Task的输出,当作Reduce Task的输入。如果该作业没有Reduce Task时,那么该Job的输出目的地为HDFS。在MapTask类中有一个run方法。

@Override
public void run(final JobConf job, final TaskUmbilicalProtocol umbilical)
throws IOException, ClassNotFoundException, InterruptedException {
this.umbilical = umbilical;  // 与tasktracker通信的代理
// start thread that will handle communication with parent
//起一个新的线程reporter去调用umbilical与父节点通信
TaskReporter reporter = new TaskReporter(getProgress(), umbilical,
jvmContext);
reporter.startCommunicationThread();
//检查是否是新api
boolean useNewApi = job.getUseNewMapper();
//初始化map的上下文环境
initialize(job, getJobID(), reporter, useNewApi);
// check if it is a cleanupJobTask
if (jobCleanup) {
runJobCleanupTask(umbilical, reporter);
return;
}
if (jobSetup) {
runJobSetupTask(umbilical, reporter);
return;
}
if (taskCleanup) {
runTaskCleanupTask(umbilical, reporter);
return;
}
if (useNewApi) {
//新的api是位于org.apache.hadoop.mapreduce下面的包
runNewMapper(job, splitMetaInfo, umbilical, reporter);
} else {
//新的api是位于org.apache.hadoop.mapred下面的包
runOldMapper(job, splitMetaInfo, umbilical, reporter);
}
done(umbilical, reporter);
}
 在新api中的输出分两种情况:


  • 如果没有Reduce,那些就通常直接输出到hdfs上,相应地址由mapred.output.dir控制,out为NewDirectOutputCollector; 
  • 如果有Reduce,out为NewOutputCollector,它有一定大小的缓存区kvbuffer,输出的数据会先写到这个缓存里面。这里面有复杂的内存控制机制,需要相关参数来协调,如:io.sort.mb(默认<4096),io.sort.record.percent(default: 0.05),io.sort.spill.percent(default: 0.8)等。io.sort.mb的值不能大于2^12=4096。kvbuffer大小的计算公式如下:( io.sort.mb * (2^20) ) * ( 1 - io.sort.record.percent ),分布到不同partition的kv都会存到这个kvbuffer里面,同时通过两个数组kvoffsets,kvindices来建立索引。如果kvbuffer快要满时,就会spill和写到本地磁盘,存取的格式是IFile格式:<key-len, value-len, key, value> 。

 Shuffer机制

待续... 

Jetty 6.1.14和6.1.26版本比较

近段时间对jetty 6.1.14和jetty 6.1.26进行了一次简单的性能测试(该测试是通过jetty server下载5G的文件),发现前者的传输性能明显优于后者,是后者的三倍左右。jetty 6.1.14在测试过程往往可以达到网卡的最大速度,而jetty 6.1.26就要打3折。在new一个jetty server时可以配置一个bufferSize,这个bufferSize的配置也对它们的性能有一定的影响,根据业务配置一个合适的值是能够提高一定的性能的。
在Jetty和Hadoop的Jira上相继报道了相关bug, 其中就包括:


  • jetty 6.1.14很容易OOM,升级到jetty 6.1.26就没有这个问题, JETTY-1374,
  • jetty 6.1.26很容易造成fetch failure等问题 HADOOP-2980,HADOOP-2389,

上述两个问题很来严重,因此jetty的开发者都建议hadoop 依赖的jetty包升级到7.0以上。
 

PS:

1. 从hadoop日志里经常可以看到以下的输出日志:
2013-05-28 20:07:05,476 INFO org.mortbay.log: org.mortbay.io.nio.SelectorManager$SelectSet@3160e069 JVM BUG(s) - injecting delay35 times
2013-05-28 20:07:05,476 INFO org.mortbay.log: org.mortbay.io.nio.SelectorManager$SelectSet@3160e069 JVM BUG(s) - recreating selector 35 times, canceled keys 561 times

  这是JVM 1.6的一个bug: Selector.select(timeout)时无法block住和select时出现句柄存在(FileExistException)的异常,该bug在jetty中已经作了workround (在代码 org.mortbay.io.nio.SelectorManager中可以查看到),同时JVM 1.7也已经把它修复了。
  2. 关于Java OOM时如何查看Heap相关信息。


  • 可以通过给java加下面这个参数可以在OOM时把Heap信息dump出来:

-XX:+HeapDumpOnOutOfMemoryError

  •  在OOM之前,还可以通过jmap命令导出来:

jmap -dump:format=b,file=<filename.hprof> <pid>

Netty vs Jetty
  待续...

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-310536-1-1.html 上篇帖子: hadoop单表关联 下篇帖子: HADOOP JAVA MapReduce API
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表