Spark Streaming事务处理彻底掌握

感谢DT大数据梦工厂支持提供以下内容,DT大数据梦工厂专注于Spark发行版定制。

内容概括:

1Exactly once

2 输出不重复

1 正如银行转账业务一样,如果你给一个朋友转账一次,银行的系统必须保证此次的转账数据有且只能处理一次,不能出现另外的情况。事务的意思就是保证数据有且只能处理一次。

而Spark Streaming流处理在事务处理方面也是做得非常好的,并且这一部分内容也是非常重要的。

所谓一图胜千言,我们就来画一张图吧。

整个数据在Driver和Executor上的分布如下


总体上讲是:Driver存储数据元数据信息,Executor上存储具体的数据。

Executor上存储具体的数据的具体过程如下图所示

Executor 通过BlockManager写入内存+磁盘通过WAL来保证数据的安全性 (Receiver)需要注意的是:WAL仍然不能100%保证数据的安全性。当log没有积累到阈值的时候如果崩溃。

这是接收数据的角度来理解,当然Spark Streaming能工作起来,核心还是SparkContext。

Spark Streaming简单的说就俩点:一是接收数据 而是作业执行。

从数据恢复的角度来看。Spark StreamingContext可以通过checkpoint的文件系统中将元数据读进来,从而恢复数据。再通过SparkContext将作业提交给集群。

接下来在以上的基础上我们再来谈谈数据一致性的事务问题。

尽管如此,数据还是有可能会数据丢失,或者数据重复处理。那么我们应该怎么办呢?

第一点:在Receiver收到数据且通过Driver调度,Executor开始计算数据时,Driver突然崩溃。将会导致Executor被kill掉,数据就会丢失,此时务必通过WAL的方式写入HDFS进行备份来保证数据安全性。(丢失的数据可以通过WAL恢复过来)

对于数据有且只被处理一次。当数据被处理后,updataOffsets执行之前如果程序突然崩溃了,就还没来得及更新offsets就很有可能导致数据重复处理(此时可以通过程序判断元数据有没有处理过,如果没有就会导致数据重复处理)

当Receiver崩溃后重新启动就会通过管理Kafka的zookeeper中的元数据再次重复读取数据,但是此时的SparkStreaming认为是成功,但是kafka认为是失败的(因为没有成功执行updateOffsets)就会重复处理消费数据。

整个过程美中不足的是:性能会极大的损失

1 通过WAL的方式会极大的损失Spark Streaming中REeceiver接收数据的性能,因为要花时间先写Log,然后再写入数据。

2 如果通过kafka作为数据来源的话,kafka中有数据备份,然后通过Receiver接收数据的时候又会有副本(为数据安全性而存在的持久化备份),这个时候其实是对资源的极大的浪费。

十分幸运的是:spark 1.3的时候为解决这个性能的问题,支持了Kafka Direct API ,把kafka作为文件存储系统!!!!

减少了数据重复多余备份,又避免了WAL损耗Receiver的问题。

kafka即作为文件存储系统,又作为一个文件流,此时兼具有文件流的优势和文件系统的优势,至此之后,SparkStreaming加上Kafka就成为了相对非常完美的流处理最佳组合。

所有的Executor通过Kafka Direcit API直接消费读取数据。同时也会自己存储管理数据,自己管理自己消费。不会重复消费数据。此时就完美的解决了数据一定会处理,并且只会被处理一次。

二 关于数据输出多次重写及解决方案

关于引起此问题的原因有以下几点

1  task重试

2  job重试

3 stage重试

4 慢任务推测执行

具体的解决办法是设置总共执行次数为1

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

2 设置 spark.speculation为关闭状态,不推测执行(关闭后可以提高任务执行的效率)(少了一个步骤嘛!!!!)

3 spark streaming on kafka的话,job失败后可以设置auto.offset.reset为largest的方式。

最后再次强调:可以通过transform和foreachRDD对RDD基于业务逻辑代码进行逻辑控制来实现数据不重复消费和输出不重复。后续会具体的代码实现。敬请有兴趣的朋友们关注动态。

详细信息请查看

联系邮箱18610086859@126.com

电话:18610086859

QQ:1740415547

微信号:18610086859

整个数据设置在Driver和Executor上的分

spark发行版笔记4Spark Streaming事务处理彻底掌握的更多相关文章

  1. spark发行版笔记10

    感谢DT大数据梦工厂支持提供技术支持,DT大数据梦工厂专注于Spark发行版定制. 本期概览: 数据接收全生命周期的思考 大数据处理框架中,最重要的就是性能,性能是排在前面的.其次再考虑其他的.因为数 ...

  2. spark发行版笔记9

    感谢DT大数据梦工厂支持提供技术支持,DT大数据梦工厂专注于Spark发行版定制. 本期概览: 1 Receiver生命全周期 首先,我们找到数据来源的入口,入口如下 Receiver的设计是极其巧妙 ...

  3. spark发行版笔记11

    本期概览: ReceiverTracker架构设计 消息循环系统 ReceiverTracker具体的实现 Spark Streaming作为Spark Core基础 架构之上的一个应用程序,其中的R ...

  4. spark发行版笔记13

    本期概览: ReceiverTracker架构设计 消息循环系统 ReceiverTracker具体的实现 Spark Streaming作为Spark Core基础 架构之上的一个应用程序,其中的R ...

  5. Spark Streaming事务处理彻底掌握

    本篇文章主要从二个方面展开: 一.Exactly Once 二.输出不重复 事务: 银行转帐为例,A用户转账给B用户,B用户可能收到多笔钱,如何保证事务的一致性,也就是说事务输出,能够输出且只会输出一 ...

  6. 【原】Learning Spark (Python版) 学习笔记(三)----工作原理、调优与Spark SQL

    周末的任务是更新Learning Spark系列第三篇,以为自己写不完了,但为了改正拖延症,还是得完成给自己定的任务啊 = =.这三章主要讲Spark的运行过程(本地+集群),性能调优以及Spark ...

  7. Dream_Spark-----Spark 定制版:004~Spark Streaming事务处理彻底掌握

    Spark 定制版:004~Spark Streaming事务处理彻底掌握 本讲内容: a. Exactly Once b. 输出不重复 注:本讲内容基于Spark 1.6.1版本(在2016年5月来 ...

  8. 2016年如何选择 Linux 发行版

    不管是在企业级应用还是在消费者领域,2015 对于 Linux 来说都是极其重要的一年.作为一个从 2005 年就开始使用 Linux 的老用户,我有幸见证了 Linux 过去这 10 年里的重大发展 ...

  9. 一款国内好用的Linux发行版?Deepin(深度)Linux

    一款国内好用的Linux发行版?Deepin(深度)Linux 目前来说,要将Linux作为桌面解决方案,对于大多数PC用户来说,当然是不现实的,毕竟Linux的主力用户群体依然是少数极客用户.说白了 ...

随机推荐

  1. mybatis.xml文件中#与$符号的区别以及数学符号的处理

    1.#{}表示一个占位符号,通过#{}可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换,#{}可以有效防止sql注入. #{}可以接收简单类型值或po ...

  2. 首师大附中科创教育平台 我的刷题记录 0304 50095106扔核弹(XDC,你懂的)

    今天给大家献上"C"级题:50095106扔核弹(XDC,你懂的)!! 试题编号:0304   50095106扔核弹(XDC,你懂的) 难度级别:C: 运行时间限制:1000ms ...

  3. 双十一 VS 火车票(12306)

    火车票开售了,又是一年,code了一年,咱们也该回顾回顾了. 还记得12306上线之初各种技术大牛给人家出方案,吐槽人家外包费用?我们来回顾回顾. 就园子里都过千篇文章来侃这事儿,请问有多少主题的文章 ...

  4. JQuery获取浏览器窗口的可视区域高度和宽度,滚动条高度

    alert($(window).height()); //浏览器时下窗口可视区域高度 alert($(document).height()); //浏览器时下窗口文档的高度 alert($(docum ...

  5. 聊聊 virtualenv 和 virtualenvwrapper 实践

    各位 Python 的小伙伴肯定多多少少接触过 virtualenv.本文将介绍 virtualenv 以及如何更科学更优雅地使用 virtualenv. virtualenv 首先来聊一下 virt ...

  6. 关于php的开源

    这里的开源是指编写php的C语言的源代码是开放的,你可以下载下来c源代码去修改然后重新编译连接得到自己的程序. 比如php不支持多线程一直是广为被人所诟病的,你也可以让它变相的支持多线程,比如face ...

  7. ASP.NET中的文件操作(文件信息,新建,移动,复制,重命名,上传,遍历)(亲测详细)

    做了几天的文件操作,现在来总结一下,错误之处,还望指点!以文件为例,如果对文件夹操作,基本上将File换为Directory即可(例:FileInfo file = new FileInfo(Path ...

  8. Maven 配置 Selenium + testNG + reportNG 运行环境

    .markdown-preview:not([data-use-github-style]) { padding: 2em; font-size: 1.2em; color: rgb(56, 58, ...

  9. LINQ之路 8: 解释查询(Interpreted Queries)

    LINQ提供了两个平行的架构:针对本地对象集合的本地查询(local queries),以及针对远程数据源的解释查询(Interpreted queries). 在讨论LINQ to SQL等具体技术 ...

  10. img的绝对路径转为相对路径

    $('#add_img').on('change', function(){ var objUrl = getObjectURL(this.files[0]) ; if (objUrl) { $(th ...