在spark中,怎么强调RDD都不为过,很多资料把RDD的第一个单词翻译成弹性,我觉得这个翻译偏离本意太严重了
-
RDD,能够快速恢复的分布式式内存数据集;为什么是内存数据集? 因为spark是为更高效的迭代计算而设计的,相比其它的计算框架比如mr,spark大尺度地利用了集群的内存(数据一旦落盘,就需要序列化,磁盘io, 甚至网络io,性能就低了)
-
因为是内存数据集,RDD的容错性设计不能基于副本(内存多宝贵啊,哪经得起副本这种败家玩法;而且如果使用副本技术,需要把同一个副本的数据存放到不同的机器的内存,这个会发生很大的网络io),而是基于lineage。这个和mr有很大差别。
-
RDD需要在计算过程中提供容错能力,海量数据集的快速恢复是必备能力。RDD不能像RMDB使用像redo,undo这种细粒度的方式来提供恢复能力。为什么?
-
如果RDD使用细粒度的方式,它需要建立内存共享(share memory)的机制,需要做大量的内存加锁,线程/进程同步的工作,可想而知,效率会很低。
-
RDD使用的是粗粒度的容错性:先通过transformation建立逻辑上的lineage。如果需要容错,可以通过lineaga重新计算一遍transforamtion来构造RDD,大部分场景中,这个过程要远比从磁盘重新load数据进内存快得多。
-
这种方式,可以避免对RDD加锁,避免实现分布式锁和分布式同步,性能会更高,但是必须要求RDD“不可变”。
-
当然,spark也为RDD提供了缓存的能力,避免重新计算,尤其对复杂低效的计算,比如shuffle。总之,这种方式,简单粗暴,能快速恢复但消耗内存。
快速恢复是RDD特性,这也是Resilient这个单词的本意呀。