如何访问Hadoop Map/Reduce作业中的DistributedCache?
我正在尝试使用如何访问Hadoop Map/Reduce作业中的DistributedCache?,hadoop,mapreduce,distributed-cache,Hadoop,Mapreduce,Distributed Cache,我正在尝试使用GenericOptions Parser的-files标志将一个小文件传递给正在运行的作业: $ hadoop jar MyJob.jar -conf /path/to/cluster-conf.xml -files /path/to/local-file.csv data/input data/output 这将把作业发送到我的集群,并在需要时将local-file.csv附加到Mapper/Reducer。当我在伪分布式模式下运行它时,效果非常好,但是当我在集群上启动作业时
GenericOptions Parser
的-files
标志将一个小文件传递给正在运行的作业:
$ hadoop jar MyJob.jar -conf /path/to/cluster-conf.xml -files /path/to/local-file.csv data/input data/output
这将把作业发送到我的集群,并在需要时将local-file.csv附加到Mapper/Reducer。当我在伪分布式模式下运行它时,效果非常好,但是当我在集群上启动作业时,似乎找不到该文件。我正在使用映射器的设置
方法读取文件,如下所示:
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..
}
// ..
}
公共静态类TheMapper扩展映射器{
@凌驾
公共无效设置(上下文上下文)引发IOException、InterruptedException{
URI[]uriList=DistributedCache.getCacheFiles(context.getConfiguration());
CsvReader csv=新的CsvReader(uriList[0].getPath());
//使用csv文件。。
}
// ..
}
当作业运行时,我得到以下异常:
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)
...
java.io.FileNotFoundException:File/hdfs/tmp/mapred/staging/hduser/.staging/job\u 20120511231\u 011/files/local-File.csv不存在。
请访问com.csvreader.csvreader。(来源不明)
请访问com.csvreader.csvreader。(来源不明)
请访问com.csvreader.csvreader。(来源不明)
在MyJob$TheMapper.setup(MyJob.java:167)
位于org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:142)
...
知道我做错了什么吗?谢谢。这是一个常见的问题,
-files
选项作为DistributedCache之外的一个选项工作
使用-files
时,GenericOptions解析器配置名为tmpfiles
的作业属性,而DistributedCache使用名为mapred.cache.files
的属性
分布式缓存还希望文件已经在HDFS中,并将其复制到任务节点,其中as-files在作业提交时将文件复制到HDFS,然后将其复制到每个任务节点
在您的情况下,要使代码正常工作,只需创建一个文件
对象并命名传入的文件(显然这需要您知道本地文件的文件名,并将其硬编码到映射程序代码中)。该文件将位于当前工作目录中:
@Override
public void setup(Context context) throws IOException, InterruptedException {
CsvReader csv = new CsvReader(new File("local-file.csv"));
// work with csv file..
}这是一个常见的问题,
-files
选项作为DistributedCache之外的一个选项工作
使用-files
时,GenericOptions解析器配置名为tmpfiles
的作业属性,而DistributedCache使用名为mapred.cache.files
的属性
分布式缓存还希望文件已经在HDFS中,并将其复制到任务节点,其中as-files在作业提交时将文件复制到HDFS,然后将其复制到每个任务节点
在您的情况下,要使代码正常工作,只需创建一个文件
对象并命名传入的文件(显然这需要您知道本地文件的文件名,并将其硬编码到映射程序代码中)。该文件将位于当前工作目录中:
@Override
public void setup(Context context) throws IOException, InterruptedException {
CsvReader csv = new CsvReader(new File("local-file.csv"));
// work with csv file..
}