图解Hadoop的mapreduce

2017-09-14  本文已影响0人  c80d3894893e

以下文字由小象学院老师提供

从图中可以看出来,其实mapreduce可以分为两个阶段,一个map阶段,一个reduce阶段。他们分别包涵若干个map任务和若干个reduce任务。下面还有啊,不止图上啊, 图上只显示了一个map任务和一个reduce任务,其实下面还有其他的map任务和reduce任务。那,对于map task来讲呢,就是说,它每一个map task,首先它要从HDFS上面,基本上是HDFS上啊,取出若干份数据进行处理。那每一份数据,大家现在应该知道,就是说,它被称为input split,叫一片数据或者一份数据。但是spark从HDFS上面去获取数据的时候也是用的这个方法,也是hadoop之前存在的这种input format形式来取。那map任务首先把它加载进来以后会把它解析成kye-value形式。就是把HDFS上面的数据解析成key-value形式,一行一行的key-value,一行解析成一个key-value。那你说通过什么标准来执行呢?通过什么标准来解释呢?就是我刚刚讲的input format。然后,接下来的这些key-value就会传输给用户编写的map函数所运行。然后会在环形缓冲区中排序,不断地把排好序的文件到磁盘上落地。对了,这个环形缓冲区设计还是很巧妙的。从图中我们可以看到一个分片的过程,一个partition过程。为什么要有这个过程呢?就是因为map任务它需要按partition的,你指定的怎么分片来确定某个map task产生的文件应该被放到那个reduce上去。所以说,这边有个分片任务。所以,这个map最终的结果出来时,它一定是一片一片,内部已经排好序的一个大文件。这边排好序了,这边也排好序了...这个属于这个reduce task,这个属于这个reduce task。下面的map task也一样,传到相应的reduce上去。那另外一点,这个图上可能没有显示出来,还可能有一个combine的过程。如果有combiner的话,它就是会提前在本地做一次reduce。这个什么意思呢?譬如说,在求和时候,比如说你在本地已经有+1,+1,+1....如果你不做combine的话,要把它们一个个1全部传到远端去。如果你在本地做combiner的话,把1加完,发现是100,那好,把100传过去就可以了,就是这个意思。可能不是太确切,大概就是这么个意思。然后呢,reduce任务是从各个map任务拷贝数据,reduce是主动的要数据,reduce取数时也是一片一片的取。每一个map任务已经排好序,然后传到reduce上,但是,如果这些数据超过了一定的值,譬如说,到reduce这边时它的大小超过一定的阈值,那么直接就放到磁盘上面,但是小于一定值,那么直接放在内存里面。因为,它要把这么多分片包括其他过来的分片合成一个大文件,要进行一个归并排序。另外一点,大家注意,因为每一个reduce task要从很多的map task上取数据,如果说你的这个map task非常多的话,那么这边有很多很多的小文件,那万一有很多小文件的话,你看这边展布在机器上。问题是,一是有很多小文件,而是可能把内存挤爆,内存就挂了。最后一点,到sort阶段的时候,reduce任务会将它们排好序,然后做成一个大的文件,传给用户编写好的reduce函数去运行自己。最后去到外部的介质上面,这个外部介质大多数是HDFS,也有可能是HBASE,或者一些线上的任务redis。

上一篇 下一篇

猜你喜欢

热点阅读