【问题标题】:one mapper or a reducer to process one file or directory一个 mapper 或 reducer 来处理一个文件或目录
【发布时间】:2012-01-12 07:05:44
【问题描述】:

我是 Hadoop 和 MapReduce 的新手。我在其中有一些目录和文件(每个文件 10 MB 大,N 可能是 100。文件可能已压缩或未压缩),例如: 我的目录 1/文件 1 我的目录 1/文件 2 ... MyDir1/文件N

MyDir2/file1 我的目录2/文件2 ... MyDir3/文件N

我想设计一个 MapReduce 应用程序,其中一个映射器或减速器将处理整个 MyDir1,即我不希望 MyDir1 被拆分到多个映射器中。同样,我希望 MyDir2 完全由其他映射器/减速器处理而不会拆分。

知道如何解决这个问题吗?我需要编写自己的 InputFormat 并读取输入文件吗?

【问题讨论】:

  • 我其实有同样的两个要求。我需要不要拆分文件,因为文件顶部有标题信息。我需要每个映射器一个目录,以便我可以按顺序处理该目录中的文件,因为对文件进行排序(按日期/时间)比对单个行进行排序更有效。

标签: hadoop mapreduce


【解决方案1】:

实现FileInputFormat#isSplitable()。然后输入文件不拆分,每个地图处理一个。请注意,尽管映射器并行执行,但完成作业的时间取决于处理最大输入文件的时间。此外,这可能效率不高,因为节点间会有大量数据混洗。

import org.apache.hadoop.fs.*;
import org.apache.hadoop.mapred.TextInputFormat;
public class NonSplittableTextInputFormat extends TextInputFormat {
    @Override
    protected boolean isSplitable(FileSystem fs, Path file) {
        return false;
    }
}

当前的 API 不允许单个映射器处理整个目录。您可能需要编写自己的InputFormat。或者创建一个要处理的目录列表并将单个目录传递给每个要处理的映射器,这同样不是有效的,因为节点之间的数据混洗。

回到 reducer,它们对映射器的输出 KV 对而不是输入文件/目录进行操作。

【讨论】:

  • 如果这个类是在另一个类中定义的,就像 MR 的标准一样,那么它需要被标记为静态的。
  • @Praveen :你能告诉我为什么在这种情况下会有很多数据洗牌吗?
  • @vishnu :因为在这种特定方法中,无法保证地图正在运行的节点中存在数据。所以,map 进程最有可能从另一个节点拉数据
猜你喜欢
  • 1970-01-01
  • 2010-09-10
  • 1970-01-01
  • 2014-04-15
  • 2015-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多