Hadoop权威指南 系列学习-关于MapReduce

1.数据流

  MapReduce作业(job)是客户端需要执行的一个工作单元:它包括输入数据、MapReduce程序和配置信息。Hadoop将作业分成若干个任务(task)来执行,其中包括两类任务:map任务和reduce任务。这些任务运行在集群的节点上,并通过YARN进行调度。如果一个任务失败,它将在另一个不同的节点上自动重新调度执行。

  Hapoop将MapReduce的输入数据划分成等长的小数据块,称为输入分片(input split)或简称“分片”。Hadoop为每个分片构建一个map任务,并由该任务来运行自己自定义的map函数从而处理分片中的每条记录。一个合理的分片大小趋向于HDFS的一个块的大小,默认是128MB,不过可以调整这个默认值。

  Hadoop在存储有输入数据(HDFS中的数据)的节点上运行map任务,可以获得最佳性能,因为它无需使用宝贵的集群宽带资源。这就是所谓的“数据本地优化”。但是有时对于一个map任务的输入分片来说,存储该分片的HDFS数据块副本的所有节点可能正在运行其他map任务,此时作业调度需要从某一数据块所在的机架中的一个节点上寻找一个空闲的map槽(slot)来运行该map任务分片,仅仅在非常偶然的情况下,才会使用其他机架中的节点运行该map任务,这将导致机架与机架之间的网络传输。

  为什么最佳分片大小应该与块大小相同:因为它是确保可以存储在单个节点上的最大输入块的大小。如果分片跨越两个数据块,那么对于任何一个HDFS节点,基本上都不可能同时存储这俩个数据块,因此分片中的部分数据需要通过网络传输到map任务运行的节点。

  map任务将其输出写入本地磁盘,而非HDFS。这是因为map的输出是中间结果:该中间结果由reduce任务处理后才产生最终输出结果,而且一旦作业完成map的输出结果就可以删除了

  reduce任务并不具备数据本地化的优势,单个reduce任务的输入通常来自于所有mapper的输出。在本例中,我们仅有一个reduce任务,其输入是所有map任务的输出。因此,排过序的map输出需通过网络传输发送到运行reduce任务的节点。数据在reduce端合并,然后由用户定义的reduce函数处理。reduce的输出通常存储在HDFS中以实现可靠存储。一个reduce任务的完整数据流如下图所示

  reduce任务的数量并非由输入数据的大小决定,相反是独立指定的。

  如果有好多个reduce任务,每个map任务就会针对输出进行分区(partition),即为每个reduce任务建一个分区。每个分区有许多键(及其对应的值),但每个键对应的键-值对记录在同一个分区中。分区可由用户自定义的分区函数控制,但通常由默认的partitioner通过哈希函数来分区,很高效。

  

 

                    一个reduce任务的MapReduce数据流    

  一般情况下,多个reduce任务的数据流如下图所示,该图清除地表明了为什么map任务和reduce任务之间的数据流称之为shuffle(混洗),因为每个reduce任务的输入都来自很多map任务,shuffle一般比图中所示的更复杂,而且调整混洗参数对作业执行时间的影响非常大

  

 

           多个reduce任务的数据流

  当数据处理可以完全并行(既无需混洗时),可能会出现无reduce任务的情况,在这种情况下,唯一的非本地节点数据传输是map任务将结果写入HDFS。

  

 

   combiner函数

  集群上的可用带宽限制了MapReduce作业的数量,因此尽量避免map和reduce任务之间的数据传输是有利的。Hadoop允许用户针对map任务的输出指定一个combiner(就像mapper和reducer一样),combiner函数的输出作为reduce函数的输入,由于combiner属于优化方案,所以Hadoop无法确定要对一个指定的map任务输出记录调用多少次combiner。

  combiner函数不能取代reduce函数。我们仍然需要reduce函数来处理不同map输出中具有相同键的记录。但combiner函数能帮助减少mapper和reducer之间的数据传输量。

   Hadoop Streaming

  Hadoop提供了MapReduce的API,允许你用非java的其他语言来写自己的map和reduce函数。Hadoop Streaming是用Unix标准流作为Hadoop和应用程序之间的接口,所以我们可以使用任何编程语言通过标准输入/输出来写MapReduce程序

 

posted on 2019-11-23 21:36  帝落少年  阅读(218)  评论(0编辑  收藏  举报

导航