zoukankan      html  css  js  c++  java
  • Hadoop学习之配置Eclipse远程调试Hadoop

           构建完毕Hadoop项目后,接下来就应该跟踪Hadoop的运行情况,比方在命令行运行hadoop namenode–format时运行了Hadoop的那些代码。当然也能够直接通过阅读源码的方式来做到这一点,但跟踪代码的运行情况更加直观,更easy理解。

           动手配置Eclipse调试Hadoop之前,先大概学习一下JPDA(Java Platform Debugger Architecture,Java平台调试结构)。JPDA是一个多层的调试架构,使工具开发人员能够easy地创建跨平台的,跨VM实现和JDK版本号的调试器。JPDA包括三层:

    • JVM TI:Java VM ToolInterface,定义了VM提供的调试服务。
    • JDWP:Java DebugWire Protocol,定义了调试器进程和debuggee之间的通讯。Debuggee是正在被调试的进程,包括正在被调试的应用程序,执行该应用        程序的VM和后端的调试器。
    • JDI:Java DebugInterface,定义了高层次的Java接口,该接口同意工具开发人员easy地编写远程调试器应用程序。

           JPDA的结构图例如以下所看到的:


           在简介了JPDA的基本信息后(很粗浅,更深入的学习能够參考Java的官方文档,地址为http://docs.oracle.com/javase/8/docs/technotes/guides/jpda/architecture.html#debuggee),以下就要看看该怎样使用JPDA进行程序的调试。

           VM的实现须要命令行选项载入JDWP代理用于调试。从5.0開始,-agentlib:jdwp选项用于载入JDWP代理和指定JDWP代理的选项,5.0之前的版本号使用-Xdebug和-Xrunjdwp选项(5.0版本号也支持-Xdebug和-Xrunjdwp选项)。假设目标虚拟机是5.0或者更新的版本号,-agentlib:jdwp的使用方式为:-agentlib:jdwp=<sub-options>,5.0版本号之前的使用方式为:-Xdebug(启用调试) -Xrunjdwp:<sub-options>。<sub-options>能够进一步指定,格式为:-agentlib:jdwp=<name1>[=<value1>],<name2>[=<value2>]...和 -Xrunjdwp:<name1>[=<value1>],<name2>[=<value2>]...。当中的name能够为例如以下:help、transport、server、address、timeout、launch、onthrow、onuncaught、suspend。当中经常使用的几个为transport、server、address和suspend,transport是指调试器和被调试的VM之间的通信方法,其值能够为dt_socket和dt_shmem;server的值为y或者n,默认值为n,当值为y时,监听调试器程序的连接,否则在address指定的地址上连接调试器;address指定了连接的地址,假设server=y,则在该地址上监听连接,若server=n,则在该地址上连接调试器;suspend的值为y或者n,假设值为y则表示JVM在调试器连接到它之前都会处于暂停状态(更具体的内容能够參考官网文档http://docs.oracle.com/javase/7/docs/technotes/guides/jpda/conninv.html)。以下看几个样例:

    -Xdebug -Xrunjdwp:transport= dt_socket,address=1044,server=y,suspend=n
    -agentlib:jdwp=transport=dt_socket,server=y,address=8000
    -agentlib:jdwp=transport=dt_socket,address=myhost:8000

           在学习了JPDA后,接下来就要配置Eclipse调试Hadoop。打开HADOOP_HOME/bin下的hadoop脚本,找到例如以下的代码:

    elif [ "$COMMAND" = "namenode" ] ; then
      CLASS='org.apache.hadoop.hdfs.server.namenode.NameNode'
      HADOOP_OPTS="$HADOOP_OPTS $HADOOP_NAMENODE_OPTS "

           将其改为:

    elif [ "$COMMAND" = "namenode" ] ; then
      CLASS='org.apache.hadoop.hdfs.server.namenode.NameNode'
      HADOOP_OPTS="$HADOOP_OPTS $HADOOP_NAMENODE_OPTS -agentlib:jdwp=transport=dt_socket,server=y,address=6601,suspend=y"

           新加入代码的意思为启用Java 调试器,并在port6601上监听。做完上述的改动后再打开Eclipse,点击Run菜单下的Debug Configurations子菜单,例如以下图所看到的:


           先选择Remote Java Application,然后点击上面的New launch configurationbutton,出现下图所看到的的对话框,在右側分别输入对应的信息,比方主机名称和port号,port与上面改动hadoop文件时address指定的值保持一致。


           做完上述的配置后,在命令上运行hadoop命令,比方hadoopnamenode –format,命令行的输出显示正在port6601上监听:

    [hadoop@hadoop conf]$ hadoop namenode -format
    Listening for transport dt_socket at address: 6601
    
    [hadoop@hadoop bin]$ start-all.sh 
    starting namenode, logging to /home/hadoop/hadoop-1.2.1/libexec/../logs/hadoop-hadoop-namenode-hadoop.out
    Listening for transport dt_socket at address: 6601

           点击上图右下側的Debugbutton,開始调试Hadoop,调试的情况例如以下图所看到的,能够设置断点跟踪代码的运行情况。


           上面所讲的仅仅是怎样调试NameNode,DataNode的调试与此类似,不再赘述,而MapReduce作业的调试还有待进一步的研究。


  • 相关阅读:
    Class:向传统类模式转变的构造函数
    连载:面向对象葵花宝典:思想、技巧与实践(34)
    Java Web文件下载
    POJ 1469(裸二分匹配)
    查看程序占用tomcat内存情况
    《对象程序设计》课程 课程设计、考试安排 及 教师建议(2014.06.30修正)
    zoj 1880
    STM8S PWM 应用 呼吸灯
    Android开发系列(二十四):Notification的功能与使用方法
    HDU 4499 Cannon (暴力搜索)
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/4353197.html
Copyright © 2011-2022 走看看