At a high level, every Spark application consists of a driver program that runs the user’s main function and executes various parallel operations on a cluster.
来自 <http://spark.apache.org/docs/latest/rdd-programming-guide.html>
提供两个抽象,第一个抽象是RDD,第二个是共享变量
一、RDD弹性分布式数据集
分布式数据架构,即 rDD,Spark的核心数据结构。
RDD 的三种种创建方式:
1、来自内存中的对象集合(也称为并行化的一个集合)sc.parallize(data)data可以是一个Array
2、从Hadoop文件系统(或与Hadoop兼容的其他持久化存储系统,如Hive、
Cassandra、 Hbase)输入(如HDFS)创建
3、从父RDD转换得到新的RDD
第一种方法用于对少量的输入数据进行并行的CPU密集型计算。
第二种方法是创建一个对外部数据集的引用,sc.textFile(),括号里的路径可以是任何Hadoop文件系统的路径。
第三种方法,从已有的RDD进行转换,Transformation,转换是惰性的。
转换常用的操作有:映射、分组、聚合、重新分区、采样、连接RDD以及把RDD作为集合处理
持久化:.cache()标记需要缓存的中间结果,并不会立即缓存RDD
序列化:一般用Java序列化机制,spark中采用Kryo序列化机制。要使用它需要在conf中设置spark.serializer的属性
共享变量:广播变量和累加器
RDD的两种操作算子
变换(Transformation)和动作(Action)
变换操作是延时执行的,从一个RDD转换生成另一个RDD的操作不是马上执行,而是要等到有Action操作时才触发。
Action算子会触发spark作业提交,并将数据输出到spark系统。
RDD 的内部属性。
1、分区列表
2、计算每个分片的函数
3、对父RDD的依赖列表
4、对Key-Value对数据类型RDD的分区器,控制分区策略和分区数。
5、每个数据分区的地址列表(如HDFS上的数据块的地址)。
Spark数据存储的核心是RDD,RDD可以被理解为一个抽象的数组,但这个数组是分布在集群上的,逻辑上RDD的每个分区叫一个Partition。经历每一次Transformation操作之后,就会将RDD转换成另一个新的RDD
本质上RDD 是数据的元数据结构,存储的是数据分区及其逻辑结构映射关系,存储rdd之前的依赖转换关系。实际的物理块block是由blockManager进行管理的。
Spark算子分类,在程序运行过程中通过算子对RDD进行转换。
1、spark算子的作用:算子是RDD中定义的函数。包括输入函数、运行转换函数、输出函数,每一步操作都可以认为是一个算子。
输入:如textFile从文件读取、parallellize方法输入scala集合或数据输入spark,数据进入spark后转换为spark数据块,通过blockmanager进行管理
运行:输入spark形成RDD后就可以通过变换算子,如filter、map等转换为新的RDD。如果数据需要复用,就可以通过cache()将数据缓存到内存。
输出:saveAsTextFile输出到HDFS或collect()操作输出scala集合,count()直接返回。
RDD是个抽象类,具体实现由其子类如MappedRDD、ShuffledRDD等。
2、spark算子的分类:
三类:value型的transformation算子、key-value型的transformation算子、Action算子,会触发SparkContext提交Job作业。
第一类:又可以分为五种:
如map(),实现子类MappedRDD的方法。flatmap(),与map类似
mapPartitions、glom。这些都是输入输出一对一型
union、cartesian笛卡尔积。这些是输入与输出多对一型
groupBy 输入与输出多对多
filter、distinct、substract(集合的差操作)、sample、takeSample输出为输入的子集
cache、persist Cache类型
第二类:Key-Value型的
三种类型:输入分区与输出分区一对一如mapValues(只对值进行map操作)
对单个RDD或两个RDD聚集:单个如combineByKey、reduceByKey、partitonBy
对两个rdd聚集:如cogroup
连接 join、LeftOutJoin、rightOutJoin
第三类:Actions算子
分类:无输出、HDFS、scala集合、数据类型
foreach、saveAsTextFile、saveAsObjectFile、collect、collectAsMap、reduceByKeyLocally、lookup、count、top、reduce、fold、aggregate
Spark作业的运行机制:driver和executor
两种类型的任务,shffle map和result,除了结果计算的最终阶段外,其他任务都算作shfflemap 任务。
当对RDD执行一个动作时,会自动提交一个spark作业,导致sparkcontext调用runJob,然后调用传递给作为driver的一部分运行的调度程序。。调度程序由DAG调度程序和任务调度程序组成。DAG把作业分解为若干阶段,这些阶段构成一个DAG;任务调度程序则把每个阶段的任务提交到集群。
二、共享变量