流计算中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 ...
随机推荐
- Web For Pentester File include
File include(文件包含) Example 1 没有任何过滤 审计源码 没有对我们传参的page进行任何过滤,payload如下 http://172.16.1.104/fileincl/e ...
- 网络安全(中职组)-B模块:暴力破解
任务环境说明: 服务器场景名称:sql008 服务器场景用户名:administrator:密码:未知(封闭靶机) 1.使用渗透机场景kali中工具扫描服务器场景,将iis的版本号作为flag提交: ...
- 【LeetCode贪心#11】单调递增的数字(详解)
单调递增的数字 力扣题目链接(opens new window) 给定一个非负整数 N,找出小于或等于 N 的最大的整数,同时这个整数需要满足其各个位数上的数字是单调递增. (当且仅当每个相邻位数上的 ...
- Java面试——数据库
一.数据库隔离级别 [1]Read Uncommitted(读取未提交内容):出现脏读,也就是可能读取到其他会话中未提交事务修改的数据.[2]Read Committed(读取已提交内容):不可重复读 ...
- std常用类型
std::getline 文档 std::reverse 文档 注意事项 reverse()返回值为void,是对原序列进行修改 std::vector 文档 emplace 和 emplace_ba ...
- 解决 ssh 找不到对应主机密钥类型
解决办法 如果最近升级到了 openssh 8.8 版,你会发现连接某些之前连接得好好的服务器突然无法连接: Unable to negotiate with x.x.x.x port 2222: n ...
- webpack踩坑日记
webpack 4.x 详细入门这是一个大佬的总结,但是我用webpack5重写该demo时,发现了几个有问题的地方1:CleanWebpackPlugin 应该这样: const { CleanWe ...
- Oracle_数据泵
Oracle数据泵导入.导出数据 expdp导出 运行CMD 登录数据库,输入sqlplus 使用管理员角色登录需要在用户名后加" as sysdba" 例如:sys as sys ...
- 在Kubernetes上安装Netdata的方法
介绍 Netdata可用于监视kubernetes集群并显示有关集群的信息,包括节点内存使用率.CPU.网络等,简单的说,Netdata仪表板可让您全面了解Kubernetes集群,包括在每个节点上运 ...
- Centos 7安装Elasticsearch 7.6
Centos 7安装Elasticsearch 7.6 Elasticsearch与JDK版本对应关系 在安装 Elasticsearch 时,要注意 Elasticsearch 与 JDK 的版本对 ...