第4课 :Spark Streaming的Exactly-One的事务处理和不重复输出彻底掌握

/* 王家林老师授课http://weibo.com/ilovepains  每天晚上20:00YY频道现场授课频道68917580*/

Exactly Once的事务处理:

1,数据零丢失:必须有可靠的数据来源和可靠的Receiver,且整个应用程序的metadata必须进行checkpoint,且通过WAL来保证数据安全;

2,Spark Streaming 1.3的时候为了避免WAL的性能损失和实现Exactly Once而提供了Kafka Direct API,把Kafka作为文件存储系统!!!此时兼具有流的优势和文件系统的优势,至此,Spark Streaming+Kafka就构建了完美的流处理世界!!!所有的Executors通过Kafka API直接消费数据,直接管理Offset,所以也不会重复消费数据;事务实现啦!!!

数据丢失及其具体的解决方式:

在Receiver收到数据且通过Driver的调度Executor开始计算数据的时候如果Driver突然崩溃,则此时Executor会被Kill掉,那么Executor中的数据就会丢失,此时就必须通过例如WAL的方式让所有的数据都通过例如HDFS的方式首先进行安全性容错处理,此时如果Executor中的数据丢失的话就可以通过WAL恢复回来;

通过WAL方式会极大的损伤Spark Streaming中Receivers接受数据的性能;

数据重复读取的情况:

在Receiver收到数据且保存到了HDFS等持久化引擎但是没有来得及进行updateOffsets,此时Receiver崩溃后重新启动就会通过管理Kafka的ZooKeeper中元数据再次重复读取数据,但是此时SparkStreaming认为是成功的,但是Kafka认为是失败的(因为没有更新offset到ZooKeeper中),此时就会导致数据重新消费的情况。

性能损失:

1,通过WAL方式会极大的损伤Spark Streaming中Receivers接受数据的性能;

2,如果通过Kafka的作为数据来源的话,Kafka中有数据,然后Receiver接受的时候又会有数据副本,这个时候其实是存储资源的浪费;

关于Spark Streaming数据输出多次重写及其解决方案:

1,为什么会有这个问题,因为Spark Streaming在计算的时候基于Spark Core,Spark Core天生会做以下事情导致Spark Streaming的结果(部分)重复输出:

Task重试;

慢任务推测

Stage重复;

Job重试;

2,具体解决方案:

设置spark.task.maxFailures次数为1;

设置spark.speculation为关闭状态(因为慢任务推测其实非常消耗性能,所以关闭后可以显著提高Spark Streaming处理性能)

Spark Streaming on Kafka的话,Job失败后可以设置auto.offset.reset为“largest”的方式;

最后再次强调可以通过transform和foreachRDD基于业务逻辑代码进行逻辑控制来实现数据不重复消费和输出不重复!这两个方式类似于Spark Streaming的后门,可以做任意想象的控制操作!

时间: 2024-11-10 16:06:47

第4课 :Spark Streaming的Exactly-One的事务处理和不重复输出彻底掌握的相关文章

第4课:Spark Streaming的Exactly-Once的事务处理和不重复输出彻底掌握

前置知识: 1.事务的特征:1).处理且仅被处理一次:2).输出且只被输出一次 2.SparkStreaming进行事务处理有没有可能处理完全失败? 这个可能性不大,因为Spark是批处理的方式来进行流处理,在SparkStreaming应用程序启动的时候,已经为应用程序分配了相关的资源,而且在调度的过程中可以动态的分配资源,所以除非整个集群所有的硬件都奔溃了,否则一般情况下都会被处理的. 3.SparkStreaming写程序的时候是基于Driver和Executor两部分 SparkStre

第4课:Spark Streaming的Exactly-One的事务处理和不重复输出彻底掌握

本篇博文组织形式如下: 一:Exactly-One的事务处理 二:输出不重复 一:Exactly-One的事务处理 一:Exactly-One的事务处理 1. 什么是事务处理: a) 能够处理且只被处理一次.例如,银行转账,A转给B,A有且仅转一次. b) 能够输出,且只能够输出一次.而B接收转账,且直接收一次. 2. 事务处理会不会失败呢? 可能性不大,Spark是批处理的方式来进行流处理Batch Interval的方式,Spark应用程序启动的时候为我们分配了资源,而且在计算的时候也会动态

Spark定制班第4课:Spark Streaming的Exactly-One的事务处理和不重复输出彻底掌握

本篇文章主要从二个方面展开: 本期内容 1 Exactly Once 2 输出不重复 1 Exactly Once 事务: 银行转帐为例,A用户转笔账给B用户,如果B用户没收到账,或者收到多笔账,都是破坏事务的一致性.事务处理就是,能够处理且只会处理一次,即A只转一次,B只收一次. 从事务视角解密SparkStreaming架构: SparkStreaming应用程序启动,会分配资源,除非整个集群硬件资源崩溃,一般情况下都不会有问题.SparkStreaming程序分成而部分,一部分是Drive

第82课 Spark Streaming第一课 案例动手实战并在电光石火间理解其工作原理

本课内容提要: (1)什么是流处理以及Spark Streaming主要介绍 (2)Spark Streaming初体验 一.什么是流处理以及Spark Streaming主要介绍 流(Streaming),在大数据时代为数据流处理,就像水流一样,是数据流:既然是数据流处理,就会想到数据的流入.数据的加工.数据的流出. 日常工作.生活中数据来源很多不同的地方.例如:工业时代的汽车制造.监控设备.工业设备会产生很多源数据:信息时代的电商网站.日志服务器.社交网络.金融交易系统.黑客攻击.垃圾邮件.

Spark Streaming:大规模流式数据处理的新贵(转)

原文链接:Spark Streaming:大规模流式数据处理的新贵 摘要:Spark Streaming是大规模流式数据处理的新贵,将流式计算分解成一系列短小的批处理作业.本文阐释了Spark Streaming的架构及编程模型,并结合实践对其核心技术进行了深入的剖析,给出了具体的应用场景及优化方案. 提到Spark Streaming,我们不得不说一下BDAS(Berkeley Data Analytics Stack),这个伯克利大学提出的关于数据分析的软件栈.从它的视角来看,目前的大数据处

(版本定制)第6课:Spark Streaming源码解读之Job动态生成和深度思考

本期内容: 1.Spark Streaming Job生成深度思考 2.Spark Streaming Job生成源码解析 本节课主要是针对Job如何产生进行阐述 在Spark Streaming里,总体负责动态作业调度的具体类是JobScheduler: /** * This class schedules jobs to be run on Spark. It uses the JobGenerator to generate * the jobs and runs them using a

第10课:Spark Streaming源码解读之流数据不断接收全生命周期彻底研究和思考

上一课我们讲解了Receiver启动的流程.Receiver是通过ReceiverSupervisor的start方法启动的: /** Start the supervisor */ def start() {   onStart()   startReceiver() } 首先会调用ReceiverSupervisor的onStart()方法, override protected def onStart() {   registeredBlockGenerators.foreach { _.

第89课:Spark Streaming on Kafka解析和安装实战

本课分2部分讲解: 第一部分,讲解Kafka的概念.架构和用例场景: 第二部分,讲解Kafka的安装和实战. 由于时间关系,今天的课程只讲到如何用官网的例子验证Kafka的安装是否成功.后续课程会接着讲解如何集成Spark Streaming和Kafka. 一.Kafka的概念.架构和用例场景 http://kafka.apache.org/documentation.html#introdution 1.Kafka的概念 Apache Kafka是分布式发布-订阅消息系统.它最初由Linked

第88课:Spark Streaming从Flume Pull数据案例实战及内幕源码解密

本节课分成二部分讲解: 一.Spark Streaming on Pulling from Flume实战 二.Spark Streaming on Pulling from Flume源码解析 先简单介绍下Flume的两种模式:推模式(Flume push to Spark Streaming)和 拉模式(Spark Streaming pull from Flume ) 采用推模式:推模式的理解就是Flume作为缓存,存有数据.监听对应端口,如果服务可以连接,就将数据push过去.(简单,耦