【发布时间】:2015-04-21 16:22:00
【问题描述】:
我玩过各种流式映射减少字数的示例,其中 Hadoop/Hbase 似乎占用了一个大文件并在节点之间平均地破坏它(在换行符处)。然后它将部分文档的每一行提交到我的代码的地图部分。我的问题是,当我有很多小的非结构化和半结构化文档时,如何让 Hadoop 将整个文档提交到我的地图代码?
【问题讨论】:
我玩过各种流式映射减少字数的示例,其中 Hadoop/Hbase 似乎占用了一个大文件并在节点之间平均地破坏它(在换行符处)。然后它将部分文档的每一行提交到我的代码的地图部分。我的问题是,当我有很多小的非结构化和半结构化文档时,如何让 Hadoop 将整个文档提交到我的地图代码?
【问题讨论】:
文件拆分由 InputFormat.getSplits 计算。因此,对于每个输入文件,它都会获得拆分数量,并且每个拆分都提交给映射器。现在基于 InputFormat Mapper 将处理输入拆分。
我们有不同类型的输入格式,例如 TextInputFormat,它将文本文件作为输入,并且对于每个拆分,它提供行偏移作为键和整行作为值,以在 Mapper 中的映射方法。其他 InputFormat 也是如此。
现在,如果您有很多小文件,假设每个文件都小于块大小。然后每个文件将提供给不同的映射器。如果文件大小超过块大小,则将其分成两个块并在两个块上执行。
考虑一个示例,其中每个输入文件为 1MB,而您有 64 个这样的文件。还假设您的块大小为 64MB。
现在您将为每个文件启动 64 个映射器。
假设您有 100 MB 的文件,并且您有 2 个这样的文件。
现在您的 100 MB 文件将被拆分为 64MB + 36MB,并且将启动 4 个映射器。
【讨论】: