RDD宽依赖,窄依赖:
1)窄依赖指的是每一个parent RDD的Partition最多被子RDD的一个Partition使用
2)宽依赖指的是多个子RDD的Partition会依赖同一个parent RDD的Partition
RDD的弹性:
1)自动的进行内存和磁盘的存储切换;
2)基于Lingage的高效容错;
3)task如果失败会自动进行特定次数的重试;
4)stage如果失败会自动进行特定次数的重试,而且只会计算失败的分片;
5)checkpoint和persist,数据计算之后持久化缓存
6)数据调度弹性,DAG TASK调度和资源无关
7)数据分片的高度弹性,a.分片很多碎片可以合并成大的,b.par
RDD有哪些缺陷?
1)不支持细粒度的写和更新操作(如网络爬虫),spark写数据是粗粒度的
所谓粗粒度,就是批量写入数据,为了提高效率。但是读数据是细粒度的也就是
说可以一条条的读
2)不支持增量迭代计算,Flink支持
RDD创建方式:
1).使用程序中的集合创建rdd
2).使用本地文件系统创建rdd
3).使用hdfs创建rdd,
4).基于数据库db创建rdd
5).基于Nosql创建rdd,如hbase
6).基于s3创建rdd,
7).基于数据流,如socket创建rdd
RDD操作方法:
Transformation:
map和flatMap:flatMap有扁平化操作,转化后会合成一个集合
reduceByKey:transformation
Action:
collect,reduce,take,count,saveAsTextFile
Controller:
cache/persist:
cache是MEMORY_ONLY级别
persist可以设置更多分级
以下场景会使用persist
1)某个步骤计算非常耗时,需要进行persist持久化
2)计算链条非常长,重新恢复要算很多步骤,最好使用persist
3)checkpoint之前:框架发现有checnkpoint,checkpoint时单独触发一个job,需要重算一遍,checkpoint前要持久化,写个rdd.cache或者rdd.persist,将结果保存起来,再写checkpoint操作,这样执行起来会非常快,不需要重新计算rdd链条了
4)shuffle之前:框架默认将数据持久化到磁盘,这个是框架自动做的
5)shuffle之后:shuffle要进行网络传输,风险很大,数据丢失重来,恢复代价很大