了解MapReduce运行机制

MapReduce初识

Hadoop与MapReduce的关系

Hadoop提供了一个稳定的共享存储和分析系统,存储由HDFS实现,分析由MapReduce实现。

对MapReduce的理解

MapReduce的工作过程分为两个阶段:map阶段和reduce阶段,每个阶段都有键值对作为输入和输出。

MapReduce作业是客户端执行的单位,包括输入数据、MapReduce·程序和配置信息,Hadoop通过把作业分为若干小任务来工作,其中包括map任务和reduce任务。

有两种类型的节点控制着作业的执行过程:jobtracker和多个taskreacker。jobtracker通过调度任务在tasktracker上运行,来协调所有运行在系统上的作业。TaskTracker运行任务的同时把进度报告传送到jobtracker,jobtracker记录着每项任务整体进展情况。如果一个任务失败,jobtracker可以重新调度任务到另一个tasktracker。Hadoop把输入的数据划分成等长的小数据发送到MapReduce,称为输入分片,Hadoop为每个分片创建一个map任务,由他来运行用自定义的map函数来分析每个分片中的记录。

最佳分片的大小与HDFS块大小相同

它是最大的可保证存储在单个节点上的数据量,如果分片跨块,就会存在网络传输,与使用本地数据运行map任务相比,显然效率更低。

map任务把数据输出写入本地磁盘,而不是HDFS

因为map的输出作为中间输出,而中间输出则被reduce任务处理后产生最终结果,一旦作业完成,map的数据就可以删除了。

MapReduce处理数据过程

  • 各个map函数对所划分的数据并行处理,从不同的输入数据产生不同的中间结果输出;
  • 各个reduce也各自并行计算,各自负责处理不同的中间结果数据集合;
  • 进行reduce处理之前,必须等到所有map函数做完,所以在进入reduce前需要有一个同步障,这个阶段也负责对map的中间结果数据进行收集整理,以便reduce更有效的计算最终结果。

MapReduce并行处理的基本过程

转自:https://blog.csdn.net/poorguy_tn/article/details/82110122
在这里插入图片描述

  1. MapReduce库先把user Program的输入文件划分为M份,然后使用fork将用户进程拷贝到集群内其他机器上;
  2. user program的副本中有一个称为master,其余称为worker,master负责调度,为空闲的worker分配作业;
  3. 被分配了Map作业的worker开始读取对应分片的输入数据,Map作业从输入数据中抽取键值对,每一个键值对都可以作为参数传递给map函数,map函数产生的中间键值对被缓冲在内存中。
  4. 缓存的中间键值对会被定期写入本地磁盘中,而且被分为R个区,每个分区会对应一个Reduce作业,这些中间键值对的位置会被通报给master,master负责将信息转发给Reduce worker。
  5. master通知分配了reduce作业的worker,他负责的分区在什么位置,当Reduce worker把所有它负责的中间键值对都读取多来后,先对他们进行排序,使得相同键的键值对聚集在一起,因为不同的键可能会应设在同一分区。
  6. reduce work遍历排序后的中间键值对,对于每一个唯一的键,都将与关联的值传递给reduce函数,reduce函数产生的输出会添加到这个分区的输出文件中。
  7. 当所有map和reduce作业都完成了,master唤醒user program,调用返回user program的代码;
  8. 所有执行完毕后,MapReduce输出放在了R个分区的输出文件总,用户通常并不需要合并这R个文件,而是将其作为输入交给另一个MapReduce程序处理。整个过程中输入数据来自地城分布式文件系统,中间数据是放在本地文件系统的,最终输出数据写入底层分布式文件系统。

注意Map/Reduce作业和map/reduce函数的区别:Map作业处理一个输入数据的分片,可能需要调用多次map函数来处理每个输入键值对,Reduce作业处理一个分区的中间键值对,期间要对每个不同的键调用一次reduce函数,Reduce作业最终也对应一个输出文件。

MapReduce处理思想阶段

MapReduce实际上是分治算法的一种实现,就是将大的问题分解为相同类型的子问题,对子问题进行求解,然后合并成大问题的解。

Input——Map——Sort——Combine——Partition——Reduce——Output

  • Input阶段:数据以一定的格式穿读给Mapper;
  • Map阶段:对输入的键值对进行处理;
  • Sort阶段:对于Mapper的输出进行排序;
  • Combine:对于排序之后键相同的结果进行合并;
  • Partition:将中间合并的结果按照key的范围划分为R份,为Reduce作业的个数;
  • Reduce阶段:对于Mapper阶段的结果进行进一步处理;
  • OutPut:Reduce输出数据。

MapReduce的shuffle机制

MapReduce中,map阶段处理的数据如何传递给reduce阶段,是MapReduce框架中最关键的一个流程,这个流程就叫shuffle。简单地说就是将maptask输出的结果数据分发给reducetask,在分发过程中对数据按key进行了分区和排序。

核心思想

把需要做什么和具体怎么做分开,map函数将输入分类,将需要做的相同的任务以相同的键表示,然后将结果排序分配,将相应的任务分配给reduce,reduce来执行任务。

函数式编程

函数式编程是数学中的函数映射思想,将计算描述为一种表达式求值,函数式程序就是一个表达式。关心类型之间的关系,命令式编程关心解决问题的步骤。

函数式编程的好处

由于命令式编程语言也可以通过类似函数指针的方式来实现高阶函数,函数式的最主要好处是不可变性带来的,没有可变状态,不依赖外部状态也不修改外部状态,函数调用劫夺不依赖调用时间和位置,代码更容易进行推理,不容易出错。

另一个好处就是由于多个线程之间不共享状态,不会造成资源争用,不需要锁来保护,不会出现死锁,可以更好的并发。

在解决某个具体问题的过程中,你的程序能完全用计算来表示,你再组合程序的子部分得到最终程序的过程中,使用的组合方式式计算的组合,那么它就可以说是函数式编程。

个人理解

函数式编程的过程就是你在创造一个黑盒的过程,黑盒里面有各种子表达式组合而成一个整体的表达式,当你完成之后你就只管输入数据,黑盒帮你映射成最终的结果,只要输入数据不变,结果也不会变。就像Python语言中内置的高阶函数,类比jdk8中出现的 lambda表达式和集合的stream方法、stream的filter、map方法。都采用了函数式编程的思想。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值