对大数据可以理解为 : 存储与计算 : hdfs存储 , mapreduce用来计算
MapReduce : 离线计算 移动计算而不移动数据 。把写好的程序分别拷贝到不同存在数据的主机上
可分为四个阶段 :
一 : split : 从hdfs上存储的数据作为MapReduce的输入 ,即 MapReduce计算的是hdfs上的数据
数据分为很多片段(split0 split1 split 2),每一个片段由一个map线程去执行,而且是并发的去执行
二 :map : 每一个split片段由一个mapTask线程去执行,而且是并发的mapTask线程去执行
map的分析是由程序员开发代码而决定的。将碎片的每个单词取出来,每个单词后面赋值1(键值对结构:单词的本身作为key,1作为value)
三 :Shuffle :合并和排序。将相同key(即单词本身)的进行合并,key相同的放到一个数据块中,作为一个集合传给reduce
四 : reduce : 一个集合并不一定对应一个reduce。多个集合写入一个reduce要依次执行(并非并发执行)。
reduce的个数由程序定义 : 看map输出的数据有多大,越大越多。足够小甚至没有。
reduce得到的数据也是key value : key为单词本身,value为出现的次数
mapreduce最复杂的阶段 Shuffle :
map的输出 :
partition分区(在溢写之前)(默认分区规则:hash模运算,也可由程序员自定义。分区可解决数据倾斜。负载均衡的问题)分区不是把数据立马分开,而是打个标志段,告诉谁谁是哪个区的 。数据在fetch传输的时候才会被分开
sort排序 : 默认排序为字典排序(ascii码)(在溢写之前)
combiner : 合并单词。比如 : cat 1 , cat 1 , cat1 ------>>> cat 3 (数据量大时候)(在溢写之前)
split to disk溢写到磁盘,在溢写过程中产生大量文件,需要combiner合并成大一点的文件(默认合并规则按照hash值合并,也可以自定义),以减少map的输出。然后fetch传输交给reduce。
map跟reduce或许不在一台机器上,不在一台机器上需要将数据拷贝到reduce所在机器上。
已做好的分区标志段写到指定的reduce中(真正分区在此起作用)
reduce :
各个reduce需要从各台机器上的各个map上通过partition分区标志的数据拷贝过来。会产生好多小文件,
所以又进行一次合并(key 单词本身相同的进行合并,此合并不能进行人为控制)。
相同key的数据传给reduce去执行,这个过程不是并发的,但多个reduce之间是可以是并发的
说明:reduce接受map的数据是以block块为单位处理的,所以reduce输入的value为迭代器。(而不是以每条记录为单位)