Hive编程指南(pdf+epub+mobi+txt+azw3)
MapReduce计算框架中的输入和输出的基本数据结构是键-值对。当Mapper进程启动后,其将会被频繁调用来处理文件中的每行文本。每次调用中,传递给Mapper的键是文档中这行的起始位置的字符偏移量。对应的值是这行对应的文本。
在WordCount程序中,没有使用字符偏移量(也就是没有使用键)。值(也就是这行文本)可以使用很多种方式进行分割(例如,按照空格分隔是最简单的方式,但是这样会遗留下不需要的标点符号),最终这行文本会被分解成多个单词。我们同时假定Mapper会将每个单词转换成小写,因此对于“FUN”和“fun”会被认为是同一个单词。
最后,对于这行文本中的每个单词,Mapper都会输出一个键-值对,以单词作为键并以数字1作为值(这里1表示“出现1次”)。需要注意的是键和值的输出数据类型和输入数据类型是不同的。
Hadoop神奇的地方一部分在于后面要进行的Sort(排序)和Shuffle(重新分发)过程。Hadoop会按照键来对键-值对进行排序,然后“重新洗牌”,将所有具有相同键的键-值对分发到同一个Reducer中。这里有多种方式可以用于决定哪个Reducer获取哪个范围内的键对应的数据。这里我们先不必考虑这些问题。但是出于说明性目的,我们假设图中使用了一个特殊的按字母数字划分的过程(在实际执行中,会有所不同)。
对于Mapper而言如果只是简单地对每个单词输出计数1这样的处理的话,那么会在Sort和Shuffle过程中产生一定的网络和磁盘I/O浪费(不过,这样并不会减少Mapper的内存使用)。有一个优化就是跟踪每个单词的频数,然后在Mapper结束后只输出每个单词在这个Mapper中的总频数。对于这个优化有好几种实现方式,但是,最简单的方式应该是逻辑是正确的,而且对于这个讨论,理由是充足的。
每个Reducer的输入同样是键-值对,但是这次,每个键将是Mapper所发现的单词中的某一个单词,而这个键对应的值将是所有Mapper对于这个单词计算出的频数的一个集合。需要注意的是键的数据类型和值的集合中元素的数据类型和Mapper的输出是一致的。也就是说,键的类型是一个字符串,而集合中的元素的数据类型是整型。
为了完成这个算法,所有的Reducer需要做的事情就是将值集合中的频数进行求和然后写入每个单词和这个单词最终的频数组成的键-值对。
Word Count不是一个虚构的例子。这个程序所产生的数据可用于拼写检查程序、计算机语言检测和翻译系统,以及其他应用程序。