2012-05-13 27 views
1

我想要一个小的文件传递给我使用GenericOptionsParser-files标志运行的作业:如何在Hadoop Map/Reduce作业中访问DistributedCache?

$ hadoop jar MyJob.jar -conf /path/to/cluster-conf.xml -files /path/to/local-file.csv data/input data/output 

据说这是为了将作业发送到我的集群和连接本地文件。 csv在需要时可供Mapper/Reducer使用。当我以伪分布模式运行它时,它工作得很好,但是当我在集群上启动作业时,似乎无法找到该文件。我在读我的映射器的方法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.. 
    } 

    // .. 
} 

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

java.io.FileNotFoundException: File /hdfs/tmp/mapred/staging/hduser/.staging/job_201205112311_011/files/local-file.csv does not exist. 
at com.csvreader.CsvReader.<init>(Unknown Source) 
at com.csvreader.CsvReader.<init>(Unknown Source) 
at com.csvreader.CsvReader.<init>(Unknown Source) 
at MyJob$TheMapper.setup(MyJob.java:167) 
at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:142) 
... 

任何想法,我做错了吗?谢谢。

回答

7

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

当您使用-files,该GenericOptionsParser配置称为tmpfiles工作性质,而DistributedCache使用了一个名为mapred.cache.files属性。

另外,分布式缓存期望文件已经在HDFS中,并将它们复制到任务节点,在任务提交时as-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.. 

}

+0

伟大的工作 - 谢谢! – sa125

相关问题