Spark-Streaming容错语义

一、背景

为了理解Spark Streaming提供的语义,我们先回顾西Spark RDD的基本容错语义学。

  1. RDD是一个不可变的、确定性可重新计算的分布式数据集。每个RDD都记住在容错输入数据集上用于创建它的确定性操作的沿袭。
  2. 如果RDD的任何分区由于工作节点故障而丢失,则可以使用操作沿袭从原始容错数据集重新计算该分区。
  3. 假设所有RDD转换都是确定性的,最终转换后的RDD中的数据将始终相同,而不管Spark集群中的故障如何

Spark对HDFS或S3等容错文件系统中的数据进行操作。因此,从容错数据生成的所有RDD也是容错的。然而,Spark Streaming并非如此,因为在大多数情况下,数据是通过网络接收的(使用fileStream时除外)。为了实现所有生成的RDD的相同容错属性,接收到的数据将在集群中工作节点的多个Spark executors 之间复制(默认复制因子为2)。这导致系统中有两种数据需要在发生故障时恢复:

  1. 接收和复制的数据-此数据在单个工作节点发生故障时幸存下来,因为它的副本存在于其他节点之一上
  2. 已接收但为复制而缓冲的数据-由于未复制,因此恢复此数据的唯一方法是从源再次获取它

此外,我们应该关注两种失败:

  1. 工作节点的故障-任何运行执行器的工作节点都可能发生故障,并且这些节点上的所有内存数据都将丢失。如果任何接收器在故障节点上运行,那么它们的缓冲数据将丢失。
  2. 驱动程序节点的故障-如果运行Spark Streaming应用程序的驱动程序节点发生故障,那么显然SparkContext丢失了,并且所有具有内存数据的执行程序都丢失了。

有了这些基础知识,我们下面开始学习Spark Streaming的容错语义学

二、整体语义

流系统的语义学通常是根据系统可以处理每条记录的次数来捕获的。系统可以在所有可能的操作条件下(尽管有故障等)提供三种类型的保证。

  1. 最多处理一次:每条记录要么处理一次,要么根本不处理
  2. 至少一次:每条记录将被处理一次或多次。这比最多一次更强,因为它确保没有数据丢失。但可能会有重复。
  3. 精确一次:每条记录将被精确处理一次 - -- 没有数据丢失,也没有数据被多次处理。这显然是三者中最强大的保证。

在任何流处理系统中,广义上讲,处理数据有三个步骤。

  1. 接收数据:使用接收器或其他方式从源接收数据。
  2. 转换数据:使用DStream和RDD转换转换接收到的数据
  3. 推送数据:最终转换后的数据被推送到外部系统,如文件系统、数据库、仪表板等

如果一个流式应用程序必须实现端到端的精确一次保证,那么每个步骤都必须提供精确一次保证。也就是说,每条记录必须精确接收一次,精确转换一次,并精确推送到下游系统一次。Spark Streaming采用的是RDD来处理数据,RDD中间的转化操作都是迭代器模式,可以保证所有接收到的数据将只处理一次。即使出现故障,只要接收到的输入数据是可访问的,最终转换的RDD将始终具有相同的内容。这样就剩下接收数据和推送数据的保证,这两点我们再后面结合不同的输入源提供的保证以及下游系统的不同来进行详细分析。

三、接收数据语义

不同的输入源提供不同的保证,从至少一次到恰好一次。

1、输入源是文件

如果所有输入数据都已经存在于像HDFS这样的容错文件系统中,Spark Streaming总是可以从任何故障中恢复并处理所有数据。这给出了一次语义学,这意味着无论发生什么故障,所有数据都将被处理一次。

2、输入源是接收器(Receiver)

对于基于接收器的输入源,容错语义学取决于故障场景和接收器类型。正如我们之前讨论的,有两种类型的接收器:

  1. 可靠的接收器——这些接收器只有在确保接收到的数据已经被复制后才会确认可靠的来源。如果这样的接收器发生故障,源将不会收到缓冲(未复制)数据的确认。因此,如果接收器重新启动,源将重新发送数据,并且不会因故障而丢失数据。
  2. 不可靠的接收器-这种接收器不发送确认,因此当它们由于工作人员或驱动程序故障而失败时可能会丢失数据

根据使用的接收器类型,如果工作节点发生故障,那么可靠的接收器不会丢失数据。对于不可靠的接收器,接收但未复制的数据可能会丢失。如果driver 发生故障,那么除了这些丢失之外,所有过去在内存中接收和复制的数据都将丢失。这将影响有状态转换的结果。

为了避免过去接收到的数据丢失,Spark 1.2引入了预写日志,将接收到的数据保存到容错存储中。由于启用了预写日志和可靠的接收器,数据丢失为零。就语义学而言,它提供了至少一次保证。

因此推荐采用的模式为:带有预写日志的Spark 1.2或更高版本

3、输入源是Kafka的Direct API

在Spark 1.3中,引入了一个新的Kafka Direct API,它可以确保Spark Streaming只接收一次所有Kafka数据。

四、输出数据语义

输出操作(如foreachRDD)至少有一次语义学,也就是说,在worker 节点失败的情况下,转换后的数据可能会多次写入外部实体。虽然这对于使用saveAs***Files操作保存到文件系统是可以接受的(因为文件将被相同的数据覆盖),但可能需要额外的努力来实现一次语义学。有两种方法。

1、幂等更新:多次尝试总是写入相同的数据。例如,SaveAs***Files总是将相同的数据写入生成的文件。

2、事务性更新:所有更新都是以事务性方式进行的,因此更新仅以原子方式进行一次。

  • 使用批处理时间(在foreachRDD中可用)和RDD的分区索引来创建标识符。此标识符唯一标识流应用程序中的blob数据
  • 使用标识符以事务方式(即仅一次原子方式)使用此blob更新外部系统。也就是说,如果标识符尚未提交,请原子方式提交分区数据和标识符。否则,如果已经提交,请跳过更新。
dstream.foreachRDD { (rdd, time) =>rdd.foreachPartition { partitionIterator =>val partitionId = TaskContext.get.partitionId()val uniqueId = generateUniqueId(time.milliseconds, partitionId)// 使用此uniqueId在partitionIterator中事务性提交数据}
}

大多数高校硕博生毕业要求需要参加学术会议,发表EI或者SCI检索的学术论文会议论文:
可访问艾思科蓝官网,浏览即将召开的学术会议列表。会议如下:

第四届大数据、信息与计算机网络国际学术会议(BDICN 2025)

  • 广州
  • https://ais.cn/u/fi2yym

第四届电子信息工程、大数据与计算机技术国际学术会议(EIBDCT 2025)

  • 青岛
  • https://ais.cn/u/nuQr6f

第六届大数据与信息化教育国际学术会议(ICBDIE 2025)

  • 苏州
  • https://ais.cn/u/eYnmQr

第三届通信网络与机器学习国际学术会议(CNML 2025)

  • 南京
  • https://ais.cn/u/vUNva2

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/63462.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AmpliconSuite-pipeline

AmpliconSuite-pipeline: 多线程支持的端到端工具,用于从配对端全基因组测序数据分析局部拷贝数扩增(如ecDNA或BFB) AmpliconSuite-pipeline 是一个多线程支持的端到端工具,用于 AmpliconArchitect 和 AmpliconClassifier,以支持从配对端全基因组测序数据分析局部拷贝数扩…

QNX通过pfctl工具查看socket通信状态

通过pfctl -si && pfctl -ss可以查看当前主机IP和外域IP之间的所有socket通信状态,显示的格式是 传输层协议 | 主机IP | 外域IP | 主机端状态:外域状态 ------------------------------------------------------------------------…

Windows安全中心(病毒和威胁防护)的注册

文章目录 Windows安全中心(病毒和威胁防护)的注册1. 简介2. WSC注册初探3. WSC注册原理分析4. 关于AMPPL5. 参考 Windows安全中心(病毒和威胁防护)的注册 本文我们来分析一下Windows安全中心(Windows Security Center…

JSX和vue模版哪个更好?

JSX和Vue模板各有优缺点,选择哪种取决于具体需求和个人偏好。‌ JSX的优点 ‌灵活性‌:JSX允许在JavaScript代码中直接插入任意表达式,这使得它在处理复杂逻辑时更加灵活。例如,条件渲染和循环渲染可以通过JavaScript的标准语法…

[代码随想录21回溯]组合问题,电话号码的字母组合问题

前言 回溯的提出是解决循环问题,回溯的提出就是为了解决排列和组合问题,以及多层遍历问题,因为如果遍历的层数越多我们的效率就会越低,回溯加上剪枝能很好解决这个问题。 题目链接 77. 组合 - 力扣(LeetCode&#xff…

智能工厂的设计软件 三种处理单元(NPU/GPU/CPU)及其在深度学习框架中的作用 之2

本文要点 分类学 利用NPU、GPU和CPU的分工协作,实现 一个信息系统架构中的灵活的模块化框架,该框架使用一个类似元素周期表的分类法,将 该元素周期表 左边的行矢(时间关系,由应用规格 约束) 、顶上的列簇…

几款主流的超声波流量计应用场景梳理

清水应用 这款 声乐 在含有最少固体或曝气(≤ 1-2%)的清洁水的情况下表现出色。该仪表融合了卓越的性能和经济性,使其成为需要外夹式超声波流量计的应用的理想选择。它在市政水处理设施中特别有效,其精度和成本效益确保了最佳运行…

Flag 验证器

Flag 验证器使用教程 Flag 验证器 是一种常用工具,用来验证命令行参数或配置文件中的标志(flag)是否符合预期规则。这些工具可以帮助开发者确保传入的参数满足一定的条件,避免因参数错误而导致程序运行失败。以下是对各个验证器功…

二进制分析的新兴趋势:塑造安全的移动应用

在当今快速发展的数字世界中,保障移动应用的安全性变得尤为重要。随着移动技术的广泛应用,安全性需求也日益增强。二进制分析作为确保移动应用安全和合规性的重要手段,通过对已编译的应用进行深入分析,能够发现源代码中难以察觉的…

Python:动态粒子爱心

预览 代码结构概述 这段代码使用了 pygame 库来创建一个动态的图形窗口,绘制一个心形图案,并在其中显示闪烁的文本。代码主要分为以下几个部分: 初始化和设置心形曲线的计算粒子类的定义生成粒子文本设置主循环 1. 初始化和设置 import p…

React源码02 - 基础知识 React API 一览

1. JSX到JavaScript的转换 <div id"div" key"key"><span>1</span><span>2</span> </div>React.createElement("div", // 大写开头会当做原生dom标签的字符串&#xff0c;而组件使用大写开头时&#xff0c;这…

使用DynadotAPI购买域名清仓列表中的过期域名

前言 Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮箱&…

js分页功能

先声明些全局变量方便我们在下面的代码中使用 //一页有多少条数据 let num 10; //页码 let k 0; //总页数 let divide; // 用来判断显示哪几页的页数 let page_num 0; // 声明一个用于接数据的变量 let datas; // 声明一个用于接数据的变量 let data; //一页有多少条数据 l…

CMake Do‘s and Don‘ts (行为准则)

CMake Dos and Donts {行为准则} 1. General2. Modules3. ProjectsReferences Effective Modern CMake https://gist.github.com/mbinna/c61dbb39bca0e4fb7d1f73b0d66a4fd1 Do’s and Don’ts https://cliutils.gitlab.io/modern-cmake/chapters/intro/dodonot.html dos and …

验证的分类及相关工具

目录 1.验证方法的分类1.1动态验证1.2.静态验证 2.动态验证及相关工具2.1.电路级仿真工具2.2.逻辑仿真工具 3.静态验证及相关工具3.1 形式验证工具3.2 静态时序分析工具 SOC设计中验证包含以下几个方面&#xff1a; 验证原始描述的正确性验证设计的逻辑功能是否符合设计规范的要…

【HarmonyOs学习日志(14)】计算机网络之域名系统DNS

域名系统DNS 域名系统DNS——从域名解析出IP地址 文章目录 域名系统DNS概述域名到IP地址的解析 互联网的域名结构命名标准 域名服务器域名的解析过程 概述 域名系统DNS&#xff08;Domain Name System&#xff09;是互联网使用的命名系统&#xff0c;用来把便于人们使用的机器…

【Python】pandas库---数据分析

大学毕业那年&#xff0c;你成了社会底层群众里&#xff0c;受教育程度最高的一批人。 前言 这是我自己学习Python的第四篇博客总结。后期我会继续把Python学习笔记开源至博客上。 上一期笔记有关Python的NumPy数据分析&#xff0c;没看过的同学可以去看看&#xff1a;【Pyt…

【人工智能学习之HDGCN18关键点修改】

【人工智能学习之HDGCN18关键点修改】 训练部分修改部分 训练部分 请参考文章&#xff1a;【人工智能学习之HDGCN训练自己的数据集】 修改部分 参考源码中25关键点的区域划分&#xff0c;我们将18关键点划分为&#xff1a; 头部&#xff1a; 鼻子左眼和左耳右眼和右耳 上肢…

ARCGIS国土超级工具集1.2更新说明

ARCGIS国土超级工具集V1.2版本&#xff0c;功能已增加至47 个。在V1.1的基础上修复了若干使用时发现的BUG&#xff0c;新增了"矢量分割工具"菜单&#xff0c;同时增加及更新了了若干功能&#xff0c;新工具使用说明如下&#xff1a; 一、勘测定界工具栏更新界址点成果…

华为OD --- 流浪地球

华为OD --- 流浪地球 题目独立实现基本思路代码实现 其他答案实现思路代码实现 题目 独立实现 基本思路 1、首先把题目给出的启动机器初始化成数组, 2、用for循环模拟每隔1s更新这个初始化数组的前后两个机器. (源码中的updateTimeCount函数) 3、for循环每次循环后会检查当前…