辛星笔记Hadoop权威指南第二篇即数据流

来源:互联网 发布:cnc编程培训 编辑:程序博客网 时间:2024/06/06 01:34

         MapReduce作业也就是job是客户端需要执行的一个工作单元,它包括输入数据、MapReduce程序和配置信息。Hadoop将作业分成若干个小任务task来执行,其中包括两类任务:map任务和reduce任务。

        有两类节点控制着作业执行过程:一个jobtracker以及一系列的tasktracker。其中jobtracker通过调度tasktracker上运行的任务,来协调所有运行在系统上的作业。tasktracker在运行任务的同时将运行进度报告发送给jobtracker,而jobtracker则由此记录没想作业任务的整体进度情况。如果其中一个任务失败,那么jobtracker可以在另外一个tasktracker节点上重新调度该任务。

       Hadoop将MapReduce的输入数据划分成等长的小数据块,我们称之为输入分片(input  split),或者简称为分片。Hadoop为每个分片构建一个map任务,并且由该任务来运行用户自定义的map函数从而处理分片中的每条记录。拥有许多分片,意味着处理每个分片所需要的时间少于处理整个输入数据所化的时间,这样整个处理过程将获得更好的负载均衡。

      如果分片切分的太小,那么管理分片的总时间和构建map任务的总时间将决定着作业的整个执行时间。对于大多数作业来说,一个合理的分片大小趋向于HDFS的一个块的大小,默认是64MB,不过可以针对集群调整这个默认值,在创建所有文件或者新建每个文件时具体指定即可。

     Hadoop在存储有输入数据的节点上运行map任务,可以获得最佳性能。这就是所谓的数据本地化优化,也就是data   locality   optimization。之所以最佳分片大小应该与快大小相同,就是因为他是确保可以存储在单个节点上的最大输入块的大小。如果分片跨越两个数据块,那么对于任何一个HDFS节点,基本上都不可能同时存储这两个数据块,因此分片中的部分数据需要通过网络传输到map任务节点,与使用本地数据运行整个map任务相比,这种方法的效率会更低。

      map任务将其输出写入本地磁盘,而非HDFS,因为map的输出是中间结果,该中间结果由reduce任务处理后才产生最终输出结果,而且一旦作业完成,map的输出结果可以被删除。如果该节点上运行的map任务在将map中间结果传送给reduce任务之前失败,Hadoop将会在另一个节点上重新运行这个map任务以再次构建map中间结果。

      reduce任务并不具有数据本地化的优势,单个的reduce任务的输入通常来自于所有mapper的输出。因此,排序之后的map输出需要通过网络传输发送到运行reduce任务的节点上。数据在reduce端合并,然后由用户定义的reduce函数处理。reduce的输出通常存储在HDFS中以实现可靠存储。每个reduce输出的HDFS块,第一个复本存储在本地节点上,其他复本存储在其他机架节点中。因此,reduce的输出写入HDFS确实需要占用网络宽带,但这与正常的HDFS流水线写入的消耗一样。

     reduce任务的数量并非由输入数据的大小决定,而是特别指定的。如果有多个reduce任务,则每个map任务都会对其输出进行分区,即为每个reduce任务创建一个分区。每个分区中都有许多键及其对应值,但每个键对应的键值对记录都在同一分区中。分区由用户定义的分区函数控制,但是通常默认的分区器(也可以理解为分区函数,partitioner)通过哈希函数来区分,这种方法很高效。

     map任务和reduce任务之间的数据流通常称为shuffle,也就是混洗。因为每个reduce任务的输入都来自于许多map任务,混洗一般比较复杂,而且调整混洗参数对作业总执行时间会有非常大的影响。

      也有可能出现无reduce任务的情况,这种情况下,唯一的非本地节点数据传输就是map任务将结果写入HDFS。

0 0