最近在负责Spark Streaming 结合 Spark Sql的相关项目,语言是Java,留下一些笔记,也供大家参考,如有错误,请指教!
执行逻辑:
jar -> Application -> Driver -> Worker -> Executor -> Task
通过SparkSubmit提交job后,Client就开始构建spark context,即 application 的运行环境(使用本地的Client类的main函数来创建spark context并初始化它)
yarn client提交任务,Driver在客户端本地运行;yarn cluster提交任务的时候,Driver是运行在集群上
SparkContext连接到ClusterManager(Master),向资源管理器注册并申请运行Executor的资源(内核和内存)
**Master**根据SparkContext提出的申请,根据worker的心跳报告,来决定到底在那个worker上启动executor
Worker节点收到请求后会启动executor
executor向SparkContext注册,这样driver就知道哪些executor运行该应用
SparkContext将Application代码发送给executor(如果是standalone模式就是StandaloneExecutorBackend)
同时SparkContext解析Application代码,构建DAG图,提交给DAGScheduler进行分解成stage,stage被发送到TaskScheduler。
TaskScheduler负责将Task分配到相应的worker上,最后提交给executor执行
executor会建立Executor线程池,开始执行Task,并向SparkContext汇报,直到所有的task执行完成
所有Task完成后,SparkContext向Master注销
基本概念:
Application =>Spark的应用程序,包含一个Driver program和若干Executor
SparkContext => Spark应用程序的入口,负责调度各个运算资源,协调各个Worker Node上的Executor
Driver Program => 运行Application的main()函数并且创建SparkContext
Executor => 是为Application运行在Worker node上的一个进程,该进程负责运行Task,并且负责将数据存在内存或者磁盘上。每个Application都会申请各自的Executor来处理任务
Cluster Manager =>在集群上获取资源的外部服务 (例如:Standalone、Mesos、Yarn)
Worker Node => 集群中任何可以运行Application代码的节点,运行一个或多个Executor进程
Task => 运行在Executor上的工作单元
Job => SparkContext提交的具体Action操作,常和Action对应
Stage => 每个Job会被拆分很多组task,每组任务被称为Stage,也称TaskSet
RDD => 是Resilient distributed datasets的简称,中文为弹性分布式数据集;是Spark最核心的模块和类
DAGScheduler => 根据Job构建基于Stage的DAG,并提交Stage给TaskScheduler
TaskScheduler => 将Taskset提交给Worker node集群运行并返回结果
Transformations => 是Spark API的一种类型,Transformation返回值还是一个RDD,所有的Transformation采用的都是懒策略,如果只是将Transformation提交是不会执行计算的
Action => 是Spark API的一种类型,Action返回值不是一个RDD,而是一个scala集合;计算只有在Action被提交的时候计算才被触发。
网友评论