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

[经验分享] Hadoop下远程调试Child子进程 --- 原创

[复制链接]

尚未签到

发表于 2016-12-10 10:48:55 | 显示全部楼层 |阅读模式
  在网上想找Hadoop远程调试Child子进程的文章,但是都没有见到具体步骤是如何操作的,对于初学者来说,要想真正理解MapReduce的shuffle的过程,对Child子进程的调试是必不可少的一项任务,至少对我来说是这样。费了九牛二虎之力,最后终于调试成功,在这里写下经验,分享给后面的hadoop学习爱好者。


我的环境:hadoop-0.20.2


                    ubuntu 11.04


                   在eclipse下安装了hadoop插件进行调试


                   这里要说一下,我的eclipse版本是很老的eclipse3.3.1,hadoop插件版本是hadoop-0.20.2中自带的插件,路径:/hadoop-0.20.2/contrib/eclipse-plugin/hadoop-0.20.2-eclipse-plugin.jar,直接这个插件拷贝到eclipse的plugin目录后重启eclipse就可。之所以使用eclipse3.3.1版本的eclipse是因为,hadoop-0.20.2的eclipse插件对eclipse版本要求较高,需要版本匹配才能运行,我试过在eclipse helio中安装这个插件,但是不能使用,其他版本的eclipse我暂时还没试过,不好意思。


前言


1、hadoop的安装和启动过程我在这里就不详述了,可以参考官方文档 http://hadoop.apache.org/common/docs/r0.19.2/cn/quickstart.html


2、hadoop的eclipse插件的安装和使用过程我这里也不详述了,可以参考网上的很多文章,比如:http://blog.sina.com.cn/s/blog_537770820100byho.html


一、tasktracker的debug模式配置和Chlid子进程的debug模式配置


1.1、先对tasktracker进行debug,在hadoop.sh中找到 elif [ "$COMMAND" = "tasktracker" ] ,并添加tasktracker的调试端口如下:


elif [ "$COMMAND" = "tasktracker" ] ; then
CLASS=org.apache.hadoop.mapred.TaskTracker
HADOOP_OPTS="$HADOOP_OPTS $HADOOP_TASKTRACKER_OPTS
-agentlib:jdwp=transport=dt_socket,address=8200,server=y,suspend=y"
  




1.2、看下图,在eclipse hadoop插件的参数配置中,修改mapred.child.java.opts的参数值为(红线部分):-Xmx 200m -agentlib:jdwp=transport=dt_socket,address=8883,server=y,suspend=y


红线部分表示Child子进程的启动端口为8883,这里的suspend=y是必须的,表示Child子进程启动后会等待远程的debug信息发送过来后再执行代码,因此在发送debug信息之前我们可以在eclipse中下断点,这一点很重要。


二、debug模式启动程序和断点


2.1  我使用的是最简单的WordCount例子来进行讲解,如下图


Run on Hadoop后出来的结果如下,让你选择你自己的配置信息,这里要保证1.2节中配置的项处在第一个选择,这样当你要debug代码的时候,可以选择你配置过的那个,默认是第一个配置项。


2.2   在JvmManager类的第249行和250行各下一个断点,如下图


spawnNewJvm表示重启一个Child子进程,这里是重点。在ubuntu控制台中执行如下命令:ps -aux | grep java,会发现有一个child子进程启动了,如下图


attempt_201201272353_0003_m_000005_0 -1032262400 这是进程号,在eclipse的debug窗口下,也可以看到这个进程


这时候,进程启动了,但是还没执行代码。在通过eclipse的远程调试链接到我们刚启动的Child子进程之前我们要先在Child.java的代码中下断点,如下:


在113行下个断点,下完断点后我们在我们在eclipse下远程调试,链接到这个进程,我们之前设定的端口是8883,如下图:


注意,按上面的步骤走的话务必在113行这里下断点,JvmTask myTask = umbilical.getTask(jvmId);这段代码是通过taskTracker获取对应的Map任务,但是别忘记我们之前在taskTracker上下了断点,taskTracker正处于debug模式,这时候执行这段代码,Child进程会被阻塞。按F6让debug往下走,Child进程阻塞在了taskTracker处,这时候我们回到eclipse的debug窗口,找到taskTracker进程并选中(如下图),按F5让taskTracker往下走,这时候Child子进程就会解除阻塞走过113行就OK了。


继续在MapTask的run(final JobConf job, final TaskUmbilicalProtocol umbilical)方法里面下断点,Child子进程就能调试到MapReduce的Shffle阶段了。


以上是自己在学习过程中的调试经验,希望对大家有帮助,语言和图解都比较粗糙,有些地方难免有遗漏,还望多多指正。

运维网声明 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.yunweiku.com/thread-312301-1-1.html 上篇帖子: 用 Hadoop 进行分布式并行编程, 第 3 部分 下篇帖子: 用protobuf替换hadoop中rpc的返回值
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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