Spark Streaming 为了实现容错特性,接收到的数据需要在集群的多个Worker 节点上的 executors 之间保存副本(默认2份)。当故障发生时,有两种数据需要恢复:

1. 已接收并且有副本的数据。当只有一台worker 发生故障时,这些数据不会丢失

2. 已接收但还没有副本的数据。只能从数据源重新获取

我们需要考虑两种发生故障的情况:

1. Worker 节点故障。如果receiver 运行在发生故障的worker 上,缓存的数据将丢失。

2. Driver 发生故障。很显然 SparkContext 将会丢失,所有executors连同其内存中的数据将会丢失。

了解容错之前,需要知道的数据处理的类型:

1. 最多一次。数据被处理一次或没被处理

2. 至少一次。数据被处理一次或多次

3. 仅有一次。有且仅有一次

可以看出,仅有一次是我们需要达到的目标。

Spark Streaming 数据处理的三个步骤:

1. 接收数据。

2. 处理数据。

3. 输出数据。最终结果被发送到外部系统。如FileSystem,Database等

Spark Streaming想要保证数据仅有一次被处理,以上三个步骤均需要保证仅有一次被处理。

1. 接收数据。 不同的数据来源有不同的保证。

(1)数据来源是文件系统。如果数据来源于容错的文件系统(如:HDFS),Spark Streaming 能保证此步骤中的数据仅被处理一次。

(2)数据来源基于Receiver。容错将取决于失败的类型和Receiver的类型。有以下两种Receiver
        (a)可靠的Receiver。Receiver将会在把接收到的数据保存副本后和Source确认已收到数据。如果此类Receiver发生故障,那么Source将接收不到确认信息。Receiver重启后,Source会继续发送未被确认的信息。

(b)不可靠的Receiver。不会发送确认信息

如果Worker 发生故障,对于(a)数据不会丢失。对于(b)没有副本的数据会丢失。

如果Driver 发生故障,所有之前收到的数据都会丢失,这将影响有状态的操作。

为了解决上述丢失问题,Spark1.2 开始建议使用“write ahead logs” 机制,但是也只能保证“至少处理一次”。

(3)数据来源于Kafka Direct API。可以保证“仅被处理一次”。

2. 处理数据。Spark Streaming 内部RDD保证“仅被处理一次”。

3. 输出数据。默认保证“至少处理一次”。因为它取决于最终结果的操作类型和下游的系统(是否支持事务)。

当worker 发生故障时,输出操作可能会被执行多次。想要保证“仅被处理一次”,有以下两种方式:

(1)等价更新。如:输出操作是 saveAs***Files 操作时,因为写文件会直接覆盖原来的文件。

(2)事务更新。使输出的更新操作都具有事务。

(a)使用 batch time (存在于foreachRDD中) 和 RDD 的 partition index 组成唯一标识

(b)下游系统使用(a)中唯一标识来判断此数据是否被处理过。

dstream.foreachRDD { (rdd, time) =>
rdd.foreachPartition { partitionIterator =>
val partitionId = TaskContext.get.partitionId()
val uniqueId = generateUniqueId(time.milliseconds, partitionId)
// use this uniqueId to transactionally commit the data in partitionIterator
}
}

Spark Streaming 的容错的更多相关文章

  1. Spark Streaming的容错和数据无丢失机制

    spark是迭代式的内存计算框架,具有很好的高可用性.sparkStreaming作为其模块之一,常被用于进行实时的流式计算.实时的流式处理系统必须是7*24运行的,同时可以从各种各样的系统错误中恢复 ...

  2. 62、Spark Streaming:容错机制以及事务语义

    一. 容错机制 1.背景 要理解Spark Streaming提供的容错机制,先回忆一下Spark RDD的基础容错语义: 1.RDD,Ressilient Distributed Dataset,是 ...

  3. spark streaming的容错:防止数据丢失

    官方这么说的 [Since Spark 1.2] Configuring write ahead logs - Since Spark 1.2, we have introduced write ah ...

  4. 3.spark streaming Job 架构和容错解析

    一.Spark streaming Job 架构 SparkStreaming框架会自动启动Job并每隔BatchDuration时间会自动触发Job的调用. Spark Streaming的Job ...

  5. Spark入门实战系列--7.Spark Streaming(上)--实时流计算Spark Streaming原理介绍

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .Spark Streaming简介 1.1 概述 Spark Streaming 是Spa ...

  6. 通过案例对 spark streaming 透彻理解三板斧之三:spark streaming运行机制与架构

    本期内容: 1. Spark Streaming Job架构与运行机制 2. Spark Streaming 容错架构与运行机制 事实上时间是不存在的,是由人的感官系统感觉时间的存在而已,是一种虚幻的 ...

  7. Spark Streaming编程指南

    Overview A Quick Example Basic Concepts Linking Initializing StreamingContext Discretized Streams (D ...

  8. Spark Streaming简介及原理

    简介: SparkStreaming是一套框架. SparkStreaming是Spark核心API的一个扩展,可以实现高吞吐量的,具备容错机制的实时流数据处理. 支持多种数据源获取数据: Spark ...

  9. <Spark><Spark Streaming>

    Overview Spark Streaming为用户提供了一套与batch jobs十分相似的API,以编写streaming应用 与Spark的基本概念RDDs类似,Spark Streaming ...

随机推荐

  1. Android 基础-2.0 拔打电话号码

    1.添加权限 在AndroidManifest.xml 添加打电话权限 <uses-permission android:name="android.permission.CALL_P ...

  2. 代码题(14)— 合并有序链表、数组、合并K个排序链表

    1.21. 合并两个有序链表 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出 ...

  3. Selenium-使用firepath识别元素

    利用firepath进行元素识别提前已经安装好firebug和firepath 比如,打开http://www.baidu.com 1.按下F12 2.点击如图的位置 3.选择元素,可以定位出元素的属 ...

  4. oubango中视频JitterBuffer的优化

       

  5. bzoj 3572: [Hnoi2014]世界树 虚树

    题目: Description 世界树是一棵无比巨大的树,它伸出的枝干构成了整个世界.在这里,生存着各种各样的种族和生灵,他们共同信奉着绝对公正公平的女神艾莉森,在他们的信条里,公平是使世界树能够生生 ...

  6. poj 3469 Dual Core CPU——最小割

    题目:http://poj.org/problem?id=3469 最小割裸题. 那个限制就是在 i.j 之间连双向边. 根据本题能引出网络流中二元关系的种种. 别忘了写 if ( x==n+1 ) ...

  7. Centos6.5命令行快捷键

    ctrl+a打开一个新的终端 ctrl+l 清除屏幕内容 ctrl+a 切换到命令行开始ctrl+e 切换到命令行末尾ctrl+u 剪切光标之前的内容ctrl+k 剪切光标之后的内容 Ctrl+-&g ...

  8. 【转】 Pro Android学习笔记(四八):ActionBar(1):Home图标区

    目录(?)[-] Home Icon 源代码 TextView的滚动 返回主activity或指定activity     ActionBar在Android 3.0 SDK中为平板引入,在4.0中也 ...

  9. 06_android虚拟机介绍

    分辨率不用选太高,否则会占用太大内存.你选高分辨率一跑起来会干掉你的500多MB的内存.1/8内存就没了.百分之97%或者是98%的设备都是ARM CPU.ARM自己不生产CPU,它生产的是一个标准的 ...

  10. Maven Cargo 远程部署到tomcat7x

    pom.xml中加入cargo的Plugin声明: <plugin> <groupId>org.codehaus.cargo</groupId> <artif ...