考虑一个应用程序,该应用程序希望使用以下简化序列Hadoop
来处理大量专有的二进制编码文本数据:MapReduce
- 获取文件或目录的 URL 作为输入
- 读取在输入 URL 下找到的二进制文件列表
- 从每个文件中提取文本数据
- 将文本数据保存到新的提取的纯文本文件中
- 将提取的文件分类为具有特殊特征(例如“上下文”)的(子)格式
- 如有必要,根据上下文拆分每个提取的文本文件
- 使用原始(未拆分)文件的上下文处理每个拆分
- 将处理结果提交到专有数据存储库
第 5 步中确定的特定格式特征(上下文)也作为键值对保存在(小)文本文件中,以便第 6 步和第 7 步可以访问它们。
步骤 6 中的拆分使用自定义InputFormat
类(每种自定义文件格式一个)进行。
为了在 Hadoop 中实现此场景,可以将步骤 1 - 步骤 5 集成到 a 中Mapper
,并将另一个Mapper
用于步骤 7。
这种方法的一个问题是如何让自定义InputFormat
知道使用哪些提取的文件来生成拆分。例如,格式 A 可能表示 2 个提取的文件,其特征略有不同(例如,不同的行分隔符),因此 2 个不同的上下文,保存在 2 个不同的文件中。
综上所述,getSplits(JobConf)
每个自定义的方法InputFormat
在拆分之前都需要访问每个文件的上下文。InputFormat
但是,每种格式最多可以有 1 个类,那么如何将适当的提取文件集与正确的上下文文件相关联呢?
一个解决方案可能是使用一些特定的命名约定来关联提取的文件和上下文(反之亦然),但有没有更好的方法?