Spark-Steaming 文档之容错机制

容错机制

在这一节,我们要讨论一下Spark Streaming的容错机制。

背景知识

为了能够更好地理解Spark Streaming的容错机制,我们先来看下Spark RDD的基本容错机制。

  1. 任何一个RDD都是一个不可变的,可重计算的,分布式的数据集。每一个RDD都记录了确定的血缘关系(一些列转换操作的依赖关系)来进行容错。
  2. 如果任何RDD分区因为worder节点错误导致丢失,那么这个分区就可以通过原始输入数据集来恢复,恢复的过程就是靠RDD记录的血缘关系(一些列转换操作的依赖关系)。
  3. 假设RDD的transformaction是不变的,那么无论集群发生任何错误,最终生成的RDD中的数据都是一样的。

Spark的处理数据来自于容错的文件系统(HDFS,S3等),因此从容错数据生成的RDD都是容错的。然而Spark Streaming从网络接受数据的情况并不是这样。为了同样能够让生成的RDD具有容错特性,接受的数据会生成一个副本并分布在不同的集群节点上。这就会有两种类型的数据需要从错误中恢复。

  1. Data received and replicated - 这种数据会在失败后不会丢失,应为它会有一个副本保存在另外一个节点上,就像分身术一样,并且两个都是本体。
  2. Failure of the Driver Node - 如果正在运行Spark Streaming的driver节点失败了,那么很显然SparkContext也就没哟了,所有执行器以及暂存在执行器内存中的数据也就丢失了。

有了这些基础知识之外,我们接下来可以详细了解一下Spark Streaming的容错机制了。

定义

流处理系统通常会关心每一条数据会被处理几次。一个系统在所有的操作情况下(不管是错误,还是其他),可以提供三种类型的保障机制。

  1. At most once - 每一条数据都会被执行一次或者不执行。
  2. At least once - 每一条记录都会被执行一次或者多次。这种比第一种有更强的容错能力,能够保证数据不丢失。但是可能需要多次重复计算。
  3. Exactly once - 每一条记录都会恰好执行一次,并且没有数据丢失没有数据被执行多次。这明显是这三种中最好的一个保障机制。

基本概念

在任何流系统中,处理数据都会分为三步。

  1. Receiving the data - 使用接收器或者其他方式从源接收数据。
  2. Transforming the data - 接收到的数据进行transform操作,通过DStream或者RDD上定义的各种transformaction。
  3. Pushing out the data - 最终,经过处理的数据,要输出到外部系统。比如文件系统或者数据库。

如果一个流处理应用可以提供一个end-to-end的exactly-once guarantees,那么每一步都要提供一个exactly-once guarantees。也就是说,每一条记录都只能接受一次,转换一个,输出一次。下面,让我们来看一下Spark Streaming对这三步提供的一个机制。

  1. Receiving the data - 不同的源能够提供不同的担保机制,下面我们会说
  2. Transforming the data - 所有接收到的数据都会被处理一次,这要感谢RDD提供的guarantees。即使处理过程中发生了错误,只要输入数据还能被访问,那么最终结果永远都是一样。
  3. Pushing out the data - 输出操作只保证了at-least once,因为这取决于你使用了什么类型的操作和输出到的外部系统是否提供了什么机制(比如食事务控制)。但是用户可以实现自己的事务控制方法,来保证exactly-once。这会在这一节的后面讨论到。

数据接收机制

不同的输入数据源能够提供从at-least once到exactly once的不同保证机制。

文件源

如果待输入数据已经持久化到高可用文件系统中。那么Spark Streaming就可以从任何错误值恢复,并重新处理所有数据。这种方式提供了exactly once这种最高级别的保证机制,保证了任务错误情况下数据都能够被处理并且只处理一次。

基于接收器的源

对于基于接收器的数据源来说,容错机制同时取决于错误发生的情况和使用了何种接收器。为了方便讨论,我们把接收器分为两类。

  1. 可靠型接收器 - 这一类接收器会在确保接收到的数据已经备份之后和数据源通信告知数据已经接收。如果接收器出现错误,数据源就不会收到来自于接收器对于已经缓存(但并未备份)数据的确认消息。因此,在接收器重启后,数据源会重新发送数据到接收器来保证数据不会丢失。
  2. 非可靠型接收器 - 这种接收器没有与数据源的确认机制,所以有可能因为driver活着worker的问题出现错误后发生数据丢失的情况。

下面看看使用不同种类的接收器在具体错误发生的情况下产生的结果。如果worker节点发生故障,使用可靠型接收器不会发生数据丢失,而使用非可靠型接收器会导致还未备份的数据丢失。如果driver节点发生故障,那么所有接收到和已经备份到内存中的数据都会丢失,这将影响带有状态信息转换操作的结果。

为了避免丢失接收到的数据,Spark 1.2开始引入了write ahead logs机制来吧接收到的数据备份到可靠地存储系统中。启用write ahead logs机制并使用可靠型接收器可以保证零数据丢失。使用这种方案,提供了at-least once guarantee机制。

Deployment Scenario Worker Failure Driver Failure
Spark 1.1 or earlier, OR Spark 1.2 or later without write ahead logs Buffered data lost with unreliable receivers Zero data loss with reliable receivers At-least once semantics Buffered data lost with unreliable receivers Past data lost with all receivers Undefined semantics
Spark 1.2 or later with write ahead logs Zero data loss with reliable receivers At-least once semantics Zero data loss with reliable receivers and files At-least once semantics

输出机制

输出操作(例如foreachRDD)都提供了at-least once机制,这意味着数据可能会不止一次地输出到外部系统。当你使用saveAs***Files方法的时候就可能会发生重复写入相同数据。你需要一些额外的工作来保证exactly-once。在这里提供两种解决方案。

  • 等价更新 - 即为多次写入同样的数据到相同位置,这样并不会影响最终结果。
  • 事务控制 - 每一次的更新数据操作都会启动事务,用是无奈保证exactly once。
    • 使用batch time和partition index来创建一个id,使用这个id来确保数据的唯一性
    • 启动事务并使用这个id来更新外部系统数据,如果这个id不存在则提交更新,如果这个id已经存在那么则放弃更新。
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
  }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容