[置顶] Map/Reduce Task 远程调试详解

MapTask和ReduceTask都是TaskTracker的Child进程,MapTask, ReduceTask和 TaskTracker是彼此完全独立的JVM。

在MapReduce任务运行过程中他们之间由两个RPC协议进行通信,分别是TaskUmbilicalProtocol(Map/Reduce Task与TaskTracker之间通信)与InterTrackerProtocol(TaskTracker与JobTracker之间通信)。

首先在启动MapReduce服务的时候,TaskTracker与JobTracker两个JVM就已经启动了。运行一个Job的时候,TaskTracker会启动相应的JVM来执行Map/Reduce Task。


一. 关于调试 Map/Reduce Task:

有三个与此相关的属性,分别是:(1) mapred.child.java.opts (2) mapred.map.child.java.opts (3) mapred.reduce.child.java.opts 在conf/mapred-site.xml中添加相应的属性就可以进行对Map/Reduce Task的远程调试。

Step 1. 首先作为远程调试的第一步就是将hadoop的代码导入eclipse。


Step 2. 配置Hadoop远程调试


2.1. 如果希望远程调试MapTask:

在conf/mapred-site.xml文件中加入以下配置,一定要放在<configuration></configuration>之间。

<property> <name>mapred.map.child.java.opts</name> <value>-Xmx1024m -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8883</value> </property> <property> <name>mapred.tasktracker.map.tasks.maximum</name> <value>1</value> </property>

之后提交job,job就会在map 0% reduce 0%的时刻停下来等待远程调试的debugger。

这时候在eclipse中设置相应断点和远程调试,对localhost的8883端口进行远程调试。


2.2. 如果希望远程调试ReduceTask:

在conf/mapred-site.xml文件中加入以下配置,一定要放在<configuration></configuration>之间。

<property> <name>mapred.reduce.child.java.opts</name> <value>-Xmx1024m -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8884</value> </property> <property> <name>mapred.tasktracker.reduce.tasks.maximum</name> <value>1</value> </property>

之后提交job,job就会在map 100% reduce 0%的时刻停下来等待远程调试的debugger。

这时候在eclipse中设置相应断点和远程调试,对localhost的8884端口进行远程调试。


如果成功,程序的控制权则会进入相应的断点。之后就可以进行单步跟踪调试Task了。


二. 关于调试 JobTracker/TaskTracker:

对于 TaskTracker, 修改 $HADOOP_HOME/conf/hadoop-env.sh 文件,在其中添加

HADOOP_TASKTRACKER_OPTS="-Xmx1024m -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8882"

之后运行 $HADOOP_HOME/bin/stop-mapred.sh,$HADOOP_HOME/bin/start-mapred.sh 重启MapReduce服务就可以对TaskTracker进行设断点调试了。

同样的,对于 JobTracker, 修改 $HADOOP_HOME/conf/hadoop-env.sh 文件,在其中添加

HADOOP_JOBTRACKER_OPTS="-Xmx1024m -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8881"

之后运行 $HADOOP_HOME/bin/stop-mapred.sh, $HADOOP_HOME/bin/start-mapred.sh 重启MapReduce服务就可以对JobTacker进行设断点调试了。


需要注意的是,如果希望让Task(MapTask或者ReduceTask)暴露远程调试端口的话,那么在这个node上任意时刻必须只有一个Task在运行,否则在一个node上会有多个并行的Task同时监听同一个远程调试端口,将会产生端口错误并导致Task以及整个Job失败。 可以通过修改mapred.tasktracker.map.tasks.maximum和 mapred.tasktracker.reduce.tasks.maximum 属性为1,来强制控制单个node并行的Task数量为1 。


三. 在Hadoop-2.2.0及以上版本中,由于不再有JobTracker以及TaskTracker的概念和角色(已经替换成ResourceManager和NodeManager),所以在这些版本中已经不再存在 mapred.tasktracker.map.tasks.maximum 和mapred.tasktracker.reduce.tasks.maximum 这两个属性。那么如何强制设置并行的Task数量为1来进行远程调试呢?

在Hadoop-2.2.0中,现在可以通过修改 yarn-site.xml 这个文件中的属性来控制并行的Task数量。

<property> <name>yarn.nodemanager.resource.memory-mb</name> <value>4096</value> </property>

上面这个属性设置单个node拥有的可分配的内存数量为4GB。

<property> <name>yarn.scheduler.minimum-allocation-mb</name> <value>2048</value> </property>

上面这个属性设置单个container最少获得的内存数量为2GB。


运行stop-yarn.sh和start-yarn.sh来重启yarn服务,之后运行job就会发现任意时刻一个node上只有一个Task在运行。

你可能感兴趣的:([置顶] Map/Reduce Task 远程调试详解)