2012-02-05 65 views
1

我想将两个文件发送到hadoop reducer。 我试过分布式缓存,但是我在主要使用addCacheFile的任何东西似乎都没有在映射器中返回给getLocalCacheFiles。多次输入到hadoop中的映射器

现在我正在使用FileSystem来读取文件,但我正在本地运行,因此我只能发送文件的名称。想知道如果我在真正的hadoop系统上运行,该怎么做。

是否有将值发送给mapper除了它正在读取的文件?

回答

0

我也有很多与分配缓存的问题,以及发送参数。选择工作对我来说是如下:

对于分布式缓存使用: 对我来说是一场噩梦,以便获得url /路径在地图上HDFS文件或降低,但与符号链接它在运行工作 ()的方法作业

DistributedCache.addCacheFile(new URI(file+"#rules.dat"), conf); 
DistributedCache.createSymlink(conf); 

,然后在地图读取或报头减少 ,方法

public static FileSystem hdfs; 

之前和地图然后在设置()方法或减少

hdfs = FileSystem.get(new Configuration()).open(new Path ("rules.dat")); 

对于参数: 发送一些值映射或减少(可能是文件名从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 
    ... 
} 

然后在地图或只是减少类:

int level = Integer.parseInt(conf.get("level")); //this is int, but you can read also strings, etc. 
+0

HDFS我想应该是FSDataInputStream,因为你打开了文件。但我仍然没有找到文件 - 尽管如此,我确实觉得我有点接近它。谢谢 – 2012-02-05 14:26:26

+0

应该新配置()是context.getConfiguration()? – 2012-02-05 14:28:48

+0

对于hdfs是的,你可以尝试FSDataInputStream,你也可以尝试像这样访问hdfs:// ... – Anton 2012-02-05 20:02:30

0

如果需要分布式缓存套件 - 这是一种方法。

getLocalCacheFiles在本地模式和分布式模式下的工作方式不同。 (它实际上不能在本地模式下工作)。

看看这个链接:http://developer.yahoo.com/hadoop/tutorial/module5.html 看的短语:作为一个谨慎注意: