集群相干
Cluster Manager 指的是在集群上获取资源的内部服务,为每个 spark application 在集群中调度和分配资源的组件,目前有三种类型:
• Standalone:Spark 原生的资源管理,由 Master 负责资源的调配
• Apache Mesos:与 Hadoop MapReduce 兼容性良好的一种资源调度框架
• Hadoop Yarn:次要是指的 Yarn 中的 ResourceManager
Worker 指集群中的工作节点,启动并运行 executor 过程,运行大数据培训作业代码的节点
• standalone 模式下:Worker 过程所在节点
• yarn 模式下: yarn 的 nodemanager 过程所在的节点
Deploy Mode 分为两种模式,client 和 cluster, 区别在于 driver 运行的地位
• Client 模式下 driver 运行在提交 spark 作业的机器上,
• 能够实时看到具体的日志信息
• 不便追踪和排查谬误, 用于测试
• cluster 模式下,spark application 提交到 cluster manager,cluster manager(比方 master)负责在集群中某个节点上,启动 driver 过程, 用于生产环境
• 通常状况下 driver 和 worker 在同一个网络中是最好的, 而 client 很可能就是 driver worker 离开安排, 这样网络通信很耗时,cluster 没有这样的问题
Spark 分布式计算组成
Application
• 用户编写的 Spark 程序,通过一个有 main 办法的类执行, 实现一个计算工作的解决。
• 它是由一个 Driver 程序和一组运行于 Spark 集群上的 Executor 组成
Driver
• 运行 main 办法的 Java 虚拟机过程负责
• 监听 spark application 的 executor 过程发来的通信和连贯
• 将工程 jar 发送到所有的 executor 过程中
• driver 调度 task 给 executor 执行
• Driver 与 Cluster Manager、Worker 合作实现
• Application 过程的启动
• DAG 划分
• 计算工作封装
• 调配 task 到 executor 上
• 计算资源的调配等调度执行作业等
• Driver 调度 task 给 executor 执行,所以 driver 最好和 spark 集群在一片网络内, 便以通信
Executor
• 运行在 worker 节点上,负责执行作业的工作,并将数据保留在内存或磁盘中
• 每个 spark application,都有属于本人的 executor 过程,spark application 不会共享一个 executor 过程
• executor 在整个 spark application 运行的生命周期内,executor 能够动静减少 / 开释
• executor 应用多线程运行 SparkContext 调配过去的 task,来一批 task 就执行一批
用户操作 spark 的入口
SparkContext 是 Spark 的入口,负责连贯 Spark 集群,创立 RDD,累积量和播送量等
• SparkContext 是 Spark 的对外接口,负责向调用者提供 Spark 的各种性能
• driver program 通过 SparkContext 连贯到集群管理器来实现对集群中工作的管制
• 每个 JVM 只有一个 SparkContext, 一台服务器能够启动多个 JVM
SparkSession
• The entry point to programming Spark with the Dataset and DataFrame API.
• 蕴含了 SQLContext、HiveContext、sparkcontext
Spark 计算切分相干
Job
• 一个 spark application 可能会被分为多个 job,每次调用 Action 时,逻辑上会生成一个 Job
• 一个 Job 蕴含了一个或多个 Stage
Stage
• 每个 job 都会划分为一个或多个 stage(阶段),每个 stage 都会有对应的一批 task(即一个 taskset),调配到 executor 下来执行
• Stage 包含两类
• ShuffleMapStage
• ResultStage
TaskSet
• 一组关联的,但相互之间没有 Shuffle 依赖关系的 Task 汇合
• Stage 能够间接映射为 TaskSet,一个 TaskSet 封装了一次须要运算的、具备雷同解决逻辑的 Task,
• 这些 Task 能够并行计算,粗粒度的调度是以 TaskSet 为单位的。
• 一个 stage 对应一个 taskset
Task
• driver 发送到 executor 上执行的计算单元,每个 task 负责在一个阶段(stage),解决一小片数据,计算出对应的后果
• Task 是在物理节点上运行的根本单位,Task 蕴含两类
• ShuffleMapTask => 对应于 Stage 中 ShuffleMapStage 中的一个执行根本单元
• ResultTask => 对应于 Stage 中 ResultStage 中的一个执行根本单元
Spark 其余重要局部
数据结构
• RDD
• DataFrame 引入了 schema 和 off-heap
• DataSet 整合了 rdd 和 dataframe 的长处,反对结构化和非结构化数据,采纳堆外内存存储,gc 敌对
外围调度器
• DAGScheduler 依据 Job 构建基于 Stage 的 DAG,并提交 Stage 给 TaskScheduler。
• SparkEnv Spark 公共服务们互相交互,用来给 Spark 应用程序建设分布式计算平台的运行时环境
• TaskScheduler 将 Taskset 提交给 Worker node 集群运行并返回后果。
Spark 调度
提交形式
• yarn-cluster 模式,用于生产模式,driver 运行在 nodeManager, 没有网卡流量激增问题, 但查看 log 麻烦, 调试不不便
• Yarn-client 模式,yarn-client 用于测试,driver 运行在本地客户端, 负责调度 application, 会与 yarn 集群产生超大量的网络通信, 从而导致网卡流量激增,yarn-client 能够在本地看到所有 log, 不便调试
• yarn-client vs yarn-cluster
• yarn-client 下,driver 运行在 spark-submit 提交的机器上,ApplicationMaster 只是相当于一个 ExecutorLauncher,仅仅负责申请启动 executor;driver 负责具体调度
• yarn-cluster 下,ApplicationMaster 是 driver,ApplicationMaster 负责具体调度
Spark 通用工作执行过程
• 用户通过 spark-submit 脚本提交利用
• spark-submit 脚本启动 Driver,调用用户定义的 main() 办法构建 sparkConf 和 sparkContext 对象,在 sparkContext 入口做了三件事,创立了
• sparkEnv 对象
• TaskScheduler
• DAGScheduler
• Driver 与 cluster manager 通信,申请资源以启动 Executor;
• cluster manager 为 Driver 启动 Executor;
• 在用户利用中代码遇到对 RDD 的 action 算子操作的时候,触发一个 job,这时就会
• 调用 DAGScheduler 对象进行 Stage 划分,将划分好的 stage 依照分区生成一个一个的 task,并且封装到 TaskSet 对象中
• TaskSet 提交到 TaskScheduler,TaskScheduler 依照提交过去的 TaskSet,拿到一个序列化器,将 TaskSet 序列化,将序列化好的 Task 封装并且提交到 worker
• 工作在 Executor 中进行计算并保留后果;
• 如果 Driver 的 main() 办法退出,或者调用了 SparkContext.stop(),Driver 会终止 Executor,并且通过集群管理器开释资源。
spark 提交过程剖析 standalone
• SparkContext 连贯到 Master,向 Master 注册并申请资源
• Master 依据资源申请要求和 Worker 心跳周期内报告的信息决定在哪个 Worker 上分配资源,而后在该 Worker 上获取资源,而后启动 StandaloneExecutorBackend
• StandaloneExecutorBackend 向 SparkContext 注册, 建设 Executor 线程池
• SparkContext 将 Applicaiton 代码发送给 StandaloneExecutorBackend
• SparkContext 解析 Applicaiton 代码,构建 DAG 图,
• 提交给 DAG Scheduler 分解成 Stage(当碰到 Action 操作时,就会催生 Job;每个 Job 中含有 1 个或多个 Stage,Stage 个别在获取内部数据和 shuffle 之前产生)
• 以 Stage(或者称为 TaskSet)提交给 Task Scheduler,
• Task Scheduler 负责将 Task 调配到相应的 Worker,最初提交给 StandaloneExecutorBackend 执行
• StandaloneExecutorBackend 会建设 Executor 线程池,开始执行 Task,并向 SparkContext 报告,直至 Task 实现。
• 所有 Task 实现后,SparkContext 向 Master 登记,开释资源。