1、Spark 架构
Spark架构主要由以下组件构成:
- Application: 建立在 Spark上的用户程序,包括 Driver代码和运行在集群各节点 Executor中的代码
- Driver program: 驱动程序, Application中的main函数并创建 SparkContext
- Cluster Manager : 在集群(Standalone、Mesos、YARN)上获取资源的外部服务
- Worker Node: 集群中任何可以运行 Application代码的节点
- Executor : 某个 Application运行在 worker节点上的一个进程
- Task: 被送到某个 Executor上的工作单元
- Job : 包含多个 Task 组成的并行计算,往往由 Spark Action算子 触发生成,一个 Application中往往会产生多个 Job
- Stage: 每个Job会被拆分成多组 Task,作为一个 TaskSet,其名称为 Stage
运行架构
- 在驱动程序中,通过SparkContext主导应用的执行
SparkContext可以连接不同类型的Cluster Manager(Standalone、YARN、Mesos),连接后,获得集群节点上的Executor - 一个Worker节点默认一个Executor,可通过SPARK_WORKER_INSTANCES调整
- 每个应用获取自己的Executor
- 每个Task处理一个RDD分区
运行流程
2、 Spark API
\quad \quad API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。通俗来讲,别人写好的代码,或者编译好的程序,提供给你使用,就叫做API。你使用了别人代码(或者程序)中的某个函数、类、对象,就叫做使用了某个API。
\quad \quad 在开发过程中,Spark常用API主要有: SparkContext、 SparkSession、 RDD、 DataSet及 DataFrame。
2.1 SparkContext
- 是Spark的主入口
- 连接Driver与Spark Cluster(Workers)
- 每个JVM里只能存在一个处于激活状态的SparkContext,在创建新的SparkContext之前必须调用stop()来关闭之前的SparkContext
在IDEA中创建 SparkContext ,代码如下:
//导包
import org.apache.spark.{SparkConf, SparkContext}
//创建一个SparkContext对象
val conf=new SparkConf().setMaster("local[2]").setAppName("HelloSpark")
val sc=SparkContext.getOrCreate(conf)
-
SparkConf包含了Spark集群配置的各种参数,对于一般简单应用,只需要传递下面两个参数:
- 集群URL:告诉Spark如何连接到集群上。比如“local”表示在本地运行,“local[4]”表示以4核在本地运行,“spark://master:7077”表示在spark独立集群上运行
- 应用名:设置将在spark Web UI中显示的应用程序的名称,可以帮助我们在集群管理器的用户界面中找到应用。
2.2 SparkSession
-
SparkSession也是 Spark的一个入口 ,是在 2.0中引入的新的 API,旨在为 Spark编程提供统一的编程入口,SparkSession整合了 SparkConf、 SparkContext、SQLContext、 HiveContext以及 StreamingContext。
-
当创建了SparkSession对象后,可以间接拿到 sparkContext 与 sqlContext 对象,所以在 2.0版本后推荐使用 SparkSession作为编程入口。
-
在2.0之前的 Spark版本中, spark shell会自动创建一个 SparkContext对象(sc)
-
在2.0+版本中,Spark shell则会额外创建一个 SparkSession对象(spark),如下图:
在IDEA中创建 SparkSession ,代码如下:
//导包
import org.apache.spark.sql.SparkSession
//创建一个SparkSession对象
val spark = SparkSession.builder
.master("local[2]")
.appName("appName")
.getOrCreate()
val sc: SparkContext = spark.sparkContext
2.3 RDD
- Spark核心,主要数据抽象
2.4 DataSet
- 从Spark1.6开始引入的新的抽象,特定领域对象中的强类型集合,它可以使用函数或者相关操作并行地进行转换等操作
2.5 DateFrame
- DataFrame是特殊的Dataset
参考资料:
1、https://blog.csdn.net/zxl55/article/details/74924221
2、https://blog.csdn.net/Helltaker/article/details/10976406