Spark基本概念
- RDD——Resillient Distributed Dataset A Fault-Tolerant Abstraction for In-Memory Cluster Computing弹性分布式数据集。
- Operation——作用于RDD的各种操作分为transformation和action。
- Job——作业,一个JOB包含多个RDD及作用于相应RDD上的各种operation。
- Stage——一个作业分为多个阶段。
- Partition——数据分区, 一个RDD中的数据可以分成多个不同的区。1个Partition默认对应一个block,是128M左右,由于最后一条记录一般跨2个BLOCK.,不会是刚好128M。
- DAG——Directed Acycle graph,有向无环图,反应RDD之间的依赖关系。
- Narrow dependency——窄依赖,子RDD依赖于父RDD中固定的data partition。
- Wide Dependency——宽依赖,子RDD对父RDD中的所有data partition都有依赖。
- Caching Managenment——缓存管理,对RDD的中间计算结果进行缓存管理以加快整 体的处理速度。
10. Spark:Spark包含多个组件,核心是:一个对由很多计算任务组成的、运行在多个工作机器或者是一个计算机集群上的应用进行调度、分发以及监控的计算引擎。
Spark的程序的运行有两种模式
:
Client
和
Cluster(在集群上获取资源的外部服务
)。
默认是
client,可以看到更多的运行信息。Cluster模式
默认情况下
spark
集群有一台电脑专门用来提交
spark
程序,一般一定与
sparkcluster
在同一个网络环境中,因为
driver
频繁与
executor
通信,其配置和普通
worker
一致。
Spark Cluster:包含Master
Master:接受用户提交的程序并发送指令给Worker为当前程序分配资源,每个Worker所在节点默认为当前节点分配一个Executor,在Executor中通过线程池并发进行。Master通知Worker按照要求启动Executor。
但不可以用IDEA或Eclipse作Client,也不可以用IDE直接发布Spark程序到Spark集群中:
第一:
内存和
Cores
的限制,默认情况下
Spark
程序的
Driver
会在提交
Spark
程序的机器上,所以如果在
IDE
中提交程序的话,那
IDE
机器就必须非常强大
第二:
Driver
要指挥
Workers
的运行并频繁的发生通信,如果开发环境
IDE
和
Spark
集群不在同样一个网络下,就会出现任务丢失,运行缓慢等多种不必要的问题;
第
三:
这是不安全的。
Application:
基于Spark的用户,包含一个
Driver Program和若干
Executor。运行不依赖
clusterManager,可以有多个
Jobs。
Driver Program:
每个Spark应用都由一个Driver Program来发起集群上的各种并行操作。一般要管理多个执行器Executor节点。Driver Program包含应用的main函数,并且定义了集群上的分布式数据集,并进行了相关操作。运行
Application的
main(),并创建
Spark Context对象,这个对象代表对计算集群的一个连接,同时
也是Executor的核心。
SparkContext:
Application的入口,负责调度各个运算资源,协调各
Worker Node上的
Executor。创建DAGScheduler、TaskScheduler、SchedulerBackend,在实例化的过程中Register当前程序给Master,Master接受注册,如果没有问题,Master会为当前程序分配AppID并分配计算资源。一般情况下,当通过Action来触发Job时,SparkContext会通过DAGScheduler来把Job中的RDD划分成不同的Stage。通过资源调度模块和Executer通信。
WorkerNode:
集群中人任何可以运行
Application代码的节点,可以运行一个或多个
Executor。不会运行程序的代码
是管理当前节点的资源,并接受
Master的指令在新的进程中来分配具体的计算资源
Executor。但Worker不会向Master发送资源,
worker
进程通过一个
proxy
为
ExecutorRunner
的对象实例来远程启动
ExecutorBackend
进程。
Executor:
Application运行在
WorekNode上的一个进程,该进程负责运行
Task。并负责将数据存在内存或磁盘上。每个
Application都会申请各自独立的
Executor来处理任务。为Executor进程里有线程池,它是一个进程里的工作对象。Executor负责执行任务,运行Executer的机器称为Worker节点
Task:
运行在
Executor上的工作单元。
Job:
SparkContext提交的具体
Action操作,常和
Action对应,由
Action触发。包含了一系列的Task并行计算。有一系列的
RDD,不过本身不会产生
RDD。
一般
1
个
Action
操作对应一个
Job
。
CheckPoint
也对应
Job.
排序的
Range
也会触发
Job.
Stage:
每个
Job会被拆分成很多组
Task,每组任务称为
Stage,每个Stage内部是一系列业务逻辑相同但处理数据不同的Tasks,构成了TaskSet。Stage内部是基于内存计算的。最后一个Stage中的Task称为ResultTask,产生Job的结果;前面的Task都是ShuffleMapTask,为下一阶段的Stage做数据准备。
DAGScheduler:
根据
Job构建于
Stage的
DAG,并提交
Stage给
TaskScheduler。
TaskScheduler:
将
TaskSet提交给
WorkerNode集群运行并返回结果。负责具体Task的运行,遵循数据本地性。
ExecutorBackend:ExecutorBackend进程里有Executor,实际在工作中会通过TaskRunner来封装Task,然后从线程池中获取一条线程执行Task,执行完后线程被回收复用。
SchedulerBackend:负责具体Task的运行,遵循数据本地性。