Hadoop

mac2024-05-12  31

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个副本 机架存放的话会在第一台上存放一个副本,在离最近的一个机架存放第二个副本,第三个副本也存放在第二台机架(为了效率而考虑)  

最新回复(0)