流计算中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 ...
随机推荐
- Spring源码分析之注册BeanDefinition
测试代码 public class ContextApplication { public static void main(String[] args) { ClassPathXmlApplicat ...
- k8s HPA(HorizontalPodAutoscaler)--自动水平伸缩
写在前面 我们平时部署web服务,当服务压力大撑不住的时候,我们会加机器(加钱):一般没有上容器编排是手动加的,临时加的机器,临时部署的服务还要改Nginx的配置,最后回收机器的时候,也是手动回收,手 ...
- 2021年9月学科能力综合测试(TACA)试题解答 Mathemaitca练习
各个都是人形计算器???? 目录 试题地址 1 签到 2 3 签到 4 5 6 7 8 9 10 11 你让我猜我肯定这么猜 12 13 试题地址 http://www.mxqe.com/gzsnj/ ...
- 2PC(两阶段提交)【XA 与 Seata方案】
更多内容,前往 IT-BLOG 一.概述 2PC(two phase commit protocol,2PC)即两阶段提交协议,是将整个事务流程分为两个阶段,准备阶段(Prepare phase).提 ...
- 机器学习(三):朴素贝叶斯+贝叶斯估计+BP人工神经网络习题手算|手工推导与习题计算
1.有 1000 个水果样例. 它们可能是香蕉,橙子或其它水果,已知每个水果的 3 种特性:是否偏长.是否甜.颜色是否是黄色 类型 长 不长 甜 不甜 黄色 非黄 Total 香蕉 400 100 3 ...
- GaussDB(DWS)网络调度与隔离管控能力
摘要:调度算法是调度器的核心,设计调度算法要充分考虑业务场景和用户需求,没有万能的调度算法,只有合适的调度算法. 本文分享自华为云社区<GaussDB(DWS)网络调度与隔离管控能力>,作 ...
- JSTL标签fmt:formatDate格式化日期出错
现象&背景: 异常: "org.apache.jasper.JasperException: 在 [115] 行处理 [/WEB-INF/jsp/modules/receivedya ...
- KVM WEB管理工具 WebVirtMgr
一.webvirtmgr介绍及环境说明 温馨提示:安装KVM是需要2台都操作的,因为我们是打算将2台都设置为宿主机所有都需要安装KVM相关组件 github地址https://github.com/r ...
- Spring注解系列——@PropertySource
在Spring框架中@PropertySource注解是非常常用的一个注解,其主要作用是将外部化配置解析成key-value键值对"存入"Spring容器的Environment环 ...
- python:模拟购票的小程序
问题描述:小白学习python的第N天,继续练习.做一个模拟购票的小程序,没有用数据库和文件来存储数据,只是能够单词选择. # hzh 每天进步一点点 # 2022/5/13 17:24 import ...