术语:
- Application(应用程序):用户使用API所构建的Spark程序,包含了Driver(驱动)和Executor(执行单元)。
- SparkSession(Spark时域):一个提供了使用Spark程序入口的实例。
- Job(作业):由多个Task(进程)组成平行计算,会为Spark操作生成一个结果(e.g. save(), collect())。
- Stage(阶层):每个Job都会分割为小份Task的集合,即为Stages。
-
Task(进程):会直接送到Spark Executor的一个单位的work(工作)。
以下为一些更详细的概念
Spark Application and SparkSession
每个Spark Application的核心为Spark Driver,他会创建一个SparkSession(在Spark Shell中,Spark Driver直接创建了一个SparkSession)。创建了SparkSession后,我们就可以使用API对Spark进行编程。
Spark Jobs
Driver会把一个Application转换为一个或多个Jobs,然后会把每个Job转化为DAG(有向无环图)。每一个DAG里的node(环节),皆会是一个或多个Stages。
Spark Stages
作为DAG中一个node,Stages可以是平行或者序列的。
Spark Task
每个Stage都由一个或者多个Task组成,所以会使每个Executor联合起来;每个Task仅map(映射)一个Core和一块数据。所以,一个16核Executor可以拥有16个或更多的Task,且平行运行!
Trasnformations, Actions, and Lazy Evaluation
Spark的运行类型可以分为两种:Transformations和Actions。
Transformation将一个DataFrame转化为另一个DataFrame且使原数据属性为不可更改来保留原数据。例如select()和filter()将不会更改原数据,则会将结果保存为新的DataFrame,然后输出改DataFrame作为结果。
所有Transformations都是lazy evaluation(惰性计算)。他们的结果将不会直接得出,但是他们会被记录为lineage(血统)。血统会在后续的执行中,去重新对Transformation进行排序,组合,优化到Stages,使执行更加效率。在Action被触及或数据被“触碰”之前,Transformation的执行都会被推迟,即为Spark的惰性计算策略。在以下的例子中,在filtered.count()前没有任何发生。
strings = spark.read.text("../README.md")
filtered = strings.filter(strings.value.contains("Spark"))
filtered.count()
# 20
惰性计算使查询在执行前可以大致的观望数据的转化链,与Lineage,以及原数据不可更改,共同为Spark提升了容错率。
Narrow and Wide Transformations
任何只有单一输出的Transformation即是Narrow Transformation。例如filter()和contains()。groupby()和orderby()则是Wide Transformation。
Spark UI
在Spark Web UI中,可以实时观测:
- 计划的stages, tasks
- RDD大小以及内存占用的概况
- 配置环境的信息
- 执行器的信息
- 所有Spark SQL的查询
- ...
在本地模式中,地址为http://localhost:4040
Reference
Learning Spark 2nd - Lightning Fast Big Data Analysis by Jules S. Damji, Brooke Wenig, Tathagata Das, and Denny Lee