我找到了完成此操作的大量文档和示例,但我认为如果在 map() 函数中完成拆分,这将无法利用分布式系统的强大功能。
我在这个分析中正确吗?
输入文件被拆分并分布在整个服务器集上,允许并行执行映射。您还希望利用映射输出的分区来实现将每个单词的计数收集到一个服务器(分区)所需的排序。通过这种方式,单词的实际计数也可以并行进行。
你是对的,在WordCount 示例中,Mapper
有一些工作要做:对于他提供的每一行,他必须将其拆分为单词并将它们作为键值对发出。
但是您还必须注意,并行化的第一步Mapper
甚至在开始之前就已经完成:(TextInputFormat
在示例中明确提到)将输入文件拆分为行。然后将这些包分发到不同Mappers
的地方 - 并行!
实现“Mappers
业务逻辑”,即将这些行拆分为单词。对我来说这很好。作为替代方案,您可以实现自己的FileInputFormat
(或者扩展TextInputFormat
),它不仅可以逐行拆分输入,还可以逐字拆分。这也是有效的,但是您唯一要做的Mapper
就是获取输入值并将其作为输出键以及“1”作为输出值发出。你更喜欢后者吗?
答案是:据InputFormat
我所知,它并没有并行运行。但是Mappers
做。Mappers
所以对我来说,由许多人负责标记化而不是一个单一的班级听起来更好InputFormat
。
本教程很好地描述了 Hadoop 和 MapReduce 的内部结构。在InputSplits
他们说的段落中:
通过分块处理文件,我们允许多个映射任务并行操作单个文件。如果文件非常大,这可以通过并行性显着提高性能。
我希望这可以帮到你 :-)