如何在Hadoop Map / Reduce作业中访问DistributedCache?

时间:2012-05-13 11:10:13

标签: hadoop mapreduce distributed-cache

我正在尝试使用GenericOptionsParser的{​​{1}}标记将一个小文件传递给我正在运行的作业:

-files

这应该将作业发送到我的集群并附加local-file.csv以在需要时可用于Mapper / Reducer。当我在伪分布式模式下运行它时,它工作得很好,但是当我在集群上启动作业时,似乎无法找到该文件。我正在我的mapper的$ hadoop jar MyJob.jar -conf /path/to/cluster-conf.xml -files /path/to/local-file.csv data/input data/output 方法中读取文件,如下所示:

setup

当作业运行时,我得到以下异常:

public static class TheMapper extends Mapper<LongWritable, Text, Text, Text> {

  @Override
  public void setup(Context context) throws IOException, InterruptedException {

    URI[] uriList = DistributedCache.getCacheFiles( context.getConfiguration() );
    CsvReader csv = new CsvReader(uriList[0].getPath());

    // work with csv file..
  }

  // ..
}

知道我做错了什么吗?感谢。

1 个答案:

答案 0 :(得分:7)

这是一个常见问题 - -files选项与DistributedCache不同。

使用-files时,GenericOptionsParser会配置名为tmpfiles的作业属性,而DistributedCache会使用名为mapred.cache.files的属性。

此外,分布式缓存需要文件已经在HDFS中并将它们复制到任务节点,其中-files在作业提交时将文件复制到HDFS,然后将它们复制到每个任务节点。

在您的情况下,为了使您的代码有效,只需创建一个File对象并命名您传入的文件(显然这需要您知道本地文件的文件名,并将其硬编码到您的映射器中码)。该文件将位于当前工作目录中:

@Override
public void setup(Context context) throws IOException, InterruptedException {
  CsvReader csv = new CsvReader(new File("local-file.csv"));

  // work with csv file..

}