我正在尝试将两个文件发送到hadoop reducer。 我尝试使用DistributedCache,但是我在main中使用addCacheFile放置的任何内容似乎都没有在mapper中使用getLocalCacheFiles返回。
现在我正在使用FileSystem来读取文件,但我在本地运行,所以我只能发送文件的名称。如果我在一个真正的hadoop系统上运行,想知道如何做到这一点。
无论如何都要向mapper发送值,除了它正在读取的文件?
答案 0 :(得分:0)
如果您需要分布式缓存套件 - 这是一种方法。
getLocalCacheFiles在本地模式和分布式模式下的工作方式不同。 (它实际上不能在本地模式下工作)。
请查看以下链接:http://developer.yahoo.com/hadoop/tutorial/module5.html 寻找短语:作为警示:
答案 1 :(得分:0)
我在分发缓存和发送参数方面也遇到了很多问题。对我有用的选项如下:
对于分布式缓存使用情况: 对我来说,在Map或Reduce中获取HDFS文件的URL /路径是一场噩梦,但是使用符号链接它可以工作 在作业的run()方法
DistributedCache.addCacheFile(new URI(file+"#rules.dat"), conf);
DistributedCache.createSymlink(conf);
然后在Map或Reduce中读取 在标题中,方法之前
public static FileSystem hdfs;
然后在Map或Reduce的setup()方法中
hdfs = FileSystem.get(new Configuration()).open(new Path ("rules.dat"));
参数: 将一些值发送到Map或Reduce(可以是从HDFS打开的文件名):
public int run(String[] args) throws Exception {
Configuration conf = new Configuration();
...
conf.set("level", otherArgs[2]); //sets variable level from command line, it could be a filename
...
}
然后在Map或Reduce类中:
int level = Integer.parseInt(conf.get("level")); //this is int, but you can read also strings, etc.