问题导读
1.TaskTracker的Child进程是哪两个?
2.调试 Map/Reduce Task与那三个属性有关?
3.如果希望远程调试MapTask或则ReduceTask该如何配置?
4.调试 JobTracker/TaskTracker,该如何配置?
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在运行。
|