SparkStreaming实时任务处理的三种语义

简介: SparkStreaming实时任务处理的三种语义

这是我的第74篇原创

kafka+SparkStreaming是目前lambda架构里比较流行的实施任务处理。但是里面的坑还是不少,没经历过的朋友得踩不少坑


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+事务更新和数据持久化。


相关文章
|
1月前
|
存储 人工智能 监控
淘宝闪购基于Flink&Paimon的Lakehouse生产实践:从实时数仓到湖仓一体化的演进之路
本文整理自淘宝闪购(饿了么)大数据架构师王沛斌在 Flink Forward Asia 2025 上海站的分享,深度解析其基于 Apache Flink 与 Paimon 的 Lakehouse 架构演进与落地实践,涵盖实时数仓发展、技术选型、平台建设及未来展望。
243 0
淘宝闪购基于Flink&Paimon的Lakehouse生产实践:从实时数仓到湖仓一体化的演进之路
|
6月前
|
存储 监控 数据挖掘
京东物流基于Flink & StarRocks的湖仓建设实践
本文整理自京东物流高级数据开发工程师梁宝彬在Flink Forward Asia 2024的分享,聚焦实时湖仓的探索与建设、应用实践、问题思考及未来展望。内容涵盖京东物流通过Flink和Paimon等技术构建实时湖仓体系的过程,解决复杂业务场景下的数据分析挑战,如多维OLAP分析、大屏监控等。同时,文章详细介绍了基于StarRocks的湖仓一体方案,优化存储成本并提升查询效率,以及存算分离的应用实践。最后,对未来数据服务的发展方向进行了展望,计划推广长周期数据存储服务和原生数据湖建设,进一步提升数据分析能力。
563 1
京东物流基于Flink & StarRocks的湖仓建设实践
|
存储 分布式计算 算法
Flink四大基石——4.Checkpoint容错机制
Flink四大基石——4.Checkpoint容错机制
306 1
|
9月前
|
缓存 监控 数据处理
Flink 四大基石之窗口(Window)使用详解
在流处理场景中,窗口(Window)用于将无限数据流切分成有限大小的“块”,以便进行计算。Flink 提供了多种窗口类型,如时间窗口(滚动、滑动、会话)和计数窗口,通过窗口大小、滑动步长和偏移量等属性控制数据切分。窗口函数包括增量聚合函数、全窗口函数和ProcessWindowFunction,支持灵活的数据处理。应用案例展示了如何使用窗口进行实时流量统计和电商销售分析。
1811 28
|
分布式计算 监控 大数据
如何处理 Spark 中的倾斜数据?
【8月更文挑战第13天】
621 4
|
11月前
|
存储 大数据 定位技术
大数据 数据索引技术
【10月更文挑战第26天】
307 3
|
机器学习/深度学习 人工智能 API
LangChain之模型调用
LangChain的模型是框架中的核心,基于语言模型构建,用于开发LangChain应用。通过API调用大模型来解决问题是LangChain应用开发的关键过程。
837 1
|
SQL 存储 分布式计算
流批一体技术简介
本文由阿里云 Flink 团队苏轩楠老师撰写,旨在向 Flink 用户整体介绍 Flink 流批一体的技术和挑战。
51058 3
流批一体技术简介
|
人工智能 JavaScript 前端开发
【AI大模型应用开发】【LangChain系列】0. LangChain框架介绍,实现LangChain的Hello World
【AI大模型应用开发】【LangChain系列】0. LangChain框架介绍,实现LangChain的Hello World
352 0
|
API
langchain 入门指南(二)- 如何跟大模型对话
langchain 入门指南(二)- 如何跟大模型对话
963 0