当需要处理的数据量超过了单机尺度(比如我们的计算机有4GB的内存,而我们需要处理100GB以上的数据)这时我们可以选择spark集群进行计算,有时我们可能需要处理的数据量并不大,但是计算很复杂,需要大量的时间,这时我们也可以选择利用spark集群强大的计算资源,并行化地计算
一、架构及生态
架构示意图如下:
- Spark Core:实现了 Spark 的基本功能,包含任务调度、内存管理、错误恢复、与存储系统交互等模块。SparkCore 中还包含了对弹性分布式数据集(Resilient Distributed DataSet,简称RDD)的API定义。
- Spark SQL:是 Spark 用来操作结构化数据的程序包。通过SparkSql,我们可以使用 SQL或者Apache Hive 版本的 SQL 方言(HQL)来查询数据。Spark SQL 支持多种数据源,比如 Hive 表、Parquet 以及 JSON 等。
- Spark Streaming:是 Spark 提供的对实时数据进行流式计算的组件。提供了用来操作数据流的 API,并且与 Spark Core 中的 RDD API 高度对应。
- Spark MLlib:提供常见的机器学习 (ML) 功能的程序库。包括分类、回归、聚类、协同过滤等,还提供了模型评估、数据导入等额外的支持功能。
- GraphX:控制图、并行图操作和计算的一组算法和工具的集合。GraphX扩展了RDD API,包含控制图、创建子图、访问路径上所有顶点的操作。
Spark架构的组成图如下:
- Cluster Manager:Spark 设计为可以高效地在一个计算节点到数千个计算节点之间伸缩计算,为了实现这样的要求,同时获得最大灵活性,Spark 支持在各种集群管理器(Cluster Manager)上运行,目前 Spark 支持 3 种集群管理器:
- Hadoop YARN(在国内使用最广泛)
- Apache Mesos(国内使用较少, 国外使用较多)
- Standalone(Spark 自带的资源调度器, 需要在集群中的每台节点上配置 Spark)
- Worker节点:从节点,负责控制计算节点,启动Executor或者Driver。
- Driver: 运行Application 的main()函数
- Executor:执行器,是为某个Application运行在worker node上的一个进程
二、Spark运行架构
基本概念:RDD、DAG、Executor、Application、Task、Job、Stage
-
RDD:弹性分布式数据集的简称,是分布式内存的一个抽象概念 ,提供了一个高度共享的内存模型。
-
Worker Node:物理节点,上面执行executor进程
-
Executor:Worker Node为某应用启动的一个进程,执行多个tasks
-
Jobs:action 的触发会生成一个job, Job会提交给DAGScheduler,分解成Stage,
-
Stage:DAGScheduler 根据shuffle将job划分为不同的stage,同一个stage中包含多个task,这些tasks有相同的 shuffle dependencies。
有两类shuffle map stage和result stage:
shuffle map stage:case its tasks’ results are input for other stage(s)
result stage:case its tasks directly compute a Spark action (e.g. count(), save(), etc) by running a function on an RDD,输入与结果间划分stage
- Task:被送到executor上的工作单元,task简单的说就是在一个数据partition上的单个数据处理流程。
action触发一个job (task对应在一个partition上的数据处理流程)
------stage1(多个tasks 有相同的shuffle依赖)------【map–shuffle】------- stage2---- 【result–shuffle】-----