【问题标题】:Unable to submit concurrent Hadoop jobs无法提交并发 Hadoop 作业
【发布时间】:2020-07-20 19:50:30
【问题描述】:

我在本地机器上运行Hadoop 2.7,以及HBase 1.4Phoenix 4.15。我编写了一个应用程序,它提交通过 Phoenix 删除 HBase 中的数据的 map reduce 作业。每个作业都由 ThreadPoolExecutor 的单个线程运行,如下所示:

public class MRDeleteTask extends Task {

    private final Logger LOGGER = LoggerFactory.getLogger(MRDeleteTask.class);
    private String query;
    public MRDeleteTask(int id, String q) {
        this.setId(id);
        this.query = q;
    }

    @Override
    public void run() {
        LOGGER.info("Running Task: " + getId());
        try {
            Configuration configuration = HBaseConfiguration.create();
            Job job = Job.getInstance(configuration, "phoenix-mr-job-"+getId());
            LOGGER.info("mapper input: " + this.query);
            PhoenixMapReduceUtil.setInput(job, DeleteMR.PhoenixDBWritable.class, "Table", QUERY);
            job.setMapperClass(DeleteMR.DeleteMapper.class);
            job.setJarByClass(DeleteMR.class);
            job.setNumReduceTasks(0);
            job.setOutputFormatClass(NullOutputFormat.class);
            job.setOutputKeyClass(ImmutableBytesWritable.class);
            job.setOutputValueClass(Writable.class);
            TableMapReduceUtil.addDependencyJars(job);
            boolean result = job.waitForCompletion(true);

        }
        catch (Exception e) {
            LOGGER.info(e.getMessage());
        }
    }
}

如果 ThreadPoolExecutor 中只有 1 个线程,一切都很好。如果同时提交多个这样的 Hadoop 作业,则不会发生任何事情。根据日志,错误如下所示:

4439 [pool-1-thread-2] INFO  MRDeleteTask  - java.util.concurrent.ExecutionException: java.io.IOException: Unable to rename file: [/tmp/hadoop-user/mapred/local/1595274269610_tmp/tmp_phoenix-4.15.0-HBase-1.4-client.jar] to [/tmp/hadoop-user/mapred/local/1595274269610_tmp/phoenix-4.15.0-HBase-1.4-client.jar]

4439 [pool-1-thread-1] INFO  MRDeleteTask  - java.util.concurrent.ExecutionException: ExitCodeException exitCode=1: chmod: /private/tmp/hadoop-user/mapred/local/1595274269610_tmp/phoenix-4.15.0-HBase-1.4-client.jar: No such file or directory

使用ThreadPoolExecutor.submit() 提交任务,并使用返回的未来future.isDone() 检查其状态。

【问题讨论】:

    标签: java hadoop mapreduce hbase phoenix


    【解决方案1】:

    作业没有提交到 YARN,而是从 Intellij 在本地运行。将以下内容添加到作业配置中解决了该问题:

    conf.set("mapreduce.framework.name", "yarn");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-14
      • 1970-01-01
      相关资源
      最近更新 更多