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