一:spark的组件构成
1:每一个application有自己的executor的进程,它们相互隔离,每个executor中可以有多个task线程。这样可以很好的隔离各个applications,各个spark applications 不能分享数据,除非把数据写到外部系统。
2:SparkContext对象可以视为Spark应用程序的入口,主程序被称为driver program,SparkContext可以与不同种类的集群资源管理器(Cluster Manager),例如Hadoop Yarn、Mesos等 进行通信,从而分配到程序运行所需的资源,获取到集群运行所需的资源后,SparkContext将得到集群中其它工作节点(Worker Node) 上对应的Executors (不同的Spark应用程序有不同的Executor,它们之间也是独立的进程,Executor为应用程序提供分布式计算及数据存储功能),之后SparkContext将应用程序代码分发到各Executors,最后将任务(Task)分配给executors执行。
二:spark相关概念
Application 运行在集群上的用户程序,包含集群上的driver program 和多个executor线程组成;
Driver program application运行的main方法,并生成sparkcontext;
Cluster manager 集群资源管理器 ;
Deploy mode 部署模式 用于区别driver program的运行方式:集群模式(cluter mode),driver在集群内部启动;客户端模式(client mode),driver进程从集群外部启动;
Worker node 工作节点,运行application的节点
Executor work node的上进程,运行task并保持数据交互,每一个application有自己的executor
Task 运行于Executor中的任务单元,Spark应用程序最终被划分为经过优化后的多个任务的集合
Job 由多个转变构建的并行计算任务,具体为Spark中的action操作, 一个action就为一个job
三:Resilient Distributed Datasets (RDDs)
spark 涉及的核心概念就是resilient distributed dataset (RDD),rdd是具有容错性的数据集合,并可以并行数据计算。有两种方法可以创建rdd,第一种就是parallelizing 方法:序列化存在driver program 中的集合,见下方代码
val data = Array(1, 2, 3, 4, 5) val distData = sc.parallelize(data)
并
parallelize 方法中可以指定数据分区参数,并每个分区对应一个task 如下面代码
val data = Array(1, 2, 3, 4, 5)
val distData = sc.parallelize(data,10)
RDD 可以抽象的认为是一个数组,这个数组分布在集群上,RDD可以进行逻辑上的分区,每个分区叫一个partition。在spark application运行过程中,RDD经过一个个transformtion 转换算子后,最后通过Action算计触发操作;RDD是懒加载的,前面的转化并不发生实际的操作,这个转化为记录在DAG图中,只有触发action后,才实际就行操作。逻辑上每经历一个变化,RDD就会转化为新的RDD,rdd之间通过lineage关系,这个关系在容错中起到至关重要的作用。
RDD的源码中标注了5个性质:
- 一组分片(partition),即数据集的基本组成单位
- 每个分片都可以计算
- 对parent RDD的依赖,这个依赖描述了RDD之间的lineage
- 对于key-value的RDD,一个Partitioner
- 一个列表,存储存取每个partition的preferred位置。对于一个HDFS文件来说,存储每个partition所在的块的位置。
窄依赖是指每个父RDD的Partition最多被子RDD的一个Partition所使用,例如map、filter,见上左图
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/9400.html