MapReduce
话接上篇,既然HDFS将文件分分散存放在各个节点了,那么也就可以在每个存储节点来单独计算了,毕竟人多力量大。没错,MapReduce 就是这么干的,调用Hadoop 提供的API,将map任务和reduce任务写好,打包上传到Hadoop框架就可以由集权来调度资源执行计算任务了,至于如何调度下篇再聊,这里主要聊一下map-reduce。
为什么时map-reduce呢,先来看一下归并排序
public void mergeSort (int[] arr, int begin, int end){
}
这里体现的就是分治思想,map-reduce也使用的这种思想,将一个大任务分成多个小任务,它将其定义成了两个阶段,map阶段和reduce阶段,“分”这个阶段干的事请在map时做,“合”这个阶段干的事请在reduce时做,以大数据中的helloworld为例,
首先获取数据,在map时将数据分为<word, 1> 这种pair的形式,reduce中将同一个word的pair累计,就得到了每个word的词频。编写的map和reduce类需要用到一个driver来驱动。其中数据怎么分片,map和reduce之间数据怎么传输框架都帮我们搞定了(毕竟框架,人家说了怎么干照着干就行了)。虽然传输不需要我们操心,但是可以看到map和reduce中的形参都不是java的普通数据类型,而是hadoop自定义的,这是为什么呢?因为如前所示的<word,1>这种形式的数据是需要在不同任务间传输的,不同任务可能运行在不同的节点,将map任务的结果传输到reduce的网络传输就需要序列化和反序列化,hadoop自己实现的数据类型序列化/反序列化更高效。那么问题来了,自定义的bean在hadoop中使用时也要实现writable序列化接口。
前面讲了MapReduce的基本思想,那它内部究竟怎么工作的呢?
1、map端
map端的InputFormat用getSplits
2、reduce端
以wordcount为例,map 仅仅将
3、shuffle
参考文献
附
MapReduce 之helloworld代码。
MapReduce 之使用自定义be’an对象时实现writable序列化接口。
129M会被切成两个小文件吗?
shffule之自定义分区器。