当前位置: 移动技术网 > IT编程>数据库>其他数据库 > Spark(一): 基本架构及原理

Spark(一): 基本架构及原理

2019年11月18日  | 移动技术网IT编程  | 我要评论

spark运行模式有local,standalone,yarn,mesos,kubernetes这5种,其中最为常见的是yarn运行模式,它又可分为client模式和cluster模式。这里以spark自带的sparkpi来说明这些运行模式。

本文作为第一篇,先结合sparkpi程序来说明yarn client方式的流程。

以下是spark中examples下的sparkpi程序。

 1 // scalastyle:off println
 2 package org.apache.spark.examples
 3 
 4 import scala.math.random
 5 
 6 import org.apache.spark.sql.sparksession
 7 
 8 /** computes an approximation to pi */
 9 object sparkpi {
10   def main(args: array[string]) {
11     val spark = sparksession
12       .builder
13       .appname("spark pi")
14       .getorcreate()
15     val slices = if (args.length > 0) args(0).toint else 2
16     val n = math.min(100000l * slices, int.maxvalue).toint // avoid overflow
17     val count = spark.sparkcontext.parallelize(1 until n, slices).map { i =>
18       val x = random * 2 - 1
19       val y = random * 2 - 1
20       if (x*x + y*y <= 1) 1 else 0
21     }.reduce(_ + _)
22     println(s"pi is roughly ${4.0 * count / (n - 1)}")
23     spark.stop()
24   }
25 }
26 // scalastyle:on println

这个是spark用于计算圆周率pi的scala程序,思想很简单,就是利用以坐标轴原点为中心画一个边长为2的正方形,原点距离正方形的上下左右边距离均为1,然后再以原点为中心画一个半径为1的圆,此时正方形的面积是4,圆的面积是pi,上面程序所做的就是在正方形里随机取若干个点(比如上面程序默认的20万),计算有多少个点落在圆形里面,那么可以认为这个等式是成立的,即:“圆面积” / “正方形面积” = “落在圆内的点数” / “正方形内的点数”,也就是,pi / 4 = count / (n-1),所以pi = 4 * count / (n-1)。

spark程序可以分为driver部分和executor部分,driver可以认为是程序的master部分,具体而言1~16行和22~25行都是driver部分,其余的17~21行是executor部分,即执行具体逻辑计算的部分,上面程序slices默认是2,也就是说,默认会有2个task来执行计算。

下面来以yarn client方式来执行这个程序,注意执行程序前先要启动hdfs和yarn,最好同时启动spark的history server,这样即使在程序运行完以后也可以从web ui中查看到程序运行情况。

输入以下命令:

[root@brucecentos4 spark]# $spark_home/bin/spark-submit --class org.apache.spark.examples.sparkpi --master yarn --deploy-mode client $spark_home/examples/jars/spark-examples_2.11-2.3.0.jar

以下是程序运行输出信息部分截图,

开始部分:

中间部分:

结束部分:

由于程序是以yarn client方式运行的,因此driver是运行在客户端的(brucecentos4上的sparksubmit进程),同时在brucecentos和brucecentos3上各运行了1个executor进程(进程名字:coarsegrainedexecutorbackend),另外在brucecentos上还有1个名字为executorlauncher的进程,这个进程主要是作为yarn程序中的applicationmaster,因为driver运行在客户端,它仅仅作为applicationmaster为运行executor向resourcemanager申请资源。

sparkui上的executor信息:

brucecentos4上的客户端进程(包含spark driver):

brucecentos上的applicationmaster和executor:

brucecentos3上的executor:

 

下面具体描述下spark程序在yarn client模式下运行的具体流程。

这里是一个流程图:

  • spark yarn client向yarn的resourcemanager申请启动applicationmaster。同时在sparkcontent初始化中将创建dagscheduler和taskscheduler等,由于我们选择的是yarn-client模式,程序会选择yarnclientschedulerbackend。
  • resourcemanager收到请求后,在集群中选择一个nodemanager,为该应用程序分配第一个container,要求它在这个container中启动应用程序的applicationmaster,对应进程名字是executorlauncher。与yarn-cluster区别的是在该applicationmaster不运行sparkcontext,只与sparkcontext进行联系进行资源的分派。
  • client中的sparkcontext初始化完毕后,与applicationmaster建立通讯,向resourcemanager注册,根据任务信息向resourcemanager申请资源(container)。
  • 一旦applicationmaster申请到资源(也就是container)后,便与对应的nodemanager通信,要求它在获得的container中启动coarsegrainedexecutorbackend,coarsegrainedexecutorbackend启动后会向client中的sparkcontext注册并申请task。
  • client中的sparkcontext分配task给coarsegrainedexecutorbackend执行,coarsegrainedexecutorbackend运行task并向driver汇报运行的状态和进度,以让client随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务。
  • 应用程序运行完成后,client的sparkcontext向resourcemanager申请注销并关闭自己。

以上就是个人对spark运行模式(yarn client)的一点理解,其中参考了“求知若渴 虚心若愚”博主的“spark(一): 基本架构及原理”的部分内容(其中基于spark2.3.0对某些细节进行了修正),在此表示感谢。

 

 

 

 

 

 

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网