在使用 MapReduce 执行字数统计时,是否可以在 map 函数中将数据拆分为单词



我已经找到了大量的文档和示例,但我认为如果在map()函数中完成拆分,这将无法利用分布式系统的强大功能。

我这个分析正确吗?

输入文件被拆分并分布在整个服务器集上,允许并行映射执行。 您还希望利用映射输出的分区来实现将每个单词的计数收集到一台服务器(分区)上所需的排序。 通过这种方式,实际的字数计数也是并行的。

在 WordCount 示例中,Mapper有一些工作要做,您是对的:对于提供给他的每一行,他都必须将其拆分为单词并将它们作为键值对发出。

但您还必须注意到,并行化的第一步甚至在Mapper开始之前就已经完成:TextInputFormat(在示例中明确提到)将输入文件拆分为行。然后,这些软件包将并行分发到不同的Mappers

Mappers实现"业务逻辑",即将这些行拆分为单词。对我来说,这很好。作为替代方案,您可以实现自己的FileInputFormat(或者扩展TextInputFormat),这不仅可以逐行拆分输入,还可以逐字拆分。这也是有效的,但是您的Mapper唯一要做的就是获取输入值并将其作为输出键与"1"一起作为输出值一起发出。你更喜欢后者吗?

答案是:据我所知,InputFormat不是并行运行的。但Mappers确实如此。所以对我来说,听起来更好,许多Mappers负责标记化而不是一个单一的InputFormat类。

本教程很好地描述了Hadoop和MapReduce的内部结构。在InputSplits的段落中,他们说:

通过以块形式处理文件,我们允许多个映射任务并行处理单个文件。如果文件非常大,则可以通过并行性显著提高性能。

我希望这是有帮助的:-)

最新更新