Spark的生态系统主要包含了Spark Core
、Spark SQL
、Spark Streaming
、Structured Streaming
、MLlib
和GraphX
等组件。
各个组件的具体功能如下:
Spark Core包含Spark最基础和最核心的功能,如内存计算、任务调度、部署模式、故障恢复、存储管理等,主要面向批数据处理。
用于结构化数据处理的组件,允许开发人员直接处理RDD,同时也可查询Hive,HBase等外部数据源。
一种流计算框架,可以支持高吞吐量、可容错处理的实时流数据处理,其核心思路是将流数据分解成一系列短小的批处理作业,每个短小的批处理作业都可以使用Spark Core进行快速处理。
一种基于Spark SQL引擎构建的、可扩展且容错的流处理引擎。
MLlib提供了常用机器学习算法的实现,包括聚类、分类、回归、协同过滤等,降低了机器学习的门槛,开发人员只需具备一定的理论知识就能进行机器学习的工作。
GraphX是Spark中用于图计算的API,可认为是Pregel在Spark上的重写和优化,GraphX性能良好,拥有丰富的功能和运算符,能在海量数据上自如地运行复杂的图算法。
Master
和Worker
是Spark独立集群里用到的类。如果是yarn环境部署,是不需要这两个类的。
Master是Spark独立集群的控制者,Worker是工作者,一个Spark独立集群需要启动一个Master和多个Worker。
Spark提供了Master选举功能,保障Master挂掉的时候能选出另一个Master,做一个切换的动作,这块原理和ZooKeeper类似。
Master节点常驻Master守护进程,负责管理Worker节点,从Master节点提交应用。
Worker节点常驻worker守护进程,与Master节点通信,并且管理executor进程。
RDD:Resillient Distributed Dataset(弹性分布式数据集),是分布式内存的一个抽象概念,提供了一种高度受限的共享内存模型。
DAG:Directed Acyclic Graph(有向无环图),反映RDD之间的依赖关系。
RDD任务切分中间分为:Application、Job、Stage和Task
(1)Application(应用)
用户编写的Spark应用程序。
(2)Job(作业)
Job是用户程序一个完整的处理流程,是逻辑的叫法。
一个作业可以包含多个RDD及作用于相应RDD上的各种操作。
(3)Stage(阶段)
是作业的基本调度单位,每个作业会因为RDD之间的依赖关系拆分成多组任务集合TaskSet,称为调度阶段。
调度阶段的划分是由DAGScheduler来划分的,有Shuffle Map Stage和Result Stage两种。
(4)Task(任务)
分发到Executor上的工作任务,是spark实际执行应用的最小单元,一个Stage阶段中,最后一个RDD的分区个数就是Task的个数。
一个Stage可以包含多个task,比如sc.textFile("/xxxx").map().filter(),其中map和filter就分别是一个task。
每个task的输出就是下一个task的输出。
Driver进程应用 main()
函数并且构建sparkContext对象。
当我们提交了应用之后,便会启动一个对应的Driver进程,Driver本身会根据我们设置的参数占有一定的资源就是Executor。
然后集群管理者会分配一定数量的Executor,每个Executor都占用一定数量的cpu和memory。
这里Executors其实是一个独立的JVM进程,在每个工作节点上会起一个,主要用来执行task,一个executor内,可以同时并行的执行多个task。
而Claster Manager主要负责整个程序的资源调度目前的主要调度器有:YARN、Spark Standalone、Mesos。
DAGScheduler:面向调度阶段的任务调度器,负责接收spark应用提交的作业,根据RDD的依赖关系划分调度阶段,并提交调度阶段给TaskScheduler.
TaskScheduler:面向任务的调度器,它接受DAGScheduler提交过来的调度阶段,然后把任务分发到work节点运行,由Worker节点的Executor来运行该任务
测试代码如下:
sc lines = sc.textFile("file:///home/zt/test.txt") lines words=lines.flatMap(lambda line:line.split()) words wordKV=words.map(lambda word:(word,1)) wordKV wc=wordKV.reduceByKey(lambda a,b:a+b) wc lines.foreach(print) words.foreach(print) wordKV.foreach(print) wc.foreach(print)
测试结果截图如下:
转换关系图如下: