从 MapReduce 的运行机制看它为什么比 Spark 慢

在 Hadoop1 中,MapReduce 计算框架即负责集群资源的调度,还负责 MapReduce 程序的运行。

一,MapReduce 组成

MapReduce 的运行过程有三个关键进程:

1,大数据应用进程。这是用户启动的 MapReduce 程序进程,主要是指定 Map 和 Reduce 类、输入输出文件路径等,并提交作业给 Hadoop 集群的 JobTracker 进程。

2,JobTracker 进程。这是 Hadoop 集群的常驻进程,且全局唯一。主要负责集群资源分配和任务调度。该进程会根据输入数据量的大小,命令集群中每个 TaskTracker 进程启动相应数量的 Map 进程和 Reduce 进程。

3,TaskTracker 进程。主要负责启动和管理 Map 进程或者 Reduce 进程。因为需要每个数据块都有对应的 map 函数,所以 TaskTracker 进程通常和 HDFS 中 DataNode 进程启动在同一个服务器。也就是说 Hadoop 集群中大多数节点上即运行着 DataNode 进程也运行着 TaskTracker 进程。

在 Hadoop1 中 MapReduce 框架即负责集群的资源调度,还负责 MapReduce 程序的运行。由于这种架构资源调度和计算高度耦合,导致了一个 Hadoop 集群中只能跑 MapReduce 计算任务,无法跑其它的计算任务,维护成本很高。

在后面的 Hadoop2 中改成了 Yarn + MapReduce 架构,将资源的调度工作交给了 Yarn,MapReduce 只负责计算。这样就能保证 Hadoop 集群技能跑 MapReduce 计算任务,还能跑任何支持 Yarn 资源调度的计算任务,比如 Spark,Storm 等。

二,MapReduce 工作流程

上面已经讲了 Hadoop1 中 Mapreduce 运行过程中的三个进程,可以看出 JobTracker 和 TaskTracker 进程是主从关系,主服务器通常只有一台,从服务器有很多台,所有从服务器听从主服务器的调度。主服务器主要负责整个集群资源的分配以及 MapReduce 作业的任务调度,从服务器负责执行具体的任务。

具体的资源分配,作业调度,具体的作业执行过程,先看下图:

image

整个过程大概可以概括为:

1,用户启动大数据应用进程,应用进程 JobClient 将用户作业 Jar 包存储到 HDFS 中,将来这些 jar 包会分发给集群中的服务器执行 MapReduce 计算;

2,应用程序提交作业 job 给 JobTracker;

3,JobTracker 根据作业调度算法创建 JobInprocess 树,每个作业都会有一个自己的 JobInprocess 树;

4,JobInprocess 会根据输入数据片的数目和设置的 Reduce 数目创建相应数量的 TaskInprocess;

5,JobTracker 进程和 TaskTracker 进程进行定时通信;

6,如果 TaskTracker 上有空闲的计算资源,JobTracker 会根据该 TaskTracker 节点的资源和需要分配任务的输入数据块所在节点的情况分配相应的 TaskTracker 计算任务;

7,TaskTracker 收到任务后根据任务类型(是 Map 还是 Reduce)和任务参数 (作业的 jar 包路径、输入文件的路径、要处理的数据在数据库中的起始偏移量和结束偏移量等),启动相应的 Map 进程和 Reduce 进程;

8,Map 进程或者 Reduce 进程启动后,检查本地是否有执行任务的 jar 包文件,如果没有就去 HDFS 上去下载,然后加载 Map 或者 Reduce 代码执行;

9,如果是 Map 进程,就会从 HDFS 读取数据 (通常情况下对应的数据就存储在本机) ,如果是 Reduce 进程就将数据输出到 HDFS 。

三,Spark 的执行流程

Spark 的运行流程和 MapReduce 一个应用一次只运行一个 map 和一个 reduce 不同,Spark 可以根据应用的复杂程度,分割成更多的阶段 (stage) ,这些计算阶段组成一个有向无环图 DAG,Spark 任务调度器可以根据 DAG 的依赖关系执行计算阶段。

所谓的 DAG 就是有向无环图,就是说不同的阶段的依赖关系是有向的,计算过程只能沿着依赖关系方向执行,被依赖的阶段执行完成之前,依赖的阶段不能开始执行,同事依赖关系不能有环型依赖,否则就成为死循环了。下图描述了一个典型的 Spark 运行的 DAG 的不同阶段。

image

从图上看,整个应用被切分成三个阶段,阶段 3 要依赖阶段 1 和阶段 2,阶段 1 和阶段 2 互相不依赖。Spark 在执行调度的时候,先执行阶段 1 和阶段 2 ,完成以后,再执行阶段 3.如果有更多的阶段,Spark 的策略也是一样的。只要根据程序初始化好 DAG,就建立了依赖关系,然后根据依赖关系顺序执行各个计算阶段,Spark 大数据应用的计算就完成了。

负责 Spark 应用的 DAG 生成和管理的组件是 DAGScheduler,DAGScheduler 根据 RDD 之间的依赖关系生成 DAG,每个 stage 的划分依据是 shuffle,每运算到一个涉及到 shuffle 的 RDD 算子就会划分成一个 stage。然后会为每个 stage 分配一定数量的计算任务。

具体的执行过程如下图:

image

大体过程是这样:

1,Spark 应用程序启动在自己的 JVM 进程里,即 Driver 进程,启动后调用 SparkContext 初始化执行配置和输入数据。SparkContext 启动 DAGScheduler 构造执行的 DAG 图,切分成最小的执行单位:task;

2,然后 Driver 向 Cluster Manager 请求计算资源,用于 DAG 分布式计算。Cluster Manager 收到请求后,将 Driver 的主机地址等信息通知给集群的所有节点 Worker;

3,Worker 收到信息后,根据 Driver 的主机地址,根 Driver 通信并注册,然后根据自己的空闲资源领任务,Driver 会根据 DAG 图开始向注册的 Worker 分配任务;

4,Worker 收到任务后,启动 Executor 进程开始执行任务。

三,MapReduce 和 Spark 的异同

其实从本质上讲,Spark 可以算作一种 MapReduce 计算模型的不同实现。Hadoop MapReduce 简单粗暴的根据 shuffle 将大数据计算分成 Map 和 Reduce 两个阶段,然后就完事了。

而 Spark 相对更加细腻,将前一个的 Reduce 和后一个的 Map 连接起来,作为一个阶段持续计算,形成一个更加高效的计算模型,虽然本质依然是 Map 和 Reduce。但这种多个计算阶段依赖执行的方案可以有效的减少对 HDFS 的访问,减少作业的调度执行次数,因此执行速度更快。

并且和 Hadoop MapReduce 主要使用磁盘存储 shuffle 过程中的数据不同,Spark 有限使用内存进行数据存储,包括 RDD 数据。除非内存不够用了,否则尽可能使用内存,这也是 Spark 性能比 Hadoop 高的另一个原因。

总结来说,MapReduce 的计算模型更偏向于面向过程编程,Spark 的编程模型更偏向于面向对象编程。Spark 有三个主要特性:RDD 编程模型更简单DAG 切分的多阶段计算过程更快速使用内存存储中间计算结果更高效。这三个特性使得 Spark 相对 Hadoop MapReduce 可以有更快的执行速度,以及更简单的编程实现。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,165评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,503评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,295评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,589评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,439评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,342评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,749评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,397评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,700评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,740评论 2 313
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,523评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,364评论 3 314
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,755评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,024评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,297评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,721评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,918评论 2 336

推荐阅读更多精彩内容

  • MapReduce框架结构## MapReduce是一个用于大规模数据处理的分布式计算模型MapReduce模型主...
    Bloo_m阅读 3,711评论 0 4
  • spark-submit的时候如何引入外部jar包 在通过spark-submit提交任务时,可以通过添加配置参数...
    博弈史密斯阅读 2,702评论 1 14
  • Zookeeper用于集群主备切换。 YARN让集群具备更好的扩展性。 Spark没有存储能力。 Spark的Ma...
    Yobhel阅读 7,219评论 0 34
  • YarnYarn产生背景:Yarn直接来自于MR1.0MR1.0 问题:采用的是master slave结构,ma...
    时待吾阅读 5,458评论 2 23
  • Apache Spark 是专为大规模数据处理而设计的快速通用的计算引擎。Spark是UC Berkeley AM...
    大佛爱读书阅读 2,801评论 0 20