共计 3845 个字符,预计需要花费 10 分钟才能阅读完成。
一、Spark on Standalone
1.spark 集群启动后,Worker 向 Master 注册信息
2.spark-submit 命令提交程序后,driver 和 application 也会向 Master 注册信息
3. 创建 SparkContext 对象:主要的对象包含 DAGScheduler 和 TaskScheduler
4.Driver 把 Application 信息注册给 Master 后,Master 会根据 App 信息去 Worker 节点启动 Executor
5.Executor 内部会创建运行 task 的线程池,然后把启动的 Executor 反向注册给 Dirver
6.DAGScheduler:负责把 Spark 作业转换成 Stage 的 DAG(Directed Acyclic Graph 有向无环图),根据宽窄依赖切分 Stage,然后把 Stage 封装成 TaskSet 的形式发送个 TaskScheduler;
同时 DAGScheduler 还会处理由于 Shuffle 数据丢失导致的失败;
7.TaskScheduler:维护所有 TaskSet,分发 Task 给各个节点的 Executor(根据数据本地化策略分发 Task),监控 task 的运行状态,负责重试失败的 task;
8. 所有 task 运行完成后,SparkContext 向 Master 注销,释放资源;
注:job 的失败不会重试
二、Spark on Yarn
yarn 是一种统一的资源管理机制,可以通过队列的方式,管理运行多套计算框架。Spark on Yarn 模式根据 Dirver 在集群中的位置分为两种模式
一种是 Yarn-Client 模式,另一种是 Yarn-Cluster 模式
yarn 框架的基本运行流程图
ResourceManager:负责将集群的资源分配给各个应用使用,而资源分配和调度的基本单位是 Container,其中封装了集群资源(CPU、内存、磁盘等),每个任务只能在 Container 中运行,并且只使用 Container 中的资源;
NodeManager:是一个个计算节点,负责启动 Application 所需的 Container,并监控资源的使用情况汇报给 ResourceManager
ApplicationMaster:主要负责向 ResourceManager 申请 Application 的资源,获取 Container 并跟踪这些 Container 的运行状态和执行进度,执行完后通知 ResourceManager 注销 ApplicationMaster,ApplicationMaster 也是运行在 Container 中;
(1)client
yarn-client 模式,Dirver 运行在本地的客户端上。
1.client 向 ResouceManager 申请启动 ApplicationMaster,同时在 SparkContext 初始化中创建 DAGScheduler 和 TaskScheduler
2.ResouceManager 收到请求后,在一台 NodeManager 中启动第一个 Container 运行 ApplicationMaster
3.Dirver 中的 SparkContext 初始化完成后与 ApplicationMaster 建立通讯,ApplicationMaster 向 ResourceManager 申请 Application 的资源
4. 一旦 ApplicationMaster 申请到资源,便与之对应的 NodeManager 通讯,启动 Executor,并把 Executor 信息反向注册给 Dirver
5.Dirver 分发 task,并监控 Executor 的运行状态,负责重试失败的 task
6. 运行完成后,Client 的 SparkContext 向 ResourceManager 申请注销并关闭自己
(2)cluster
yarn-cluster 模式中,当用户向 yarn 提交应用程序后,yarn 将分为两阶段运行该应用程序:
第一个阶段是把 Spark 的 Dirver 作为一个 ApplicationMaster 在 yarn 中启动;
第二个阶段是 ApplicationMaster 向 ResourceManager 申请资源,并启动 Executor 来运行 task,同时监控 task 整个运行流程并重试失败的 task;
Yarn-client 和 Yarn-cluster 的区别:
yarn-cluster 模式下,Dirver 运行在 ApplicationMaster 中,负责申请资源并监控 task 运行状态和重试失败的 task,当用户提交了作业之后就可以关掉 client,作业会继续在 yarn 中运行;
yarn-client 模式下,Dirver 运行在本地客户端,client 不能离开。
Dirver 与集群间的通信主要有以下几点:
1. 注册 Dirver 信息
2. 根据宽窄依赖切分 stage
3. 注册 Application 信息
4. 分发 task
5. 监听 task 的运行状态
6. 重试失败的 task
7. 重试失败的 stage
Spark 的数据本地化机制有以下 5 种:
1、PROCESS_LOCAL 进程本地化
2、NODE_LOCAL 节点本地化
3、NO_PREF 读取的数据在数据库中
4、RACK_LOCAL 机架本地化
5、ANY 跨机架
如何选择数据本地化的级别?
TaskScheduler 发送的 task 在 Executor 上无法执行时,TaskScheduler 会降低数据本地化的级别,再次发送,如果还是无法执行,再降低一次数据本地化的级别,再次发送,直至可以执行。
默认每次等待 3s,重试 5 次,之后降一级本地化级别。
如何提高数据本地化的级别?
task 执行的等待时间延长,从原来的 3s 提高到 6s
提高数据本地化的级别要注意,不要本末倒置
spark.locality.wait 默认 3s
spark.locality.process 等待进程本地化的时间,默认与 spark.locality.wait 相等
spark.locality.node
spark.locality.rack
Spark shuffle 阶段的数据传输
MapOutputTrackerWorker(从):在 spark 集群的每个 worker 中,负责将本地的 map output block 信息发送给 master 中的 MapOutputTrackerMaster
MapOutputTrackerMaster(主):在 spark 集群的 master 中,负责记录各个 worker 节点的 map output block 信息
BlockManager:每个 Executor 中的 BlockManager 实例化的时候都会向 Dirver 中的 BlockManagerMaster 注册信息,而 BlockManagerMaster 会创建 BlockManagerInfo 来管理元数据信息
BlockManagerMaster:在 DAGScheduler 对象中,管理元数据信息
BlockManagerSlaveEndpoint:在 Executor 端,负责接收 BlockManagerMaster 发送过来的信息
BlockTransferService:传输各个节点的 block
MemoryStore、DiskStore
更多 Spark 相关教程见以下内容:
CentOS 7.0 下安装并配置 Spark http://www.linuxidc.com/Linux/2015-08/122284.htm
Ubuntu 系统搭建单机 Spark 注意事项 http://www.linuxidc.com/Linux/2017-10/147220.htm
Spark1.0.0 部署指南 http://www.linuxidc.com/Linux/2014-07/104304.htm
Spark2.0 安装配置文档 http://www.linuxidc.com/Linux/2016-09/135352.htm
Spark 1.5、Hadoop 2.7 集群环境搭建 http://www.linuxidc.com/Linux/2016-09/135067.htm
Spark 官方文档 – 中文翻译 http://www.linuxidc.com/Linux/2016-04/130621.htm
在 Ubuntu 17.10 上安装 Apache Spark http://www.linuxidc.com/Linux/2017-12/149853.htm
CentOS 6.2(64 位)下安装 Spark0.8.0 详细记录 http://www.linuxidc.com/Linux/2014-06/102583.htm
Spark-2.2.0 安装和部署详解 http://www.linuxidc.com/Linux/2017-08/146215.htm
Spark2.0.2 Hadoop2.6.4 全分布式配置详解 http://www.linuxidc.com/Linux/2016-11/137367.htm
Ubuntu 14.04 LTS 安装 Spark 1.6.0(伪分布式)http://www.linuxidc.com/Linux/2016-03/129068.htm
Spark 的详细介绍:请点这里
Spark 的下载地址:请点这里
本文永久更新链接地址:http://www.linuxidc.com/Linux/2018-02/150886.htm