Spark中持久化和容错checkpint的区别
checkpoint是考虑安全性,RDD可以使用persist或cache方法进行持久化。数据将会在对此action操作时进行计算,并缓存在节点的内存中。Spark的缓存具有容错机制,如果一个缓存的RDD的某个分区丢失了,Spark将按照原来的计算过程,自动重新计算并进行缓存。
持久化为了高效性。持久化到磁盘,以序列化的Java对象形式持久化到内存(可以节省空间)、跨界点复制,以off-heap的方式存储在Tachyon中。
RDD持久化工作原理
当对RDD执行持久化操作时,每个节点都会讲自己操作的RDD的partition持久化到内存中,并且在之后对该RDD的反复使用中,直接使用内存的partition。这样的话,对于针对一个RDD的反复执行多个操作的场景,就只要对RDD计算一次即可,后面直接使用该RDD,而不需要计算多次该RDD。
宽依赖和窄依赖
窄依赖:父RDD每一个分区最多被一个子RDD的分区所用;表现为一个父RDD的分区对应于一个子RDD的分区,或两个父RDD的分区对应于一个子RDD的分区。常见的窄依赖有:map、filter、union、mapPartitions、mapValues、join(父RDD是hash-partitioned)等
宽依赖:父RDD的每个分区都可能被多个字RDD分区所使用,子RDD分区通常对应所有的父RDD分区。常见的宽依赖有:groupByKey、partitionBy、reduceByKey、jon(父RDD非hash-partitioned)等
RDD的创建方式
- 从Hadoop文件系统(如HDFS、Hive、HBase)输入创建
- 从父RDD转换得到新RDD
- 通过parallelize或makeRDD将单机数据创建为分布式RDD
- 基于DB(Mysql)、NoSQL(HBase)、S3(SC3)、数据流创建
RDD操作
RDD支持两种操作:转化操作
和行动操作
。
转化操作是返回一个新的RDD的操作。
行动操作是向驱动器程序返回结果或把结果写入到外部系统的操作。
RDD是惰性求值的。当RDD调用转化操作的时候,操作不会立即执行,Spark会在内存记录下所要求执行的操作的相关信息,只有在调用行到操作的时候,才会开始计算。
Spark使用惰性求值,这样就可以把一些操作合并到一起来减少计算数据的步骤。