在hadoop中多次输入Mapper

时间:2012-02-05 11:07:50

标签: hadoop mapreduce

我正在尝试将两个文件发送到hadoop reducer。 我尝试使用DistributedCache,但是我在main中使用addCacheFile放置的任何内容似乎都没有在mapper中使用getLocalCacheFiles返回。

现在我正在使用FileSystem来读取文件,但我在本地运行,所以我只能发送文件的名称。如果我在一个真正的hadoop系统上运行,想知道如何做到这一点。

无论如何都要向mapper发送值,除了它正在读取的文件?

2 个答案:

答案 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.