**
RDD
**
RDD叫做弹性分布式数据集。是Spark中最基本的数据抽象,它代表一个不可变、可分区、里面的元素可并行计算的几个。
RDD具有数据流模型的特点,自动容错、位置感知性调度和可伸缩性。
RDD是一个应用层面的逻辑概念。一个RDD多个分片。RDD就是一个元数据记录集,记录了RDD内存所有的关系数据。
基于RDD之间的依赖,RDD会形成一个有向无环图DAG,该DAG描述了整个流式计算的流程,实际执行的时候,RDD是通过血缘关系一气呵成的,即使出现数据分区丢失,也可以通过血缘关系重建分区。
spark-RDD的关系类似于Hadoop-MapReduce的关系。
RDD是只读的,要想改变RDD中的数据,只能在现有的RDD基础上创建新的RDD。
操作算子的两大类
transformations
它是用来将RDD进行转化,构建RDD的血缘关系。
actions
它是用来触发RDD的计算,得到RDD的相关计算结果或者将RDD保存的文件系统中。
CheckPoint
checkpoint将数据保存到持久化的存储中,这样可以切断之前的血缘关系,RDD不再知道父RDDs,它可以从checkpoint处拿到数据。
创建RDD的三种方式
第一种:由已存在的集合创建
val rdd1=sc.parallelize(Array(1,2,3,4,5,6,7))
第二种:由外部存储文件创建
val rdd2=sc.textFile("/word.txt")
第三种:由已有的RDD经过算子转换,生成新的RDD
val rdd3=rdd2.flatMap(_.split(" "))
算子
transformation常用的操作
- map:返回一个新的RDD,该RDD由每一个输入元素经过Function函数转换后组成。
- filter:返回一个新的RDD,该RDD由经过Function函数计算后返回值为true的输入元素组成。
- flatMap:类似于map,但是每一个输入元素可以被映射为0或对个输出元素。
- mapPartitions:类似于map,但独立地在RDD的每一个分片上运行。
- mapPartitionsWithIndex:类似于mapPartition是,但Function带有一个整数参数表示分片的索引值。
- union:对源RDD求并集。
- intersection:对源RDD个参数RDD求交集后返回一个新的RDD。
- distinct:对于原RDD进行去重后返回一个新的RDD。
- partitionBy:对RDD进行分区操作,如果原有的partionRDD和现有的partionRDD是一致的话就不进行分区。
- reduceByKey:在一个(K,V)的RDD上调用,返回一个(K,V)的RDD,使用指定的reduce函数。将相同的key的值聚合到一起。
- groupByKey:也是对每个可以进行操作,但只生成一个sequence.
- combineByKey:对相同k,把V合并成一个集合。
- foldByKey:aggregate的简化操作,
- sortByKey:在一个(K,V)的RDD上调用,K必须实现Ordered接口,返回一个按照key进行排序的(K,V)的RDD。
- sortBy:与sortByKey类似,可以用Function先对数据进行处理,按照处理后的数据比较结果排序。
- join:在类型(K<V)和(K,W)的RDD上调用,返回一个相同key对应的所有元素对在一起(K,(V,W))的RDD。
- cogroup:在类型为(K,V)和(K,W)的RDD上调用,返回一个(K,(Iterable,Iterable))类型的RDD。
- cartesian:笛卡尔积。
- pipe:对每个分区,都执行一个perl或者shell脚本,返回输出的RDD。
- glom:将每一个分区形成一个数组,形成新的RDD类型是RDD【Array【T】】
- mapValues:针对于(K,V)形式的类型只对V进行操作。
- subtract:计算差的一种函数去除两个RDD中相同的元素,不同的RDD将保留下来。
Action常用的操作
- reduce:通过Function函数聚集RDD中的所有元素,这个功能必须是可交换且可并联的。
- collect:在驱动程序中,以数组的形式返回数据集的所有元素。
- count:返回RDD的元素个数。
- first:返回RDD的第一个元素。
- take:返回一个由数据集的前n个元素组成的数组。
- takeSample(withReplacement,num,[seed]):返回一个数组,该数组由从数据集中随机采样的Num个元素组成,可以选择是否用随机数替换不足的部分,seed用于指定随机数生成器种子。
- takeOrdered:返回前几个的排序。
- aggregate:将每个分区里面的元素通过seqOp和初始值进行聚合,然后用combine函数将每个分区的结果和初始值进行combine操作,
- fold:折叠操作,aggregate的简化操作。
- saveAsTextFile:将数据集的元素以textFile的形式保存到HDFS文件系统或者其他支持的文件系统,对于每个元素,Spark将会调用toString方法,将它换为文件中的文本。
- saveAsSequenceFile:将数据集中的元素以Hadoop sequencefile的格式保存到指定的目录下。
- saveAsObjectFile:用于将RDD中的元素序列化成对象,存储到文件中。
- countByKey:针对(K,V)类型的RDD,返回一个(K,Int)的map.
- foreach:在数据集的每一个元素上,运行函数Function进行更新。
RDD的依赖
RDD和它依赖的父RDD的关系有两种不同的类型,即窄依赖和宽依赖。
窄依赖:是每一个父RDD的partition最多被子RDD的一个Partition使用。
宽依赖:指的是多个子RDD的Partition会依赖同一个父RDD的partition。
血统:可以恢复丢失的分区。RDD的lineage会记录RDD的元数据信息和转换行为,当该RDD的部分分区数据丢失时,它可以根据这些信息来重新运算和回复丢失的数据分区。
RDD的缓存
有persist方法和cache方法
cache()调用persist()。