朋友的公司做的是西南某边境省份网红新能源车的数据处理,由于新能源车的火爆,从年初从现在,数据量已经翻番。但与此同时,服务器却没有多少增加。无奈之下,只能暂时将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策略的更多相关文章

  1. 《Kafka Stream》调研:一种轻量级流计算模式

    原文链接:https://yq.aliyun.com/articles/58382 摘要: 流计算,已经有Storm.Spark,Samza,包括最近新起的Flink,Kafka为什么再自己做一套流计 ...

  2. 【翻译】Jay Kreps - 为何流处理中局部状态是必要的

    译者注: 原文作者是 Jay Kreps,也是那篇著名的<The Log: What every software engineer should know about real-time da ...

  3. Storm流计算之项目篇(Storm+Kafka+HBase+Highcharts+JQuery,含3个完整实际项目)

    1.1.课程的背景 Storm是什么? 为什么学习Storm? Storm是Twitter开源的分布式实时大数据处理框架,被业界称为实时版Hadoop. 随着越来越多的场景对Hadoop的MapRed ...

  4. .Spark Streaming(上)--实时流计算Spark Streaming原理介

    Spark入门实战系列--7.Spark Streaming(上)--实时流计算Spark Streaming原理介绍 http://www.cnblogs.com/shishanyuan/p/474 ...

  5. Storm概念学习系列之什么是实时流计算?

    不多说,直接上干货! 什么是实时流计算?    1.实时流计算背景 2.实时计算应用场景 3.实时计算处理流程 4.实时计算框架 什么是实时流计算? 所谓实时流计算,就是近几年由于数据得到广泛应用之后 ...

  6. 大数据开发实战:Spark Streaming流计算开发

    1.背景介绍 Storm以及离线数据平台的MapReduce和Hive构成了Hadoop生态对实时和离线数据处理的一套完整处理解决方案.除了此套解决方案之外,还有一种非常流行的而且完整的离线和 实时数 ...

  7. FLINK流计算拓扑任务代码分析<一>

    我打算以 flink 官方的 例子 <<Monitoring the Wikipedia Edit Stream>> 作为示例,进行 flink 流计算任务 的源码解析说明. ...

  8. 用Spark进行实时流计算

    Spark Streaming VS Structured Streaming Spark Streaming是Spark最初的流处理框架,使用了微批的形式来进行流处理. 提供了基于RDDs的Dstr ...

  9. 指标统计:基于流计算 Oceanus(Flink) 实现实时 UVPV 统计

    作者:吴云涛,腾讯 CSIG 高级工程师导语 | 最近梳理了一下如何用 Flink 来实现实时的 UV.PV 指标的统计,并和公司内微视部门的同事交流.然后针对该场景做了简化,并发现使用 Flink ...

  10. Storm分布式实时流计算框架相关技术总结

    Storm分布式实时流计算框架相关技术总结 Storm作为一个开源的分布式实时流计算框架,其内部实现使用了一些常用的技术,这里是对这些技术及其在Storm中作用的概括介绍.以此为基础,后续再深入了解S ...

随机推荐

  1. 解决margin合并问题

    一.什么是外边距合并 外边距合并(叠加)是一个相当简单的概念.但是,在实践中对网页进行布局时,它会造成许多混淆. 所谓的外边距合并就是,当两个垂直外边距相遇时,它们将形成一个外边距.合并的外边距的高度 ...

  2. .NET生成MongoDB中的主键ObjectId

    前言 因为很多场景下我们需要在创建MongoDB数据的时候提前生成好主键为了返回或者通过主键查询创建的业务,像EF中我们可以生成Guid来,本来想着要不要实现一套MongoDB中ObjectId的,结 ...

  3. 万字长文带你入门docker

    1 Docker dockerfiler 镜像构建 Compose是在单机进行容器编排 Horbor 镜像仓库 Docker swarm 在多机进行容器编排 Docker Compose缺点是不能在分 ...

  4. [Linux]常用命令之【du/fdisk/df/ls】#磁盘管理/文件管理#

    本文的经典应用场景: 1.查找占用磁盘存储空间最大的目录/文件 2.关于[磁盘分区]的相关概念和实操,详见另一博文:[Linux]磁盘分区 - 博客园/千千寰宇 1 fdisk fdisk := &q ...

  5. 在Blazor中使用Chart.js

    1. 在Blazor中使用Chart.js 首先,从Chart.js官方网站下载Chart.js库文件. 推荐下载这个构建好的版本https://cdnjs.com/libraries/Chart.j ...

  6. day60:Linux压缩与打包&用户管理&用户提权sudo&grep,sed,awk,sort,uniq

    目录 1.文件管理-压缩与打包 2.用户管理 用户怎么查 如何创建用户 创建的用户信息都存储在哪? 用户存储密码的文件 如何为用户设定密码? 3.用户组 4.用户提权相关 5.Extra:额外补充 文 ...

  7. 帝国cms随机sql语句,mysql高效的随机查询

    select * from AppleStorewhere rand()<0.015limit 100;

  8. 在.NET 6.0中自定义接口路由

    大家好,我是张飞洪,感谢您的阅读,我会不定期和你分享学习心得,希望我的文章能成为你成长路上的垫脚石,让我们一起精进. 在本文中,我们将讨论ASP.NET Core中的新路由.我们将了解什么是接口(en ...

  9. APISIX 是怎么保护用户的敏感数据不被泄露的?

    本文以 APISIX 作为例子,为大家介绍了如何借助 Global Data Encryption 功能来保护敏感数据,确保不会有任何敏感数据进行明文存储,这样即使 etcd 中所有存储的数据都被盗取 ...

  10. 笔记:C++学习之旅---面向对象程序的设计1

    笔记:C++学习之旅---面向对象程序的设计1 面向对象的主要特征 1.抽象 2.封装 3.继承 4.多态 抽象:将程序的每一部分都看作一个抽象的对象,即程序有一组抽象的对象组成的更复杂点,这些对象根 ...