蓝鸥k8凯发旗舰的旗下品牌:
全国咨询电话:13693348049
您的位置: k8凯发旗舰 > 技术文章 > 【原创】spark standalong模式运行原理剖析

【原创】spark standalong模式运行原理剖析 -k8凯发旗舰

2017-06-16 蓝鸥
3443人 浏览:

  一、概述

  apache spark是一种快速和通用的集群计算系统。它提供java,scala,python和r中的高级api,以及支持一般执行图的优化引擎。它还支持一组丰富的更高级别的工具,包括spark sql用于sql和结构化数据的处理,mllib机器学习,graphx用于图形处理和spark streaming。

  spark除了在mesos或yarn群集管理器上运行,它还提供了一种简单的独立部署模式standalone模式。接下来我们就以下面的wordcount代码为例剖析spark standalone模式的运行原理。理解并掌握spark standalone模式的运行原理对后期进一步学习spark相关技术有很大的帮助,同时也是spark开发工程师岗位面试经常被提问的地方。

  wordcount代码如下:

1.jpg

  standalone运行模式原理概要如下图所示:

2.png

  二、standalong模式运式原理剖析之天龙八“步”

  1、第一步:

  通过spark-submit指令将打好的spark jar包提交到spark集群中运行。先从driver进程开始运行,driver中包含了我们所编写的代码。

  首先执行代码中的前两行代码,

  //创建sparkconf对象  

val conf = new sparkconf().setappname("wordcount")  

//创建sparkcontext对象  

val sc = new sparkcontext(conf)

  这两行代码分别创建了sparkconf和sparkcontext对象,在创建sparkcontext对象的过程中,spark会去做两件很重要的事,就是创建dagscheduler和taskscheduler这两个对象。然后,taskscheduler会通过一个后台进程负责与master进行注册通信,告诉master有一个新的application应用程序要运行,需要master管理分配调度集群的资源。

  2、第二步:

  master接收到taskscheduler的注册请求之后,会通过资源调度算法对集群资源进行调度,并且与worker进行通信,请求worker启动相应的executor。

  3、第三步:

  worker接收到master的请求之后,会在本节点中启动executor。因为集群中有多个worker节点,那么也意味着会启动多个executor。一个application对应着worker中的一个executor。

  4、第四步:

  executor启动完成之后,会向driver中的taskscheduler进行反注册,反注册的目的就是让driver知道新提交的application应用将由哪些executor负责执行。

  5、第五步:

  executor向driver中的taskscheduler反注册完成之后,就意味着sparkcontext的初始化过程已经完成,接下来去执行sparkcontext下面的代码。

  //从linux或者hdfs中获取数据

  val lines = sc.textfile("hdfs://tgmaster:9000/in/resws")

  //进行单词统计计数

  val result = lines.flatmap(_.split(" ")).map((_, 1))

  //将计算结果保存到hdfs中

  result.saveastextfile("hdfs://tgmaster:9000/out/res3")

  sc.stop()

  6、第六步:

  在sparkcontext下面的代码中,创建了初始rdd,并对初始rdd进行了transformation类型的算子操作,但是系统只是记录下了这些操作行为,这些操作行并没有真正的被执行,直到遇到action类型的算子,触发提交job之后,action类型的算子之前所有的transformation类型的算子才会被执行。job会被提交给dagscheduler,dagscheduler根据stage划分算法将job划分为多个stage(阶段),并将其封装成taskset(任务集合),然后将taskset提交给taskscheduler。

  7、第七步:

  taskscheduler根据task分配算法,将taskset中的每一个小task分配给executor去执行。

  8、第八步:

  executor接受到task任务之后,通过taskrunner来封装一个task,并从线程池中取出相应的一个线程来执行task。

  task线程针对rdd partition分区中的数据进行指定的算子操作,这些算子操作包括transformation和action类型的操作。

  补充说明:

  1、taskrunner(任务运行器),会对我们编写代码进行复制、反序列化操作,进行执行task任务。

  2、task分为两大类:shufflemaptask和resulttask。最后一个stage阶段中的task称为resulttask,在这之前所有的task称为shufflemaptask。

网站地图