【发布时间】:2015-02-11 23:25:02
【问题描述】:
是否可以从*mapred*.JobConf 创建一个有效的*mapreduce*.TaskAttemptID?
背景
我需要为ExistingFileInputFormat 写一个FileInputFormatAdapter。问题是Adapter需要扩展mapred.InputFormat而Existing格式扩展mapreduce.InputFormat。
我需要构建一个mapreduce.TaskAttemptContextImpl,以便我可以实例化ExistingRecordReader。但是,我无法创建有效的 TaskId...taskId 显示为 null。
那么我如何从mapred.JobConf 获取taskId、jobId 等。
特别是在适配器的getRecordReader 中,我需要执行以下操作:
public org.apache.hadoop.mapred.RecordReader<NullWritable, MyWritable> getRecordReader(
org.apache.hadoop.mapred.InputSplit split, JobConf job, Reporter reporter) throws IOException {
SplitAdapter splitAdapter = (SplitAdapter) split;
final Configuration conf = job;
/*************************************************/
//The problem is here, "mapred.task.id" is not in the conf
/*************************************************/
final TaskAttemptID taskId = TaskAttemptID.forName(conf.get("mapred.task.id"));
final TaskAttemptContext context = new TaskAttemptContextImpl(conf, taskId);
try {
return new RecordReaderAdapter(new ExistingRecordReader(
splitAdapter.getMapRedeuceSplit(),
context));
} catch (InterruptedException e) {
throw new RuntimeException("Failed to create record-reader.", e);
}
}
这段代码抛出异常:
Caused by: java.lang.NullPointerException
at org.apache.hadoop.mapreduce.task.TaskAttemptContextImpl.<init>(TaskAttemptContextImpl.java:44)
at org.apache.hadoop.mapreduce.task.TaskAttemptContextImpl.<init>(TaskAttemptContextImpl.java:39)
'super(conf, taskId.getJobID());'正在抛出异常,很可能是因为 taskId 为空。
【问题讨论】:
标签: java hadoop mapreduce hive