【问题标题】:Accessing files from other filesystems along with hdfs files in a hadoop mapreduce application从其他文件系统访问文件以及 hadoop mapreduce 应用程序中的 hdfs 文件
【发布时间】:2012-11-01 19:15:22
【问题描述】:

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

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

【问题讨论】:

  • 是的,这是可能的。我猜每个tasktracker都必须提供您的非hdfs文件。就像网络共享一样。
  • 你能告诉我我们是怎么做的吗,我用谷歌搜索,我没有找到可以在 hadoop 中处理非 hdfs 文件的示例。非常感谢您的回复
  • 如果您担心文件被拆分,您应该将它们放在 HDFS 上,但使用 FileInputFormat 的子类,当您启动 MapReduce 作业时不会拆分它们。
  • 所以我想要做的是地图的输入将是一个大文件的块,并且这个文件的内容将与我计划保留它的文件进行比较文件系统。你的回答让我想到了另一个问题,能不能在map函数中直接访问hdfs中的文件,文件不会被拆分?

标签: java hadoop


【解决方案1】:

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

【讨论】:

  • 非常感谢。没错,如果我尝试这样做,肯定会导致瓶颈。你有什么建议吗。就我的想法而言,我认为最好将所有这些存储在 hdfs 中并将大文件作为输入提供,当我从映射器函数访问文件时,我可以访问整个文件吗?
  • 您可以将这两个文件都放在 HDFS 中。如果你认为有太多的 map/reducer 正在访问 HDFS 中的文件进行读取,那么可以适当增加文件的复制因子。如果不详细了解需求,就无法解决问题。
  • 请纠正我,但我知道地图缩减作业可能只有一种输入格式。但是大文件必须拆分,小文件不需要拆分,这需要两种输入格式。
【解决方案2】:

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

编辑

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

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 应用程序访问普通文件系统中的文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-27
相关资源
最近更新 更多