spark core
-
1.Spark的算子
什么是RDD?
RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变、可分区、弹性。RDD是一个可以并行操作的容错的容错集合集合。
1.不可以变是指的是对rdd进行算子计算,会生成一个新的rdd,不会改变原来最初的rdd.
2.数据可以分区处理
RDD的属性(源码中的一段话)
1.一组分片(Partition),对于RDD来说,每个分片都会被一个计算任务处理。用户没有指定分片数按找cpu的core数目来指定。
2.一个计算每个分区的函数。Spark中RDD的计算是以分片为单位的。
3.RDD之间的依赖关系。RDD的每次转换都会生成一个新的RDD,所以RDD之间就会形成类似于流水线一样的前后依赖关系。数据丢失也不要重复计算。
4.一个Partitioner,即RDD的分片函数。当前Spark中实现了两种类型的分片函数,一个是基于哈希的HashPartitioner,另外一个是基于范围的RangePartitioner。
5.一个列表,存储存取每个Partition的优先位置(preferred location)
-
2.RDD的创建方式
1.通过外部的数据文件创建,如HDFS
val rdd1 = sc.textFile(“hdfs://192.168.88.111:9000/data/data.txt”)
2.通过sc.parallelize进行创建
val rdd1 = sc.parallelize(Array(1,2,3,4,5,6,7,8))
3.从其他集合转换。
RDD的类型:Transformation和Action
-
3.RDD的基本原理
-
4.Transformation
RDD中的所有转换都是延迟加载的,也就是说,它们并不会直接计算结果。相反的,它们只是记住这些应用到基础数据集(例如一个文件)上的转换动作。
在这里插入图片描述
-
5、Action
-
6.RDD的缓存机制
RDD通过persist方法或cache方法可以将前面的计算结果缓存,但是并不是这两个方法被调用时立即缓存,而是触发后面的action时,该RDD将会被缓存在计算节点的内存中,并供后面重用。
通过查看源码发现cache最终也是调用了persist方法,默认的存储级别都是仅在内存存储一份,Spark的存储级别还有好多种,存储级别在object StorageLevel中定义的。
缓存有可能丢失,或者存储存储于内存的数据由于内存不足而被删除,RDD的缓存容错机制保证了即使缓存丢失也能保证计算的正确执行。通过基于RDD的一系列转换,丢失的数据会被重算,由于RDD的各个Partition是相对独立的,因此只需要计算丢失的部分即可,并不需要重算全部Partition。
cache和persist的区别
cache()调用了persist(),persist有一个stroageLevel 类型的参数,这个表示的是RDD的缓存级别。
cache只有一个默认的缓存级别MEMORY_ONLY ,而persist可以根据情况设置其它的缓存级别。
‘