我在本地系统上运行Hadoop,在eclipse环境中。
我尝试将工作空间中的本地文件放入驱动程序函数中的分布式缓存中:
DistributedCache.addCacheFile(new Path(
"/home/hduser/workspace/myDir/myFile").toUri(), conf);
但是当我尝试从Mapper访问它时,它返回null。 在mapper中,我检查了文件是否被缓存。
System.out.println("Cache: "+context.getConfiguration().get("mapred.cache.files"));
它打印“null”,也是
Path[] cacheFilesLocal = DistributedCache.getLocalCacheFiles(context.getConfiguration());
返回null
。
出了什么问题?
答案 0 :(得分:0)
这是因为您只能从HDFS而不是本地文件系统向分布式缓存添加文件。所以路径不存在。将文件放在HDFS上,并在添加到DistributedCache时使用HDFS路径引用它。
有关详细信息,请参阅DistributedCache。
答案 1 :(得分:0)
添加缓存文件时在路径中添加file://
DistributedCache.addCacheFile(new Path(" file:/// home / hduser / workspace / myDir / myFile"),conf);
答案 2 :(得分:-1)
试试这个
DRIVER Class
Path p = new Path(your/file/path);
FileStatus[] list = fs.globStatus(p);
for (FileStatus status : list) {
/*Storing file to distributed cache*/
DistributedCache.addCacheFile(status.getPath().toUri(), conf);
}
Mapper类
public void setup(Context context) throws IOException{
/*Accessing data in file */
Configuration conf = context.getConfiguration();
FileSystem fs = FileSystem.get(conf);
URI[] cacheFiles = DistributedCache.getCacheFiles(conf);
/* Accessing 0 th cached file*/
Path getPath = new Path(cacheFiles[0].getPath());
/*Read data*/
BufferedReader bf = new BufferedReader(new InputStreamReader(fs.open(getPath)));
String setupData = null;
while ((setupData = bf.readLine()) != null) {
/*Print file content*/
System.out.println("Setup Line "+setupData);
}
bf.close();
}
public void map(){
}