主页 > 新闻资讯 > 大数据学习:SparkStreaming实时计算的三种语义

大数据学习:SparkStreaming实时计算的三种语义

作者:张老师 浏览次数: 2020-12-14 16:48
大数据处理的需求,从当前来说,实时处理任务是开始占据越来越多的份额的,大数据计算处理越来越要求高效性与实时性。而市场主流的选择之一,就是Spark Streaming,今天的大数据学习分享,我们就来讲讲SparkStreaming实时计算的三种语义。

 
大数据学习:SparkStreaming实时计算的三种语义

kafka+SparkStreaming是目前lambda架构里比较流行的实时任务处理方案,具体来说SparkStreaming实时计算的三种语义如下——

At most once

At most once:一条记录要么被处理一次,要么没被处理。简单来说,就是会丢数据。

这种语义其实就是使用Receiver直接接收Kafka的数据。Receiver接收数据后,存储在Spark的执行器中,Spark Streaming启动的作业会去处理数据。

一般情况下,Receiver是单点的,单点肯定就有丢数据的风险。Spark Streaming都是在内存里操作,一旦Receiver单点故障,数据就丢失了。

Spark 1.2的时候,有一个补充方案,就是启动Write Ahead Logs,将接收到的数据固化下来。一旦Receiver单点故障了,重新启动的时候再去恢复一下就好了。不过这个方式实际上是把数据复制了两次(kafka自己复制,Spark又复制一次)性能不太好。

At Least once

At least once:一条记录可能被处理一次或者多次。简单来说,就是会重复消费数据。

为了避免丢数据的弊端,Spark1.3中引入了Direct Approach机制从kafka获取数据,替代原有的Receiver接收器。

SparkStreaming的KafkaCluster会先获取kafka的partition信息,然后创建DirectKafkaInputDStream,对应每一个Topic,然后获取每个Tiopc的每个Partition的Offset。这样等于是在SparkStreaming中对Kafka的每个Topic的每个Partition都建立了一个专属数据管道,直接接收数据。另外,所有的Offset信息都会报给InputInfo Tracker。

这样可以实现简化并行、避免重复复制数据、降低资源等等。但是这样会出现一个问题,特殊情况下可能会重复消费。比如在上报offset之前出故障了,任务重启之后,重新获取的offset是以前的,然后把当前处理进度的数据又重新读取了一次。

Exactly once

Exactly once:一条记录只被处理一次。简单来说,数据这么算就准了。

重复消费的原因其实就是在于处理数据和递交Offset是分两步走的,也就是说不在同一个事务里。想不重复消费,那就要做到幂等或者事务更新就行。

不过光搞定处理数据和递交offset事务更新还是不够,万一数据不能重复消费也是白搭。所以要做到Exactly once,得有三个前提:

1、数据源端支持数据重复读取;

2、流计算引擎支持Exactly once;

3、第三才是Sink支持幂等或者事务更新。

Spark Streaming搞定Exactly once的方法其实还是利用kafka支持数据重复读取+Spark Streaming的DStream支持Exactly one+事务更新和数据持久化。

这样,一旦发生故障,要么数据没处理完,offset也不会同步递交;部分数据进行持久化;这样任务恢复后,获取的offset和数据状态是同步的,就不会重复消费数据了。

关于大数据学习,SparkStreaming实时计算的三种语义,以上就为大家做了详细的介绍了。Spark Streaming作为当前市场上的一种重要技术解决方案,对于其中的具体细节,应该牢固地把握。成都加米谷大数据,专业大数据培训机构,大数据开发、数据分析与挖掘,零基础班本月正在招生中,课程大纲及试学视频,可联系客服获取!
热点排行
推荐文章
立即申请>>