Java 无法提交并发Hadoop作业
我正在本地机器上运行Java 无法提交并发Hadoop作业,java,hadoop,mapreduce,hbase,phoenix,Java,Hadoop,Mapreduce,Hbase,Phoenix,我正在本地机器上运行Hadoop 2.7,以及HBase 1.4和Phoenix 4.15。我已经编写了一个应用程序,它通过Phoenix提交map reduce作业,删除HBase中的数据。每个作业都由ThreadPoolExecutor的单个线程运行,如下所示: 公共类MRDeleteTask扩展任务{ 私有最终记录器=LoggerFactory.getLogger(MRDeleteTask.class); 私有字符串查询; 公共MRDeleteTask(int-id,字符串q){ 这个.s
Hadoop 2.7
,以及HBase 1.4
和Phoenix 4.15
。我已经编写了一个应用程序,它通过Phoenix提交map reduce作业,删除HBase中的数据。每个作业都由ThreadPoolExecutor
的单个线程运行,如下所示:
公共类MRDeleteTask扩展任务{
私有最终记录器=LoggerFactory.getLogger(MRDeleteTask.class);
私有字符串查询;
公共MRDeleteTask(int-id,字符串q){
这个.setId(id);
this.query=q;
}
@凌驾
公开募捐{
info(“正在运行的任务:+getId());
试一试{
Configuration=HBaseConfiguration.create();
Job Job=Job.getInstance(配置为“phoenix mr Job-”+getId());
LOGGER.info(“映射器输入:“+this.query”);
setInput(作业,DeleteMR.PhoenixDBWritable.class,“表”,查询);
setMapperClass(DeleteMR.DeleteMapper.class);
job.setJarByClass(DeleteMR.class);
job.setNumReduceTasks(0);
setOutputFormatClass(NullOutputFormat.class);
job.setOutputKeyClass(ImmutableBytesWritable.class);
job.setOutputValueClass(Writable.class);
TableMapReduceUtil.addDependencyJars(作业);
布尔结果=job.waitForCompletion(true);
}
捕获(例外e){
LOGGER.info(例如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()
提交任务,并使用返回的futurefuture.isDone()
检查任务状态。作业未提交到Thread,而是从Intellij本地运行。将以下内容添加到作业配置解决了此问题:
conf.set("mapreduce.framework.name", "yarn");