在Hadoop MapReduce应用程序中访问其他文件系统和HDFS文件

4
我知道我们可以从普通的Java应用程序中调用Map-Reduce作业。在我的情况下,Map-Reduce作业必须处理HDFS上的文件以及其他文件系统上的文件。在Hadoop中是否可以同时访问其他文件系统中的文件并使用HDFS上的文件?这是可能的吗?
因此,我的意图基本上是有一个大文件,我想将其放入HDFS进行并行计算,然后将该文件的块与一些其他文件进行比较(我不想将它们放入HDFS,因为需要一次性访问全长文件)。

1
是的,这是可能的。我猜你的非HDFS文件必须从每个任务跟踪器上可用,就像一个网络共享一样。 - rretzbach
你能告诉我怎么做吗?我已经谷歌过了,但没有找到任何处理Hadoop中非HDFS文件的例子。非常感谢您的回复。 - Nikhil Das Nomula
如果您的担忧是文件被分割,那么您应该将它们放在HDFS上,但使用FileInputFormat的子类,在启动MapReduce作业时不对其进行分割。 - Matt D
所以我想做的是,将一个大文件的块作为映射器的输入,并将该文件的内容与我计划保留在非HDFS文件系统中的文件进行比较。你的回答让我想到了另一个问题,我能否直接在映射函数中访问HDFS中的文件而不会被分割? - Nikhil Das Nomula
2个回答

2

应该可以像处理其他任务一样从mapper/reducer任务中访问非HDFS文件系统。需要注意的是,如果有1000个mapper任务,每个任务都尝试打开非HDFS文件,则根据外部文件系统的类型,这可能会导致瓶颈。同样的情况也适用于从数据库中拉取数据的mapper任务。


非常感谢。没错,如果我尝试这样做,肯定会导致瓶颈。你有什么建议吗?就我目前的想法而言,我认为最好将所有这些内容存储在 HDFS 中,并将大文件作为输入进行提供,当我从映射器函数中访问文件时,我可以访问整个文件吗? - Nikhil Das Nomula
您可以将这两个文件放入HDFS中。如果您认为有太多的映射器/减速器正在访问HDFS中的文件进行读取,那么可以适当增加该文件的复制因子。不知道详细要求的情况下,无法解决此问题。 - Praveen Sripati
请纠正我,但我理解一个MapReduce作业只能有一个InputFormat。但是大文件需要被分割而小文件不需要,这将需要两个InputFormats。 - rretzbach

1

您可以使用分布式缓存将文件分发给映射器,他们可以在其configure()方法中打开和读取文件(不要在map()中读取文件,因为它会被多次调用)。

编辑

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

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.
}

当您的工作完成后,请删除文件。


我认为我没有清楚地表达我的问题。我想在HDFS中有一个文件,而其他三个文件在普通文件系统中,并从map-reduce应用程序中访问普通文件系统中的文件。 - Nikhil Das Nomula

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接