我正在使用hadoop DistributedCache,但遇到了一些麻烦。
我的hadoop处于伪分布式模式。

from here we can see in pseudo-distributed mode we useDistributedCache.getLocalCache(xx) to retrive cached file.

首先,我将文件放入DistributedCache:

DistributedCache.addCacheFile(new Path(
"hdfs://localhost:8022/user/administrator/myfile").toUri(),
            job.getConfiguration());

然后在mapper setup()中检索,但是DistributedCache.getLocalCache返回null。我可以通过查看我的缓存文件
System.out.println("Cache: "+context.getConfiguration().get("mapred.cache.files"));
它打印出来:
hdfs://localhost:8022/user/administrator/myfile
这是我的伪代码:
public static class JoinMapper{
     @Override
protected void setup(Context context){
        Path[] cacheFiles = DistributedCache.getLocalCacheFiles(context
                .getConfiguration());
    System.out.println("Cache
             :"+context.getConfiguration().get("mapred.cache.files"));
      Path cacheFile;
      if (cacheFiles != null) {}
    }
}

xx....

public static void main(String[] args){
             Job job = new Job(conf, "Join Test");
        DistributedCache.addCacheFile(new Path("hdfs://localhost:8022/user/administrator/myfile").toUri(),
            job.getConfiguration());}

很抱歉排版不好。任何人都可以帮助...。

顺便说一句,我可以使用
URI[] uris = DistributedCache.getCacheFiles(context .getConfiguration());
uris返回:
hdfs://本地主机:8022 /用户/管理员/ myfile

当我尝试从uri读取文件时出错,找不到异常。

最佳答案

分布式缓存会将您的文件从HDFS复制到所有TaskTracker的本地文件系统。
您如何阅读文件?如果文件在HDFS中,则必须获取HDFS FileSystem,否则它将使用默认文件(可能是本地文件)。因此要读取HDFS中的文件,请尝试:

FileSystem fs = FileSystem.get(new Path("hdfs://localhost:8022/user/administrator/myfile").toUri(), new Configuration());
Path path = new Path (url);
BufferedReader br = new BufferedReader(new InputStreamReader(fs.open(path)));

关于hadoop - hadoop DistributedCache返回null,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17257023/

10-08 23:34