jdb调试不能命中断点

我在stop at com.chinahadoop.example1.SumCountMaxMinQuery:30 设置断点后,
总是提示该行没有代码,但是我eclipse中查看代码30行是有代码的啊,
为什么?
1.png 2.png

fish - Hadooper

赞同来自: 小飞象

断点位置应该是com.chinahadoop.bigdata.WordCount$TokenizerMapper:33 你这行是在内部类中的啊,不是在WordCount这个类中。

小飞象 - 学号19

赞同来自:

老师,又测试了一下,发现在代码中,如果stop at stop at com.chinahadoop.example1.SumCountMaxMinQuery:73 就可以命中断点了,然后发现这个代码是在main方法中的代码。 测试结果是:main方法中的代码可以命中断点,以外的不能命中。   那么请问像图中的TokenizerMapper这个内部类中的断点怎么命中呢?

fish - Hadooper

赞同来自:

Mapper是在各台nodemanager上执行的,你在提交机上设置断点,当然无法命中(因为在提交机上不会执行mapper)。 你可以将执行方式设置为local,这样就可以命中断点了(但这种方法无法调试大数据场景)。   切记mapper、reducer是在不同机器上执行的,设置断点,也要attach到任务所执行的机器上设置。

小飞象 - 学号19

赞同来自:

图h1,图h2,是我用local的执行方式的操作过程,但还是不能命中。 但我用eclipse远程调试,就可以命中该断点,为什么? 是因为我的hadoop环境是集群环境吗?还是jdb调试要在单机的hadoop环境中才能用?  

fish - Hadooper

赞同来自:

你提交任务的时候suspend参数设置的是什么?(我觉得你应该修改了hadoop脚本将jdwp的那些参数加进去了吧?)

小飞象 - 学号19

赞同来自:

我修改了vi bin/hadoop 文件,修改代码如图h3和h4: ,这两张修改方法都试过了,还是不能命中断点

fish - Hadooper

赞同来自:

也就是说启动应用之后,它没有立刻继续执行,jdb进来之后设置断点失败。 情况是如此么?   另外,你这个参数用的是JVM老版本的方法,怎么没按照ppt中的方法设置?(不过这个应该不影响断点命中)

fish - Hadooper

赞同来自:

我又看了下你前面的图片,有两个问题:   1. 为何监听50010这个端口?这个习惯不太好,这是datanode的默认监听端口。不过你提交机上没有datanode,我看监听已经启动了。 2. com.chinahadoop.work.name=local,这个配置从哪里听来的?它不是设置local方式提交任务的方法啊。

小飞象 - 学号19

赞同来自:

执行脚本:bin/hadoop jar /mnt/workspace/bigdata/target/bigdata-0.0.1-SNAPSHOT.jar com.chinahadoop.bigdata.WordCount -Dmapreduce.framework.name=local /test/input /test/output 图片没有显示完全,还有我修改为PPT中的的配置了(-agentlib:jdwp=transport=dt_socket,address=8004,server=y,suspend=y)   但还是不能命中

邹冲

赞同来自:

该问题目前已经被锁定, 无法添加新回复