课程表

Spark 基础

Spark RDDs

Spark Streaming

Spark SQL

GraphX编程指南

工具箱
速查手册

Spark DStream容错

当前位置:免费教程 » 数据库/运维 » Spark

DStream基于RDD组成,RDD的容错性依旧有效,我们首先回忆一下SparkRDD的基本特性。

lRDD是一个不可变的、确定性的可重复计算的分布式数据集。RDD的某些partition丢失了,可以通过血统(lineage)信息重新计算恢复;

l如果RDD任何分区因worker节点故障而丢失,那么这个分区可以从原来依赖的容错数据集中恢复;

l由于Spark中所有的数据的转换操作都是基于RDD的,即使集群出现故障,只要输入数据集存在,所有的中间结果都是可以被计算的。

Spark Streaming是可以从HDFS和S3这样的文件系统读取数据的,这种情况下所有的数据都可以被重新计算,不用担心数据的丢失。但是在大多数情况下,Spark Streaming是基于网络来接受数据的,此时为了实现相同的容错处理,在接受网络的数据时会在集群的多个Worker节点间进行数据的复制(默认的复制数是2),这导致产生在出现故障时被处理的两种类型的数据:

1)Data received and replicated :一旦一个Worker节点失效,系统会从另一份还存在的数据中重新计算。

2)Data received but buffered for replication :一旦数据丢失,可以通过RDD之间的依赖关系,从HDFS这样的外部文件系统读取数据。

此外,有两种故障,我们应该关心:

(1)Worker节点失效:通过上面的讲解我们知道,这时系统会根据出现故障的数据的类型,选择是从另一个有复制过数据的工作节点上重新计算,还是直接从从外部文件系统读取数据。

(2)Driver(驱动节点)失效 :如果运行 Spark Streaming应用时驱动节点出现故障,那么很明显的StreamingContext已经丢失,同时在内存中的数据全部丢失。对于这种情况,Spark Streaming应用程序在计算上有一个内在的结构——在每段micro-batch数据周期性地执行同样的Spark计算。这种结构允许把应用的状态(亦称checkpoint)周期性地保存到可靠的存储空间中,并在driver重新启动时恢复该状态。具体做法是在ssc.checkpoint(<checkpoint directory>)函数中进行设置,Spark Streaming就会定期把DStream的元信息写入到HDFS中,一旦驱动节点失效,丢失的StreamingContext会通过已经保存的检查点信息进行恢复。

最后我们谈一下Spark Stream的容错在Spark 1.2版本的一些改进:

实时流处理系统必须要能在24/7时间内工作,因此它需要具备从各种系统故障中恢复过来的能力。最开始,SparkStreaming就支持从driver和worker故障恢复的能力。然而有些数据源的输入可能在故障恢复以后丢失数据。在Spark1.2版本中,Spark已经在SparkStreaming中对预写日志(也被称为journaling)作了初步支持,改进了恢复机制,并使更多数据源的零数据丢失有了可靠。

对于文件这样的源数据,driver恢复机制足以做到零数据丢失,因为所有的数据都保存在了像HDFS或S3这样的容错文件系统中了。但对于像Kafka和Flume等其它数据源,有些接收到的数据还只缓存在内存中,尚未被处理,它们就有可能会丢失。这是由于Spark应用的分布操作方式引起的。当driver进程失败时,所有在standalone/yarn/mesos集群运行的executor,连同它们在内存中的所有数据,也同时被终止。对于Spark Streaming来说,从诸如Kafka和Flume的数据源接收到的所有数据,在它们处理完成之前,一直都缓存在executor的内存中。纵然driver重新启动,这些缓存的数据也不能被恢复。为了避免这种数据损失,在Spark1.2发布版本中引进了预写日志(WriteAheadLogs)功能。

预写日志功能的流程是:1)一个SparkStreaming应用开始时(也就是driver开始时),相关的StreamingContext使用SparkContext启动接收器成为长驻运行任务。这些接收器接收并保存流数据到Spark内存中以供处理。2)接收器通知driver。3)接收块中的元数据(metadata)被发送到driver的StreamingContext。这个元数据包括:(a)定位其在executor内存中数据的块referenceid,(b)块数据在日志中的偏移信息(如果启用了)。

用户传送数据的生命周期如下图所示。

clip_image024

类似Kafka这样的系统可以通过复制数据保持可靠性。允许预写日志两次高效地复制同样的数据:一次由Kafka,而另一次由SparkStreaming。Spark未来版本将包含Kafka容错机制的原生支持,从而避免第二个日志。

转载本站内容时,请务必注明来自W3xue,违者必究。
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号