流计算中kafka的OffsetReset策略
朋友的公司做的是西南某边境省份网红新能源车的数据处理,由于新能源车的火爆,从年初从现在,数据量已经翻番。但与此同时,服务器却没有多少增加。无奈之下,只能暂时将kafka的数据存储时间由之前的1天改为6小时,5小时。其实有点危险,如果在凌晨发生什么异常生产事故导致实时任务退出,如果运维没有及时通知,导致第二天上班时已经超过5小时,那么这部份数据可能就丢了。但这也是无奈之举。
本来运行一段时间倒也好好的。今天早上,突然在微信上问我一个问题。
一时间有点懵,我很确信这个问题我肯定遇到过,且解决过。但我一时之间还真没马上想起来解决方案。
我立马翻出以前写的 Structured Streaming代码,马上意识到,这不就是auto.offset.reset的问题吗?在异常信息里已经提示得很明确了。
为什么我会第一时间没反应过来呢?因为不管是spark streaming,spark Structured Streaming,flink实时任务,只要涉及到kafka作为数据源,配置auto.offset.reset已经是一个标配。无脑上这个配置。反而一时间想不起来了。
朋友公司的代码可以追溯到在大数据领域比较遥远的2016年,那是spark1.0的时代,采用spark streaming,而现在spark官方早都已经不维护spark streaming模块了。当时的基础代码一直被复制沿用,改的也只是业务代码。所以auto.offset.reset这个配置就一直被忽略了。正常情况下,也不会抛出问题,但就怕特殊情况。
这里做一个记录。
简单说auto.offset.reset配置在没有获取到group offset的时候(比如第一次读取,或者数据被删除,就像朋友发的情况,因为kafka数据过期被删除或者异常手动被删等等),有一个替代策略。
根据不同的大数据引擎它一般有3个配置值 。
LATEST, 从最新的开始读
EARLIEST,从最晚的开始读
NONE 默认
也有group offset直接设置具体值的。
根据kafka的
官方文档的表述。
What to do when there is no initial offset in Kafka or if the current offset does not exist any more on the server (e.g. because that data has been deleted):
- earliest: automatically reset the offset to the earliest offset
- latest: automatically reset the offset to the latest offset
- none: throw exception to the consumer if no previous offset is found for the consumer's group
- anything else: throw exception to the consumer.
| Type: | string |
| ------------- | ------------------------ |
| Default: | latest |
| Valid Values: | [latest, earliest, none] |
| Importance: | medium
一点疑惑。
在spark官方jira看到一些相当的异常描述,比如这哥们,说它设置了相关的配置,但是还是出现了此种异常。
朋友也有此方面的疑惑,他认为或许auto.offset.reset配置只针对初始化,但在kafka分区或者分区数据被删除的情况下,此配置并不生效。
我记得在去年做过此方面的测试。一个测试kafka topic,数据失效时间设置为2天,先消费一波,等过3天,再去生产数据并消费,并没有出现异常。
今天正好再次做一次试验,手头刚好有flink代码环境。就以flink 1.14 + kafka 2.x为例。
示例代码
"CREATE TABLE test (\n"
+ " `key` STRING,\n"
+ " `time` TIMESTAMP(3),\n"
+ " `price` float,\n"
+ " WATERMARK FOR `time` AS `time` - INTERVAL '10' SECOND"
+ ") WITH (\n"
+ " 'connector' = 'kafka',\n"
+ " 'topic' = 'test2',\n"
+ " 'properties.bootstrap.servers' = '192.168.124.122:9092',\n"
+ " 'properties.group.id' = 'windowGroup',\n"
+ " 'scan.startup.mode' = 'latest-offset',\n"
+ " 'format' = 'json',\n"
+ " 'json.fail-on-missing-field' = 'false',\n"
+ " 'json.ignore-parse-errors' = 'true' \n"
+ ")"
flink在table api的kakfa connector中,auto.offset.reset的配置变为scan.startup.mode,看这表述,确实感觉有点误会,像是只是启动初始化的时候生效。
先把kafka分区删除一个,代码走一波。
后台并没有异常错误及退出。可以看到,最先我删除了index和log,然后发送了数据,kafka生成了新的inde和log,并且flink程序正常消费。
然后我把代码中scan.startup.mode配置删了。然后再把kafka中一个分区的index和log删掉。启动。然后报错了。
跟spark的异常信息相似。
Undefined offset with no reset policy for partitions: [test2-0]
可见auto.offset.reset/scan.startup.mode跟官网和我之前预期是相符的。没有问题。
简单看一下flink 1.14相关源码,关键位置在
SubscriptionState.resetMissingPositions
可是以看到,如果获取不到Partation相关信息且没有设置scan.startup.mode,那么OffsetResetStrategy就是默认的NONE,这种情况下就会加入partitionsWithNoOffsets,然后当partitionsWithNoOffsets不为空的时候,就会抛出异常。
流计算中kafka的OffsetReset策略的更多相关文章
- 《Kafka Stream》调研:一种轻量级流计算模式
原文链接:https://yq.aliyun.com/articles/58382 摘要: 流计算,已经有Storm.Spark,Samza,包括最近新起的Flink,Kafka为什么再自己做一套流计 ...
- 【翻译】Jay Kreps - 为何流处理中局部状态是必要的
译者注: 原文作者是 Jay Kreps,也是那篇著名的<The Log: What every software engineer should know about real-time da ...
- Storm流计算之项目篇(Storm+Kafka+HBase+Highcharts+JQuery,含3个完整实际项目)
1.1.课程的背景 Storm是什么? 为什么学习Storm? Storm是Twitter开源的分布式实时大数据处理框架,被业界称为实时版Hadoop. 随着越来越多的场景对Hadoop的MapRed ...
- .Spark Streaming(上)--实时流计算Spark Streaming原理介
Spark入门实战系列--7.Spark Streaming(上)--实时流计算Spark Streaming原理介绍 http://www.cnblogs.com/shishanyuan/p/474 ...
- Storm概念学习系列之什么是实时流计算?
不多说,直接上干货! 什么是实时流计算? 1.实时流计算背景 2.实时计算应用场景 3.实时计算处理流程 4.实时计算框架 什么是实时流计算? 所谓实时流计算,就是近几年由于数据得到广泛应用之后 ...
- 大数据开发实战:Spark Streaming流计算开发
1.背景介绍 Storm以及离线数据平台的MapReduce和Hive构成了Hadoop生态对实时和离线数据处理的一套完整处理解决方案.除了此套解决方案之外,还有一种非常流行的而且完整的离线和 实时数 ...
- FLINK流计算拓扑任务代码分析<一>
我打算以 flink 官方的 例子 <<Monitoring the Wikipedia Edit Stream>> 作为示例,进行 flink 流计算任务 的源码解析说明. ...
- 用Spark进行实时流计算
Spark Streaming VS Structured Streaming Spark Streaming是Spark最初的流处理框架,使用了微批的形式来进行流处理. 提供了基于RDDs的Dstr ...
- 指标统计:基于流计算 Oceanus(Flink) 实现实时 UVPV 统计
作者:吴云涛,腾讯 CSIG 高级工程师导语 | 最近梳理了一下如何用 Flink 来实现实时的 UV.PV 指标的统计,并和公司内微视部门的同事交流.然后针对该场景做了简化,并发现使用 Flink ...
- Storm分布式实时流计算框架相关技术总结
Storm分布式实时流计算框架相关技术总结 Storm作为一个开源的分布式实时流计算框架,其内部实现使用了一些常用的技术,这里是对这些技术及其在Storm中作用的概括介绍.以此为基础,后续再深入了解S ...
随机推荐
- ECharts笔记--实现地图版的数据显示(存在bug/┭┮﹏┭┮/)
相关描述 前几天实现了柱状图等图的数据可视化,现在就来接着实现一下"更加"形象的数据可视化吧! 具体实现如下 <%@ taglib prefix="c" ...
- 实践Pytorch中的模型剪枝方法
摘要:所谓模型剪枝,其实是一种从神经网络中移除"不必要"权重或偏差的模型压缩技术. 本文分享自华为云社区<模型压缩-pytorch 中的模型剪枝方法实践>,作者:嵌入式 ...
- 大数据 Hadoop 的五大优势
Hadoop与竞争对手相比有哪些优势? 到目前为止,人们可能已经听说过ApacheHadoop.这个名字来源于一只可爱的玩具大象,但Hadoop只不过是一个毛绒玩具.Hadoop是一个开源软件项目,它 ...
- SpringBoot——定制错误页面及原理
更多内容,前往 IT-BLOG 一.SpringBoot 默认的错误处理机制 [1]浏览器返回的默认错误页面如下: ☞ 浏览器发送请求的请求头信息如下:text/html 会在后面的源码分析中说到 ...
- Quicker快速开发,简单的网页数据爬取(示例,获取天眼查指定公司基础工商数据)
前言 有某个线上项目,没有接入工商接口,每次录入公司的时候,都要去天眼查.企查查或者其他公开数据平台,然后手动录入,一两个还好说,数量多了的重复操作就很烦,而且,部分数据是包含超链接,一不注意就点进去 ...
- 设置Mysql sort_buffer_size参数
按照官网的解释:Each session that must perform a sort allocates a buffer of this size. sort_buffer_size is n ...
- react中类组件、函数组件、state、单层遍历、多层遍历、先遍历后渲染、if-else、三目运算符
1.回顾 module.exports = { entry: {}, output: {}, plugins: [], module: {}, resolve: {}, devServe: {} } ...
- 电商AARRR模型分析(二)—R语言
AARRR模型可以说是用户运营和业务增长非常重要的模型.模型以用户的生命周期为核心,把增长步骤拆分为5个步骤,分别是:获取用户(Acquisition).用户激活(Activiation).用户留存( ...
- YII框架(1.7&2.0基础版&2.0高级版)应用程序模板安装方法
YII1.7 安装方法: ① 鼠标右键我的电脑图标-> 选择弹出窗的"属性"选项-->点击"高级"选项卡->在选项卡下面找到"环境变 ...
- 图文介绍 Windows 系统下打包上传 IOS APP 流程
现在很多伙伴跨平台开发应用,有些童鞋没有苹果机,本文将介绍,如何在 Windows 系统环境下直接上架 APP ,不用去搞虚拟机之类的了, Windows 下照样轻松打包上架 iOS APP . 下面 ...