您的位置:首页 > 运维架构 > 网站架构

Spark作业运行架构原理解析

2018-10-05 11:50 1181 查看

[TOC]

1 说明

根据之前

old li
(百度高级大数据工程师)给的一张草图重新整理,并用
processon
绘图一下,这样就更加清晰了。需要注意的是,这里是基于
Spark 2.x
以下的版本,因为在之前,底层通信是基于
AKKA ACTOR
的方式,但是之后就是使用
RPC
的方式了。(最近原来是想把
spark 2.x
的源码好好阅读一下,但是公司已有的系统都是基于
spark 1.x
的,并且最近才更新到
spark 1.6.3
,所以也不折腾,就把
spark 1.x
的好好搞透,也不影响后面进一步的深入学习与解理,因为这些都是触类旁通的。)

另外,这里的原理图是

spark standalone
模式,关于其它模式(如
spark on yarn
),后面则会再整理一下。

2 运行架构原理图与解析

原理图如下:

说明如下:

  • 1.启动
    Spark
    集群,其实就是通过运行
    spark-all.sh
    脚本来启动
    master
    节点和
    worker
    节点,启动了一个个对应的
    master
    进程和
    worker
    进程;
  • 2.
    worker
    启动之后,向
    master
    进程发送注册信息(该过程基于
    AKKA Actor
    事件驱动模型);
  • 3.
    worker
    master
    注册成功之后,会不断向
    master
    发送心跳包,监听
    master
    节点是否存活(该过程基于AKKA Actor事件驱动模型);
  • 4.
    driver
    Spark
    集群提交作业,通过
    spark-submit.sh
    脚本,向
    master
    节点申请资源(该过程基于
    AKKA Actor
    事件驱动模型);
  • 5.
    master
    收到
    Driver
    提交的作业请求之后,向
    worker
    节点指派任务,其实就是让其启动对应的
    executor
    进程;
  • 6.
    worker
    节点收到
    master
    节点发来的启动
    executor
    进程任务,就启动对应的
    executor
    进程,同时向
    master
    汇报启动成功,处于可以接收任务的状态;
  • 7.当
    executor
    进程启动成功后,就像
    Driver
    进程反向注册,以此来告诉
    driver
    ,谁可以接收任务,执行
    spark
    作业(该过程基于
    AKKA Actor
    事件驱动模型);
  • 8.
    driver
    接收到注册之后,就知道了向谁发送
    spark
    作业,这样在
    spark
    集群中就有一组独立的
    executor
    进程为该
    driver
    服务;
  • 9.
    SparkContext
    重要组件运行——
    DAGScheduler
    TaskScheduler
    DAGScheduler
    根据宽依赖将作业划分为若干
    stage
    ,并为每一个阶段组装一批
    task
    组成
    taskset
    task
    里面就包含了序列化之后的我们编写的
    spark transformation
    );然后将
    taskset
    交给
    TaskScheduler
    ,由其将任务分发给对应的
    executor
  • 10.
    executor
    进程接收到
    driver
    发送过来的
    taskset
    ,进行反序列化,然后将这些task封装进一个叫
    taskrunner
    的线程中,放到本地线程池中,调度我们的作业的执行;

3 疑惑与解答

1.为什么要向Executor发送taskset?

移动数据的成本远远高于移动计算,在大数据计算领域中,不管是

spark
还是
MapReduce
,都遵循一个原则:移动计算,不移动数据

2.因为最终的计算都是在worker的executor上完成的,那么driver为什么要将spark作业提交给master而不提交给worker?

可以举个简单的例子来说明这个问题,假如现在集群有

8 cores
8G
内存(两个
worker
节点,资源一样的,所以每个
worker
节点为
4 cores
4G
),而提交的
spark
任务需要
4 cores
6G
内存,如果要找
worker
,请问哪一个
worker
能搞定?显然都不能,所以需要通过
master
来进行资源的合理分配,因为此时的计算是分布式计算,而不再是过去传统的单个节点的计算了。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  大数据 Spark 架构