Resilient的含义是“可迅速恢复的”,形象一点可以理解为像海绵的物体,不管怎么挤压它,它最终会很快地恢复到原始的状态。
Spark是一个基于普通商业机器的分布式系统,天然地会频繁面对节点宕机,这些节点的宕机会导致RDD的若干分区不可用,为了能让Spark系统能快速地从不可用状态恢复过来,可用的方法还是比较多的
比如和Kafka那样为每个分区设置多备份,一旦分区的主节点宕机,剩下来的备份节点会选一个做为主节点。
又比如Hadoop的MapReduce,它会将中间数据存储到HDFS,实现数据的高可用,假设一个reduce task失败,MR会重启这个task,并从HDFS中读到高可用的数据(由map生成的)。
Kafka的高可用机制和MR的高可用机制基本相同,就是通过数据冗余来完成。另外MR的机制会移动大量的数据(比如reduce读中间文件),移动数据是一个非常昂贵的操作,包含了网络通信和磁盘I/O,有时需要花上不少时。因此,MR的机制只能说是“可恢复的”,但无法谈得上“可迅速恢复的”。
Spark为了达到“可迅速恢复的”这个目标,它采用了和kafka以及MR不同的机制,它没有使用冗余的手段,而是记录每个RDD是如何生成的,也称为Transformation Log,一旦RDD的某个分区所在的机器节点宕机,Spark会利用Transformation Log重新生成丢失的分区,也即是将分区快速移动到另一个机器节点上,因为不需要搬移磁盘里的数据,所以这个恢复过程是非常快的。
Spark通过移动计算到数据节点(locality),用内存缓存中间数据,跨Worker采用网络通信(不基于HDFS)传送数据,大大减少数据搬移的工作量,而且不需要针对分区做备份冗余而增加系统的复杂度,从而实现“可迅速恢复的”这个特性。
原文:https://www.cnblogs.com/ralgo/p/14878642.html