spark入门之Spark 组件(components)
*注:本文为本人结合网上资料翻译 Apache Spark 2.x
for Java developers 一书而来,仅作个人学习研究之用,支持转载,但务必注明出处。
我们先来了解一些spark相关的术语:
Driver:这是监督Spark作业或程序端到端执行的主程序。 它与集群的资源管理器进行资源的协商,并将程序编排成尽可能小的数据本地并行编程单元。
Executors:在任何Spark任务中,可以有一个或多个executor,即执行由drive委派的较小任务的进程。 executor处理数据,最好是本地节点的,并将结果存储在内存和/或磁盘中。
Master:Apache Spark已经在主/从架构中实现,因此master指的是执行驱动程序的集群节点。
Slave(已经改名为Worker):在分布式集群模式下,slave是指运行执行程序的节点,因此在群集中可以有多个从机(而且大部分情况都是这样)。
Job:这是对任何一组数据执行的操作的集合。 典型的word count job涉及从任意来源读取文本文件,然后分离(splitting)并聚合(aggregating)这些字。
DAG:Spark引擎中的任何Spark工作都由DAG的操作代表。 DAG按顺序表示Spark操作的逻辑执行。 在发生故障的情况下由DAG重新计算可能的血统(lineage)。
Task:一个job可以拆分成更小的单位,以被称为task的孤立任务进行操作。 每个task由executor在一个数据分区上执行。
Stages:Spark作业可以按逻辑划分为多个stage,每个stage代表一组具有相同的洗牌(shuffle)依赖关系的任务,即发生数据洗牌(shuffle)的任务。 在洗牌映射(shuffle map)阶段,任务结果被输入到下一个阶段;在结果阶段,task计算action,开始对Spark job的赋值,例如take(),foreach()和collect()。
(*注:shuffle 是划分 DAG 中 stage 的标识,同时影响 Spark 执行速度的关键步骤.
RDD 的 Transformation 函数中,又分为窄依赖(narrow dependency)和宽依赖(wide dependency)的操作.窄依赖跟宽依赖的区别是是否发生 shuffle(洗牌)
操作.宽依赖会发生 shuffle 操作. 窄依赖是子 RDD的各个分片(partition)不依赖于其他分片,能够独立计算得到结果,宽依赖指子 RDD 的各个分片会依赖于父RDD 的多个分片,所以会造成父 RDD 的各个分片在集群中重新分片)
下面的图逻辑表示了spark应用中不同的组件是如何交互的:
一个Spark job怎么执行的?
- Spark job可以包含一系列对一组数据执行的操作。
不管Spark job的大小,Spark job都需要SparkContext来执行。 在之前使用REPL的例子中,人们会注意到使用了一个名为sc的环境变量,这就是在REPL环境中如何访问一个SparkContext。
- SparkContext创建一个由不同transformation组成的operator graph,一旦在某个transformation之上执行action,这个group会被提交给DAGScheduler。 根据RDD的性质或由窄变换(narrow transformation)或宽变换(wide transformation)(需要shuffle操作的变换)产生的结果。DAGScheduler会创建stage。
- DAGScheduler以这样的方式拆分DAG:每个stage都由在通用洗牌边界(common shuffle boundaries,实在不知道怎么翻译合适)下的相同洗牌依赖(shuffle dependency)组成。 此外,stage可以是洗牌映射(shuffle map)阶段,在这种情况下,其任务结果将是另一个阶段的输入;也可以是结果阶段(result stage),在这种情况下,其任务直接计算启动作业的action,例如count()。
- 然后stage被DAGScheduler作为任务集(TaskSets)提交给TaskScheduler。 TaskScheduler通过集群管理器(YARN,Mesos和Spark standalone)调度TaskSet并监视其执行情况。 如果任何任务失败,则重新运行,最后将结果发送到DAGScheduler。 如果结果输出文件丢失,那么DAGScheduler将重新提交这些阶段给TaskScheduler以重新运行。
- 然后在满足资源和数据局部性约束的指定执行器(executor)(slave(worker)节点上运行的JVM)上安排task。 每个executor还可以分配多个task。
下面的图逻辑表示了一个Spark job执行的不同阶段:
参考文献:
Apache Spark 2.x for Java developers
S Gulati,S Kumar - 2017 - 被引量: 0
Gulati, Sourav; Kumar, Sumit
http://blog.csdn.net/databatman/article/details/53023818