Hadoop_MR

MapReduce流程图:
在这里插入图片描述
Map的过程:

MapRunnable从input split中读取一个个的record,然后依次调用Mapper的map函数,将结果输出。
map的输出并不是直接写入硬盘,而是将其写入缓存memory buffer。
当buffer中数据的到达一定的大小,一个背景线程将数据开始写入硬盘。
在写入硬盘之前,内存中的数据通过partitioner分成多个partition。
在同一个partition中,背景线程会将数据按照key在内存中排序。
每次从内存向硬盘flush数据,都生成一个新的spill文件。
当此task结束之前,所有的spill文件被合并为一个整的被partition的而且排好序的文件。
reducer可以通过http协议请求map的输出文件,tracker.http.threads可以设置http服务线程数。

Reduce的过程:

当map task结束后,其通知TaskTracker,TaskTracker通知JobTracker。
对于一个job,JobTracker知道TaskTracer和map输出的对应关系。
reducer中一个线程周期性的向JobTracker请求map输出的位置,直到其取得了所有的map输出。
reduce task需要其对应的partition的所有的map输出。
reduce task中的copy过程即当每个map task结束的时候就开始拷贝输出,因为不同的map task完成时间不同。
reduce task中有多个copy线程,可以并行拷贝map输出。
当很多map输出拷贝到reduce task后,一个背景线程将其合并为一个大的排好序的文件。
当所有的map输出都拷贝到reduce task后,进入sort过程,将所有的map输出合并为大的排好序的文件。
最后进入reduce过程,调用reducer的reduce函数,处理排好序的输出的每个key,最后的结果写入HDFS。

在这里插入图片描述
在这里插入图片描述

排序的时候:
默认字典排序 (
数据小的时候:插入排序较快
数据大的时候:归并排序较快
)

MR与SPARK比较哪些地方落后?
MR落后的地方:

  • 磁盘IO
  • 排序
  • 额外复制
    由于SPARK和MR都有shuffer托速度 所以不算

split size:128M (老版本64M)
集群默认存放3个副本
机架存放的话会在第一台上存放一个副本,在离最近的一个机架存放第二个副本,第三个副本也存放在第二台机架(为了效率而考虑)

猜你喜欢

转载自blog.csdn.net/qq_39839745/article/details/86559837
今日推荐