Hadoop-如何从mapred中提取taskId.JobConf



是否可以从*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为null。

我通过查看HiveHbaseTableInputFormat找到了答案。由于我的解决方案是针对hive的,所以这非常有效。

 TaskAttemptContext tac = ShimLoader.getHadoopShims().newTaskAttemptContext(
        job.getConfiguration(), reporter);

相关内容

  • 没有找到相关文章

最新更新