提问人:Soumabha Sarkar 提问时间:10/5/2023 最后编辑:Soumabha Sarkar 更新时间:10/5/2023 访问量:21
断点对 TableMapper 类不起作用
Breakpoint not working for TableMapper class
问:
我正在尝试在 Intellij 中调试 hbase mapreducer 作业的 map 函数。hadoop 和 hbase 环境是在我的本地设置的。我们编写了一个从 org.apache.hadoop.hbase.mapreduce.TableMapper 扩展而来的类 TMapper,并在 TableMapReduceUtil 中将该类设置为 Mapper 类。
static class TMapper extends TableMapper<Text, LongWritable> {
public TMapper() {
}
@Override
protected void map(ImmutableBytesWritable rowKey, Result columns, Context context) {
// Mapper code here
System.out.println("Running Mapper");
}
}
以下是jar文件的主要功能
public static void main(String[] args) throws Exception {
ApplicationContext context = ConfigHelperService.loadAppContext();
ConfigHelperService config = context.getBean(ConfigHelperService.class);
System.out.println("Running Map-Reduce");
try {
Configuration hbaseConfig = context.getBean("hbaseConfiguration", Configuration.class);
Scan scan = PopulateHelper.buildScanner(config.getDeleteProcessedRecords(), 0);
Job job = Job.getInstance(hbaseConfig, "EntityPopulator");
int rv = setupAndRunJob(job, scan, config);
System.exit(rv);
} catch (Exception e) {
e.printStackTrace();
Thread.currentThread().interrupt();
}
}
private static int setupAndRunJob(Job job, Scan scan, ConfigHelperService config)
throws IOException, InterruptedException, ClassNotFoundException {
job.setJarByClass(PopulateTable.class);
// Configure the Map process to use HBase
TableMapReduceUtil.initTableMapperJob(
HBaseUtils.getQualifiedTableNameString(Consts.TABLE),
scan, // The scan to execute against the table
TMapper.class, // The Mapper class
Text.class, // The Mapper output key class
LongWritable.class, // The Mapper output value class
job); // The Hadoop job
// Configure the reducer process
job.setReducerClass(TReducer.class);
job.setCombinerClass(TReducer.class);
job.setOutputKeyClass(LongWritable.class);
job.setOutputValueClass(LongWritable.class);
job.setOutputFormatClass(TextOutputFormat.class);
job.setNumReduceTasks(1);
String outputPath = config.getOutputPath() + "/" + new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
log.info("Using output path: " + outputPath);
Path outputDir = new Path(outputPath);
FileOutputFormat.setOutputPath(job, outputDir);
// Execute the job
int rv = job.waitForCompletion(true) ? 0 : 1;
log.info("Job Output written to " + outputDir);
return rv;
}
我正在执行以下命令来运行MapReduce作业
echo hadoop jar ${JARDIR}/my-hbase-0.0.1-SNAPSHOT.jar sa.test.hbase.commands.PopulateTable 2>&1 >> ${LOGFILE}
HADOOP_CLASSPATH=$(hbase classpath) HADOOP_OPTS="${HADOOP_OPTS} -Dmapreduce.map.java.opts='-Xmx1792m -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005' -Dmapreduce.map.memory.mb=2048 hadoop jar ${JARDIR}/my-hbase-0.0.1-SNAPSHOT.jar sa.test.hbase.commands.PopulateTable 2>&1 >> ${LOGFILE}
在 intellij 中,我创建了一个新的远程调试配置,如下所示,在此处输入图像描述
当我运行 hadoop 命令来运行 MapReduce 作业时,它会等待调试器启动。当我从 Intellij 启动调试器时,它连接到 VM,即 localhost:5005,我可以看到主函数断点被命中。但是当我在 TMapper 类的 map 函数中放置调试点并恢复执行时,调试点没有被击中。虽然,从 hadoop stdout 日志中,我可以看到正在打印的 Running Mapper,并且处理了 hbase 表中的数据,将其复制到另一个表,最后删除。
我使用Eclipse执行了相同的步骤,但遇到了同样的问题。Mapper 类中 Map 函数的断点未命中。请告诉我如何使用 Eclipse 或 Intellij 调试 hbase mapreduce 作业。
我尝试使用以下命令运行 jar 文件java -Xdebug -Xrunjdwp:transport=dt_socket,address=5005,server=y,suspend=y -jar my-hbase-0.0.1-SNAPSHOT.jar sa.test.hbase.commands.PopulateTable
并创建了远程调试器。我还尝试将代码调试为 java 应用程序。在这两种情况下,main 函数断点都在工作,而不是 Mapper 类映射函数。
此外,我按照以下文档中编写的步骤进行操作
https://pravinchavan.wordpress.com/2013/04/05/remote-debugging-of-hadoop-job-with-eclipse/
答: 暂无答案
评论