RDD依赖:
窄依赖:每一个父RDD的分区最多被子RDD的一个分区使用
宽依赖:每一个父RDD的分区被多个子RDD分区依赖
RDD依赖的作用:
血统(Lineage)会记录RDD的元数据和转换行为,
以便恢复丢失的分区。
stage划分:
DAG(有向无环图):RDD的一系列转换组成了DAG
划分stage的目的是生成任务,每个stage对应一种任务,
划分stage的关键因素为是否发生了宽依赖(是否shuffle(洗牌))
如下图,groupBy和join是宽依赖,分别是stage1、stage2,
再加上总的算一个stage,划分了3个stage
web界面观察stage:
启动spark集群:
启动hadoop:start-all.sh
启动spark:./start-all.sh
使用spark-shell:
spark-shell --master yarn-client
scala> sc.textFile("hdfs://master:9000/test/wordcount.txt").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).collect
res1: Array[(String, Int)] = Array((scala,2), (python,2), (hello,1), (apple,2), (java,1))
在spark页面观察进程:http://192.168.32.128:8080/
点进去有job、stage可以查看
checkpoint:
检查点checkpoint的作用:
对RDD做checkpoint,可以切断做checkpoint的RDD的依赖关系,
将RDD数据保存到可靠存储(如HDFS)以便数据恢复,保证数据的安全性(HDFS的备份规则)。
cache或者persist放到内存或者磁盘中,但是这样也不能保证数据完全不会丢失,存储的这个内存出问题了或者磁盘坏了,也会导致spark从头再根据RDD计算一遍,所以就有了checkpoint,其中checkpoint的作用就是将DAG中比较重要的中间数据做一个检查点将结果存储到一个高可用的地方(通常这个地方就是HDFS里面)
checkpoint步骤:
1. 建立checkpoint存储路径
scala> sc.setCheckpointDir("hdfs://master:9000/checkpoint0727")
2. rdd1.cache()
3. rdd1.checkpoint()
在checkpoint的时候强烈建议先进行cache,并且当你checkpoint执行成功了,
那么前面所有的RDD依赖都会被销毁