一文通俗理解Spark架构、Spark部署方式、配属配置优先级、Spark处理所提交的application的流程、Spark共享变量、Spark监听,以及master、driver、worke...

Spark是一种基于内存计算的计算引擎(通俗地说就是计算速度快),由于其可以将计算的中间结果存放在内存中,因此非常适合于迭代计算和交互式查询

一、Spark的四大核心组件和集群资源调度器

Spark四大核心组件

1.1 Spark的四大核心组件

Spark core定义了Spark基本功能和模块,包含SparkSession、RDD、DAG、Lingage、Cache、broadcast等,并封装了底层通讯框架,是Spark的基础。我们常说的Spark四大核心组件分别是指Spark SQL、Spark Streaming、Spark ML 以及 Spark Graphx,它们担任的角色如下:

  • Spark SQL:通常用于对结构化数据(比如RDBMS)进行SQL操作(比如ETL),交互式查询;
  • Spark Streaming:流计算,严格地说是micro-batch流计算;与之类似的产品有Strom和Flink;关于区别可以参考:https://mp.weixin.qq.com/s/Fb1cW0oN7xYeb1oI2ixtgQ
  • Spark ML: 机器学习,可以利用Spark适合迭代计算的优势来加速机器学习训练,但通常算法人员用的比较多,而开发人员用的较少;
  • Spark GraphX:图计算,没用过。

这四大核心组件都依赖于Spark core才能工作

1.2 Spark的集群资源调度器

通常做大数据处理,至少要具有三个功能,即:

  • 数据存储
  • 数据计算
  • 集群资源管理

比如Hadoop 2.X 就是HDFS、MapReduce、YARN分别负责这三个功能。Spark则采用如下方式:

  • 数据存储:由于Spark本身不支持数据存储模块,通常使用HDFS作为其存储引擎
  • 数据计算:Spark本身就是计算引擎;
  • 集群资源管理:在Spark中称为ClusterManager,Spark自带Standalone scheduler,也可以利用第三方资源管理器,比如Hadoop YARN 和 Mesos以及最近很流行的k8s,即Spark on YARN(生产环境用得最多的方式)、Spark on Mesos 以及 Spark on Kubernetes

二、Spark中常见的专业术语

名称 本质 角色 备注
application 提交给spark处理的应用程序,比如一个jar
transformation操作 一种操作类型,抽象 lazy,直至遇到下一个action操作才执行
action操作 一种操作类型,抽象 立即执行,非lazy
job action操作 1个action操作对应个job
task action或者transformation操作可以分成多个子任务,这里的子任务即task 一般来说 task数=RDD分区数
stage 执行整个application需要分成若干个stage依次先后完成,是一种抽象 当出现shuffler时,认为存在新的stage,一个stage通常包含多个task
RDD 弹性分布式数据集,一种数据结构 Spark中独特的数据结构抽象
DAG 有向无环图,由stages 和 tasks组成 用于指定执行application中的各stage及其task
DAG scheduler 接口 将整个application划分成一个或多个stage 生成相应的task set放到task scheduler中
task scheduler 接口 负责分配具体的task给executor进行处理,向 DAGScheduler 汇报执行情况
driver 进程 application中main方法所在进程,用于管理指定application中的action/transformation操作(即各stages)的执行先后顺序,协调tasks和stages 如果把一个application视为一个建筑工程,那么driver就像是现场指挥,提交一个application就有一个driver
master 服务级别的进程 负责集群级别的全局调度,向cluster manager请求资源并使得这些资源能够为driver所用 一个集群只有一个处于working状态的active master(一台机器),如果是HA则可以多添加一个standby master(另一台机器)
worker/slave 服务级别的进程 即slave,多个executor可以运行在一个worker节点上 一台物理机器上可以布置多个worker节点,由于ip是一致的,通过port来区分同一台机器上不同的worker
executor 线程 真正干活的,用于启动线程池运行任务,负责处理task 一个executor可以负责处理多个task,每个Application拥有独立的一组Executors,一个executor负责处理一个task
cluster manager 服务级别的进程 负责集群级别的资源分配,监控worker节点,保留master为worker节点请求的资源 一个集群只有一个

注:worker节点即slave(Spark采用的是主从架构),定义在spark配置路径{SPARK_HOME}/conf中的slaves文件(需要手动创建,通过copy 现有的slaves.template得到,并添加上worker主机名),比如:

# A Spark Worker will be started on each of the machines listed below.
# 注意此处的slave名必须和hosts文件中定义的slave名一致
# 每个slave占一行
slave1

同时slave(也包括master)还必须在hosts文件中定义,以让Spark知道worker所在机器的IP,比如:

# spark master & slaves
127.0.0.1  master
127.0.0.1  slave1


三、Spark的架构和部署方式

与Hadoop类似,Spark也是采用主从(master/slaves)架构,一个active master 节点(如果是高可用HA则还有一个standby master节点)和若干个worker节点(slaves)

3.1 Spark的架构

Spark架构图

如果将Spark集群类比为一个建筑公司,那么:

Spark集群 建筑公司 备注
master CEO
worker/slave 工程队 active master只有一个,worker可以多个
executor 工程队中的施工人员(真正干活的) 一个worker中executor可以多个
driver 某个工程的现场总指挥 一个application对应一个driver,多个application就会有多个driver,各driver之间互相隔离
cluster manager 资源管家(负责整个公司的资源分配) 一个集群只有一个cluster manager
  • 建筑公司视为众多客户服务的,就像是客户将需求提交到公司CEO,client将自己的application提交到Spark master(比如YARN),这里的client可以是spark-shell或者spark java/scala/python API;
  • 每个client提交application时会请求所需的硬件资源,比如executor个数、executor memory大小、driver memory大小等,只有在Spark集群资源满足所需请求的条件下,新submitted的application才会被accepted,否则需要等待其他application完成或者退出而释放出足够的硬件资源
  • 就像是某位施工人员同一时刻只能在建筑项目中干活一样,某个executor同一时刻只能服务于某一个application,直至该application完成或者退出而得以释放。

3.2 Spark的部署方式

Spark的部署方式有两个因素决定:

  • master:分单机模式(local、local[k]、local[*],其中k为正整数,通常用于开发时的debug)、集群模式(standalone、YARN、Mesos、k8s,生产环境中YARN最常见);
  • deploy-mode:只是当master为集群模式时才生效,分client和cluster
Spark部署方式

生产环境中最常见的部署方式还是yarn-cluster,因为存在如下考虑:

  • 生产环境中通常还需要用到Hadoop的MapReduce,其需要YARN来进行集群的资源分配;Spark on YARN就正好可以共用YARN来负责Hadoop和Spark的资源分配
  • 如果一直使用yarn-client模式提交application,由于driver进程运行在提交application的单机节点上,会导致提交任务的那个节点运行过多的driver进程,而driver进程又要与众多的executor进程通信,因此会导致提交任务的节点单机流量暴增,且加大了该节点的压力
  • 使用yarn-cluster模式提交application时,由于driver会被根据集群负载情况被自动合理地分配到集群中的某个节点上,因此可以实现负载均衡,防止单机流量暴增的出现

综上,yarn-cluster模式有类似于负载均衡的作用,在需要提交多个spark任务时尽量使用yarn-cluster模式

3.3 Spark参数配置的优先级

基本上有3处可以配置Spark的master和deploy-mode的取值:

    // initialize spark context
    val sparkConf = new SparkConf().setAppName("app1").setMaster("yarn")

优先级就是说,当有两处以上对同一个参数进行了设置时,优先级高的生效


四、Spark application提交和处理流程

4.1 Spark提交application的方式

目前Spark支持两种提交application的方式:

  • spark-shell中执行命令:在终端terminal中输入spark-shell或者spark2-shell启动spark client,执行命令比如:
spark2-shell --executor-memory=512m 
# 启动client后会显示:
Welcome to
     ____              __
    / __/__  ___ _____/ /__
   _\ \/ _ \/ _ `/ __/  '_/
  /___/ .__/\_,_/_/ /_/\_\   version 2.1.0
     /_/
        
Using Scala version 2.11.8 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_171)
Type in expressions to have them evaluated.
Type :help for more information.

scala>
# 然后将application的业务代码逐句执行即可
......

4.2 Spark处理所提交的application的流程

(1) 构建Spark Application的运行环境(启动SparkContext),SparkContext向资源管理器(可以是Standalone、Mesos、YARN或k8s)注册并申请运行Executor资源

(2) 资源管理器分配Executor资源并启动StandaloneExecutorBackend,Executor运行情况将随着心跳发送到资源管理器上;

(3) SparkContext根据driver端代码构建DAG图,将DAG图分解成Stage,并把Taskset发送给Task Scheduler。Executor向SparkContext申请Task;

(4) Task Scheduler将Task发放给Executor运行,同时SparkContext将应用程序代码发放给Executor;

(5) Task在Executor上运行,运行完毕释放所有资源

Spark处理所提交的application的流程

五、Spark的共享变量

参考博客:https://www.jianshu.com/p/e09827bce476


六、Spark的监听

参考博客:https://www.jianshu.com/p/7d79092e2d9c


如有错误,敬请指正!

参考:
https://www.cnblogs.com/langfanyun/p/8098804.html
https://blog.csdn.net/addUpDay/article/details/89112712
https://www.jianshu.com/p/da20133ecfea
https://blog.csdn.net/songhao22/article/details/79069983
https://www.cnblogs.com/frankdeng/p/9301485.html

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

推荐阅读更多精彩内容

  • Apache Spark是一个围绕速度、易用性和复杂分析构建的大数据处理框架,最初在2009年由加州大学伯克利分校...
    三万_chenbing阅读 634评论 0 5
  • spark-submit的时候如何引入外部jar包 在通过spark-submit提交任务时,可以通过添加配置参数...
    博弈史密斯阅读 2,724评论 1 14
  • Apache Spark是一个围绕速度、易用性和复杂分析构建的大数据处理框架,最初在2009年由加州大学伯克利分校...
    达微阅读 598评论 0 0
  • Spark是什么 Spark是基于HDFS等分布式存储之上的数据处理分析框架,它擅长批量数据处理,处理流工作负载,...
    奔跑地蜗牛阅读 911评论 0 0
  • 你努力合群的样子,真的特别孤独。 我们究竟是活了三百六十五天,还是活了一天,重复了三百六十四天。 我十几岁就已经死...
    流光余生阅读 222评论 0 1