2012-11-01 41 views
4

我知道我们可以从普通java应用程序调用map-reduce作业。现在在我的情况下,map-reduce作业必须处理hdfs上的文件以及其他文件系统上的文件。我们可以在hadoop中使用hdfs上的文件同时访问其他文件系统中的文件。那可能吗 ?访问其他文件系统中的文件以及hadoop mapreduce应用程序中的hdfs文件

所以基本上我的意图是我有一个大文件,我想将它放在HDFS中用于并行计算,然后将此文件的块与其他一些文件进行比较(我不想将它们放在HDFS中,因为它们是需要为全长文件在一次访问。

+1

是的,这是可能的。我猜,你的非hdfs文件必须可以从每个任务跟踪器中获得。像网络共享一样。 – rretzbach

+0

你能让我知道我们该怎么做,我用Google搜索了一下,我发现没有例子可以处理hadoop中的非hdfs文件。非常感谢你的回复 – user1707141

+0

如果你担心文件分裂,你应该把它们放在HDFS上,但是使用[FileInputFormat]的子类(http://hadoop.apache.org/docs/current/api/ org/apache/hadoop/mapred/FileInputFormat.html),它们在启动MapReduce作业时不分割它们。 –

回答

1

您可以使用distributed cache将文件分发到您的映射器,他们可以打开并阅读他们的configure()方法把文件(不map()因为它会读取它们被称为很多次)。

编辑

为了在映射缩减作业中从本地文件系统访问文件,可以在设置作业配置时将这些文件添加到分布式缓存。

JobConf job = new JobConf(); 
DistributedCache.addCacheFile(new URI("/myapp/lookup.dat#lookup.dat"), job); 

MapReduce框架将确保映射器可以访问这些文件。

public void configure(JobConf job) { 
    // Get the cached archives/files 
    Path[] localFiles = DistributedCache.getLocalCacheFiles(job); 

    // open, read and store for use in the map phase. 
} 

并在作业完成后删除文件。

+0

我想我没有明确表达我的问题。我想在HDFS中有一个文件,而其他三个文件在普通文件系统中,并从map-reduce应用程序访问普通文件系统中的文件。 – user1707141

+0

@ user1707141,请参阅编辑。 – rsp

2

应该可以像任何其他任务一样从mapper/reducer任务访问非HDFS文件系统。需要注意的一点是,如果有1K映射器,并且每个映射器都会尝试打开非HDFS文件,则这可能会导致基于外部文件系统类型的瓶颈。 mapper也可以从数据库中提取数据。

+0

非常感谢。这是对的,如果我试图这样做,它肯定会导致瓶颈。你有什么建议吗。就我的想法而言,我认为将所有这些文件存储在hdfs中并将大文件作为输入并在从mapper函数访问文件时会更好,我可以访问整个文件吗? – user1707141

+0

您可以将这两个文件放在HDFS中。如果您认为太多的映射/缩减器正在HDFS中读取文件,则可以适当增加文件的复制因子。如果不详细了解需求,则无法解决问题。 –

+0

请纠正我,但我明白,地图缩小工作可能只有一个输入格式。但是大文件必须拆分,小文件不需要两个输入格式。 – rretzbach

相关问题