RDD是什么?
RDD(Resilient Distributed Dataset)是一个弹性分布式数据集,简单的说就是弹性加分布式的数据集。
在rdd里的数据可以并行在分布式集群中进行计算;
弹性就是说RDD中的数据可以存储在内存或者是磁盘,而且RDD中的分区是可以改变的;
RDD有哪些特性?
RDD的数据结构是有多个partition的list;
RDD的每个partition上面都会有function,作用是用来实现RDD之间partition的转换;
一个RDD可以依赖于其他多个RDD,当内存中的RDD操作时出错或丢失会进行重算(容错性);
RDD 其实只是数据集的抽象,分区内部并不会存储具体的数据。Partition 类里有一个 index 变量,表示这个分区在 RDD 内的编号,通过 RDD 编号和分区编号可以确定这个分区对应的block编号,利用底层数据存储层提供的接口,就能从HDFS或者内存里提获得对应的数据。
不同RDD之间的partition有两种关系:宽依赖和窄依赖。宽依赖的意思就是父RDD的每个分区都可以被子RDD的分区去使用,窄依赖就是说父RDD的分区只能呗子RDD的分区的一个分区使用。
通过RDD的宽依赖窄依赖可以把整个job分成多个stage,stage之间的执行就是有顺序的了。
Spark任务会根据RDD之间的依赖关系,形成一个DAG有向无环图,DAG会提交给DAGScheduler,DAGScheduler会把当前的DAG划分相互依赖的多个stage,划分依据就是宽窄依赖,遇到宽依赖就划分stage,每个stage包含一个或多个task,然后将这些task以taskSet的形式提交给TaskScheduler分发给executor并发执行。
检查点checkpoint与cache比较
spark里有个检查点(chekpoint)的缓存机制,在需要计算的RDD太多的时侯,可以避免重新计算之前计算过的RDD。对RDD做checkpoint之后,可以检查RDD是否被持久化到磁盘或计算,再把这个结果持久化到磁盘或HDFS。
Checkpoint会把当前RDD保存到一个目录中。再把所有依赖的父级rdd的信息全都清除掉。也正是因为 Checkpoint会清除父级RDD的信息,所以在Checkpoint之前应该先做persist(持久化)操作,否则就要重新计算一遍。 一般来说,Lineage链较长需要采用检查点机制。比如要做1000次rdd计算,在第999次时做了Checkpoint,如果第1000次的时候,只要重新计算第1000即可,不用从头到尾再计算一次。
cache缓存数据是由executor管理的,executor消失了,被cache的数据会被清除,RDD重新计算。而checkpoint将数据保存到磁盘或HDFS,job可以从checkpoint点继续计算。cache其实主要是用来缓存会被重复使用到的RDD,这也是spark的计算比hadoop的传统的mapreduce操作要快的原因之一。
已经为大家精心准备了大数据的系统学习资料,从Linux-Hadoop-spark-……,需要的小伙伴可以点击进入
一般来说,获取一个RDD的时候,显示找这个RDD有没有缓存过,有就直接取缓存,没有就看下有没有checkpoint,有就从hdfs里读出来,没有就用lineage算出来。
hadoop和spark的相同和差异?
hadoop做mapreduce操作每一步都会落在磁盘上,IO的操作会很影响性能,spark会把常用的rdd做cache缓存起来用。所以spark的速度上来说是远高于的hadoop的。
hadoop的功能比较单一,支持mapreduce,没有其他的使用方式,spark是支持很多其他的功能,比如实时流处理,graphx,机器学习,都提供了很好用的类库去简化计算。
不过可拓展性上来说,hadoop是更厉害一点的,hadoop支持的集群是比spark要大很多的。
Spark Streaming流处理
Spark Streaming会运行接收器来不断的接收输入的数据流,然后根据程序配置的时间,将时间范围内的所有数据打成一个RDD,发送给Spark Core去进行处理。