大数据,之spark入门之一:spark组件(文末附大数据教程)
一: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的依赖
RDD在每次转化时候,会生成一个新的RDD,但新的RDD和旧的RDD之间保持着关系,就是依赖,依据依赖的样式,可以划分为窄依赖和宽依赖;
窄依赖是指每个父RDD的Partition最多被子RDD的一个Partition所使用,例如map、filter,见上左图
宽依赖是指一个父RDD的Partition会被多个子RDD的Partition所使用,例如groupByKey、reduceByKey等
五:RDD的持久化
RDD的持久化是spark的一个重要的特性,当你把RDD持久化,每个Node会存储RDD的分区在内存,在其他action中用到此rdd的时候,就不用从头转化,而是直接使用。你可以用persist或者cache方法持久化rdd,Spark的 缓 存是一个容 错 的技 术 -如果RDD的任何一个分区 丢 失,它 可以通 过 原有的 转换 ( transformations )操作自 动 的重复 计 算并且 创 建出 这 个分区。另外,每一个RDD可以选择不同的持久化级别:
MEMORY_ONLY 把RDD非序列化为Java对象存在jvm中,如果RDD不适合持久化在内存中,RDD的一些分区可能不能持久化,让此RDD需要的时候,此丢失的RDD分区会重新计算获取;
MEMORY_AND_DISK 将RDD作为非序列化的Java对象存储在jvm中。如何RDD不适合存在内存中,将这些不适合存在内存的分区存在磁盘中
MEMORY_ONLY_SER 把RDD序列化为Java对象存在jvm中,如果RDD不适合持久化在内存中,RDD的一些分区可能不能持久化,让此RDD需要的时候,此丢失的RDD分区会重新计算获取;
DISK_ONLY 仅仅存在磁盘中
Spark也会自动持久化一些shuffle操作(如 reduceByKey )中的中间数据,即使用户没有调用 persist 方法。 这样 的好 处 是避免了在shuffle出 错 情况下,需要重复 计 算整个 输 入
小编这里有一套大数据从入门到精通的视频教程,大家可以免费拿去看吧~~~~
关注转发文章之后,点击头像私信“学习”来进行获取~~~