Spark Streaming事务处理彻底掌握

7 篇文章 0 订阅
6 篇文章 0 订阅

  1. Exactly once

  2. 输出不重复

    A.课程的目的:根据自己的业务需要,定制开发自己需要的Spark 版本,包括Spark Bug的修复,性能的改进,功能的扩展,总之适合自己公司的维护,便于简单易理解,易维护。

    B.事务处理,比如银行转账,事务的输入和输出都应该保证事务一致

    一方面处理能够处理,且只被处理一次,输出能够输出且只能输出一次

    一.Spark Streaming的执行架构图:

    数据丢失:

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

         当然如果还没有积累到一定程度时,Reciver崩溃了,那么数据还是会丢失一点,因为WAL这种写数据也是进行批处理写,(实时写数据会非常的耗性能)所以数据有可能丢失几条

    2.数据重复读取的情况

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

     

    性能损失:

    1.通过WAL方式会极大的损伤SparkStreaming中Reciver接受数据的性能

    2.如果通过Kafka作为数据来源的话,kafka中有数据,然后Receiver接受的时候又会有数据副本,这个时候其实是存储资源的浪费(将数据信息写在内存数据库中,那么读的时候看数据处理过没有,如果处理过就跳过)

     

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

    1.为什么会有这个问题,因为SparkStreaming在计算的时候基于Spark Core,Spark Core天生会做以下事情导致

    Spark Streaming的结果(部分)重复输出

       task 重试

       Job重试

       Stage重试

       慢任务推测

    2.具体解决方案

    设置Spark Task Max Failure次数为1

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

        如果按Kafka的话,job失败后可以设置kafka的auto.offset.reset为largest的方式

    SparkStreaming就两点:获取数据,产生作业,但是没有解决执行的问题,执行的问题必须透过SparkContext

     

    Driver级别的恢复时通过checkpoint来恢复,在内部都是通过SparkContext,重新构造SparkContext,StreamingContext,恢复的时候继续上一次的Job执行,当然也要恢复上一次的job

    为什么要CheckPoint到Hdfs上,因为Hdfs有天生的副本机制

     

    xactly Once的事务处理:

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

    2.Spark Streaming1.3是的为了避免WAL的性能损失和现实Exactly once而提供了Kafka Direct API,把kafka作为文件存储系统,此时兼具有流的优势和文件系统的优势,至此

    SparkStreamingKafka就构建了完美的流处理世界,所有的Executor通过Kafka ApI直接消费数据,直接管理offset,所以也不会重复消费数据

     

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

     备注:

    1、DT大数据梦工厂微信公众号DT_Spark 
    2、IMF晚8点大数据实战YY直播频道号:68917580
    3、新浪微博: http://www.weibo.com/ilovepains

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spark Streaming提供了基于事务的精确一次语义(Exactly-once Semantics)来保证数据处理的准确性和完整性。在Spark Streaming中,一次事务处理是指一个批处理任务的执行过程中,数据的读取、处理和输出都要么都成功,要么都失败,不会出现数据丢失或者重复处理的情况。 Spark Streaming事务处理依赖于两个关键因素:输出操作的原子性和批处理任务的可重放性。 1. 输出操作的原子性 在Spark Streaming中,输出操作都是由Output Operations完成的,例如将数据写入到HDFS或者数据库。输出操作的原子性是指要么所有的输出操作都成功完成,要么所有的输出操作都失败,不会出现只输出一部分数据的情况。Spark Streaming通过将输出操作放在一个事务中实现了输出操作的原子性。 2. 批处理任务的可重放性 在Spark Streaming中,每一个批处理任务都会消费一个DStream中的一段数据,并输出一段结果。为了保证事务的完整性,Spark Streaming需要保证批处理任务是可重放的,即同一个批次的输入数据,会产生相同的输出结果。这样,在批处理任务执行失败时,Spark Streaming就可以重新执行同一个批次的任务,以保证任务的完整性。 Spark Streaming事务处理是通过将输出操作放在一个事务中,并且保证批处理任务的可重放性来实现的。这种方式可以保证数据处理的准确性和完整性,是实时数据处理中很重要的一部分。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值