zoukankan      html  css  js  c++  java
  • 理解hadoop的Map-Reduce数据流(data flow)

    http://blog.csdn.net/yclzh0522/article/details/6859778

    Map-Reduce的处理过程主要涉及以下四个部分:

    • 客户端Client:用于提交Map-reduce任务job
    • JobTracker:协调整个job的运行,其为一个Java进程,其main class为JobTracker
    • TaskTracker:运行此job的task,处理input split,其为一个Java进程,其main class为TaskTracker
    • HDFS:hadoop分布式文件系统,用于在各个进程间共享Job相关的文件

    image

    1、任务提交

    JobClient.runJob()创建一个新的JobClient实例,调用其submitJob()函数。

    • 向JobTracker请求一个新的job ID
    • 检测此job的output配置
    • 计算此job的input splits
    • 将Job运行所需的资源拷贝到JobTracker的文件系统中的文件夹中,包括job jar文件,job.xml配置文件,input splits
    • 通知JobTracker此Job已经可以运行了

    提交任务后,runJob每隔一秒钟轮询一次job的进度,将进度返回到命令行,直到任务运行完毕。

     

    2、任务初始化

     

    当JobTracker收到submitJob调用的时候,将此任务放到一个队列中,job调度器将从队列中获取任务并初始化任务。

    初始化首先创建一个对象来封装job运行的tasks, status以及progress。

    在创建task之前,job调度器首先从共享文件系统中获得JobClient计算出的input splits。

    其为每个input split创建一个map task。

    每个task被分配一个ID。

     

    3、任务分配

     

    TaskTracker周期性的向JobTracker发送heartbeat。

    在heartbeat中,TaskTracker告知JobTracker其已经准备运行一个新的task,JobTracker将分配给其一个task。

    在JobTracker为TaskTracker选择一个task之前,JobTracker必须首先按照优先级选择一个Job,在最高优先级的Job中选择一个task。

    TaskTracker有固定数量的位置来运行map task或者reduce task。

    默认的调度器对待map task优先于reduce task

    当选择reduce task的时候,JobTracker并不在多个task之间进行选择,而是直接取下一个,因为reduce task没有数据本地化的概念。

     

    4、任务执行

    TaskTracker被分配了一个task,下面便要运行此task。

    首先,TaskTracker将此job的jar从共享文件系统中拷贝到TaskTracker的文件系统中。

    TaskTracker从distributed cache中将job运行所需要的文件拷贝到本地磁盘。

    其次,其为每个task创建一个本地的工作目录,将jar解压缩到文件目录中。

    其三,其创建一个TaskRunner来运行task。

    TaskRunner创建一个新的JVM来运行task。

    被创建的child JVM和TaskTracker通信来报告运行进度。

    4.1、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服务线程数。

    4.2、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。

     

    image

     

    5、任务结束

     

    当JobTracker获得最后一个task的运行成功的报告后,将job得状态改为成功。

    当JobClient从JobTracker轮询的时候,发现此job已经成功结束,则向用户打印消息,从runJob函数中返回。


  • 相关阅读:
    一个强迫症用户的锤子手机使用体验
    起点——2015年终总结
    用“MEAN”技术栈开发web应用(三)用mongodb搭建数据库
    用“MEAN”技术栈开发web应用(二)express搭建服务端框架
    SpringBoot/Spring使用@Value进行属性绑定(尚硅谷)
    springboot/spring使用ConfigurationProperties注解读取自定义属性(尚硅谷)
    Spring Boot项目中@SpringBootTest测试的时候卡住,一直Resolving Maven dependencies...
    ASP.NET项目:请使用语言版本6或者更高版本
    安装CUDA坑:CUDA driver version is insufficient for CUDA runtime version
    Failed to load the native TensorFlow runtime. ImportError: libcuda.so.1: cannot open shared object file: No such file or directory
  • 原文地址:https://www.cnblogs.com/bluejoe/p/5115909.html
Copyright © 2011-2022 走看看