Hadoop:如何使用Context对象在reduce步骤中找出partition_Id

时间:2010-11-16 21:07:37

标签: hadoop mapreduce

在Hadoop API版本中。引入了0.20及以上的Context对象而不是JobConf。

我需要找出使用Context对象:

  1. 当前Reducer的partition_id

  2. 输出文件夹

  3. 使用过时的JobConf我可以通过以下方式找到当前Reducer的partition_id:

    public void configure(JobConf conf){
      int  current_partition = conf.getInt("mapred.task.partition",-1);
    }
    

    我认为使用Context对象我需要在方法

    中进行
    public void setup(Context c)
    
    但是怎么样?那么输出文件夹名称呢?

2 个答案:

答案 0 :(得分:1)

您可以尝试仅在传入数据的第一个键上执行Partitioner类,并且最终会得到一些当前的reducers。

“输出文件夹”不是reducer的属性。严格来说,它是OutputFormat的属性,除了它之外没有人知道它是否是“输出文件夹” - 例如,它可能会输出到RDBMS,在某种SQL表中。对于简单的基于HDFS的输出,它是整个map-reduce作业的属性,因此它通常可以从JobContext访问,即

c.getConfiguration().get("mapred.output.dir")

很可能会为您提供输出目录的URL。

答案 1 :(得分:1)

如果要获取分区,可以使用context.getTaskAttemptID()。getTaskID()。getId()。任务标识由分区标识创建。我在此处列出了相关代码,您可以自行查看ReduceTaskImplTaskImplMRBuilderUtils的代码。


public TaskImpl(JobId jobId, TaskType taskType, int partition,
    EventHandler eventHandler, Path remoteJobConfFile, JobConf conf,
    TaskAttemptListener taskAttemptListener, OutputCommitter committer,
    Token jobToken,
    Credentials credentials, Clock clock,
    Map completedTasksFromPreviousRun, int startCount,
    MRAppMetrics metrics, AppContext appContext) {
  this.conf = conf;
  this.clock = clock;
  this.jobFile = remoteJobConfFile;
  ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
  readLock = readWriteLock.readLock();
  writeLock = readWriteLock.writeLock();
  this.attempts = Collections.emptyMap();
  maxAttempts = getMaxAttempts();
  taskId = MRBuilderUtils.newTaskId(jobId, partition, taskType);
  this.partition = partition;
  ...
}

public static TaskId newTaskId(JobId jobId, int id, TaskType taskType) {
  TaskId taskId = Records.newRecord(TaskId.class);
  taskId.setJobId(jobId);
  taskId.setId(id);
  taskId.setTaskType(taskType);
  return taskId;
}