RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变、可分区、里面的元素可并行计算的集合。
1、getPartitions 一组分区的集合
·分区数决定Task个数,决定并行度。默认是线程数。个数太多进行并发
2、Compute 计算函数
3、getDependencies RDD依赖其他RDDS的关系
4、[Partitioner]分区器
5、[getPreferredLocation]首选位置
来源:Spark学习之路 (三)Spark之RDD - 扎心了,老铁 - 博客园
1、RDD的创建
RDD要进行Collect才会进行方法的调用。rdd.collect().foreach(println)
1、从集合(内存)中创建,底层是parallelize
sc.makeRDD(本地集合,numSlices分区数)
val seq = Seq[int](1,2,3,4)
val rdd = sc.makeRDD(seq)
2、从外部存储创建RDD
sc.textile(Path,分区数)
sc.wholeTextFiles(Path,分区数) 专门用于读取小文件
·读取结果为元组:(文件路径,文件数据)
2、RDD的算子类型
Spark支持两种算子:Transformation、Action
Transformation:转化为另一种RDD,具有lazy特性(延迟加载)。Transformation算子的代码不会真正被执行。只有当我们的程序里面遇到一个action算子的时候,代码才会真正的被执行。
Action:触发代码的运行,我们一段spark代码里面至少需要有一个action算子。
案例
3、算子类型
1映射:map、mapPartitions
map(func):串行操作,一条一条数据进行逻辑映射
rdd.map(_.swap),交换<K,V>
mapParttions:批处理操作,先将整个分区加载到内存,以分区为单位进行映射。可以对逻辑进行修改
2扁平映射:flatMap(func)
分词效果.flatMap( _.split(" ") )
glom:与
3分区:repatriation、coalesce
reparttion(num、shuffle-bool):可以增加或减少分区,默认开启shuffle
coalesce:默认只能减少分区,不开启shuffle(可手动开启)
4无key聚合[Action]:sum、reduce、fold、aggregate
5有key聚合[Transformation]:针对<K,V>对的函数
groupByKey + sum / Reduce 、reduceByKey 、foldByKey 、 aggregateByKey
1和2的区别:
groupByKey仅分组,需要额外的聚合函数才能聚合。reduceByKey有预聚合,类似MR的combine功能,可以减少reduce次数。
6 Join:join、leftOuterJoin、rightOuterJoin
RDD1.join(RDD2)
7排序:sortBy、sortByKey
sortBy:(_._按第几个排序,降序bool) //默认升序
sortByKey:按key排
4、RDD持久化(缓存) 与 chekpoint检查点
RDD.cache 纯内存,会在血缘关系中添加新的依赖,一旦出现问题可以重新读取
RDD.persist 可以选择模式内存、磁盘等
·默认是MEMORY_ONLY,推荐使用MEMORY_AND_DISK,防止内存占用过高
RDD.unpersist 释放资源,使用完成记得释放
checkpoint 将数据长久保存在磁盘文件中,一般存在HDFS。会切断血缘关系作为顶级依赖。
为了提高效率在checkpoint前进行cache操作,避免重复的运算。
首先先设置sc.setCheckpointDir路径,后可直接RDD.checkpoint标记
5、RDD IO
三种文件格式
rdd.saveAsTextFile("Path")
rdd.saveAsObjectFile("Path")
rdd.saveAsSequenceFile("Path")
共享变量(广播变量、累加器)
累加器:分布式共享只写变量
可在Task对变量进行添加改变,执行后返回到Driver端聚合。默认提供longAccumalator和doubleAccumalator、collctAccumalator
广播变量:分布式共享只读变量
Executor是一个JVM,广播变量可以加载到JVM内存中,不同task可以进行使用