断点对 TableMapper 类不起作用

Breakpoint not working for TableMapper class

提问人:Soumabha Sarkar 提问时间:10/5/2023 最后编辑:Soumabha Sarkar 更新时间:10/5/2023 访问量:21

问:

我正在尝试在 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/

eclipse 调试 intellij-idea mapreduce HBase

评论


答: 暂无答案