【FLINK】The requested state does not exist. Check for typos in your state descriptor, or specify the

本文记录了一次在Flink 1.13中使用Scala 2.11进行开发时遇到的广播状态异常问题,详细解析了错误信息,并通过逐步排查定位到问题原因在于广播状态描述符名称不匹配。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景:Flink 1.13 ,Scala 2.11

在使用Flink Broadcast State Pattern的时候,发现启动的时候的出现异常

1、报错信息

Caused by: java.lang.IllegalArgumentException: The requested state does not exist. Check for typos in your state descriptor, or specify the state descriptor in the datastream.broadcast(...) call if you forgot to register it.
	at org.apache.flink.streaming.api.operators.co.CoBroadcastWithNonKeyedOperator$ReadWriteContextImpl.getBroadcastState(CoBroadcastWithNonKeyedOperator.java:168)
	at com.flink.demo.broadcast.transform.CoBroadcastProcessFunction.processBroadcastElement(CoBroadcastProcessFunction.java:53)
	at com.flink.demo.broadcast.transform.CoBroadcastProcessFunction.processBroadcastElement(CoBroadcastProcessFunction.java:20)
	at org.apache.flink.streaming.api.operators.co.CoBroadcastWithNonKeyedOperator.processElement2(CoBroadcastWithNonKeyedOperator.java:118)
	at org.apache.flink.streaming.runtime.io.StreamTwoInputProcessorFactory.processRecord2(StreamTwoInputProcessorFactory.java:221)
	at org.apache.flink.streaming.runtime.io.StreamTwoInputProcessorFactory.lambda$create$1(StreamTwoInputProcessorFactory.java:190)
	at org.apache.flink.streaming.runtime.io.StreamTwoInputProcessorFactory$StreamTaskNetworkOutput.emitRecord(StreamTwoInputProcessorFactory.java:291)
	at org.apache.flink.streaming.runtime.io.AbstractStreamTaskNetworkInput.processElement(AbstractStreamTaskNetworkInput.java:134)
	at org.apache.flink.streaming.runtime.io.AbstractStreamTaskNetworkInput.emitNext(AbstractStreamTaskNetworkInput.java:105)
	at org.apache.flink.streaming.runtime.io.StreamOneInputProcessor.processInput(StreamOneInputProcessor.java:66)
	at org.apache.flink.streaming.runtime.io.StreamTwoInputProcessor.processInput(StreamTwoInputProcessor.java:98)
	at org.apache.flink.streaming.runtime.tasks.StreamTask.processInput(StreamTask.java:423)
	at org.apache.flink.streaming.runtime.tasks.mailbox.MailboxProcessor.runMailboxLoop(MailboxProcessor.java:204)
	at org.apache.flink.streaming.runtime.tasks.StreamTask.runMailboxLoop(StreamTask.java:681)
	at org.apache.flink.streaming.runtime.tasks.StreamTask.executeInvoke(StreamTask.java:636)
	at org.apache.flink.streaming.runtime.tasks.StreamTask.runWithCleanUpOnFail(StreamTask.java:647)
	at org.apache.flink.streaming.runtime.tasks.StreamTask.invoke(StreamTask.java:620)
	at org.apache.flink.runtime.taskmanager.Task.doRun(Task.java:779)
	at org.apache.flink.runtime.taskmanager.Task.run(Task.java:566)
	at java.lang.Thread.run(Thread.java:748)

2、分析及解决

 2.1 查看报错信息源码

结论:发现是在取广播状态的时候报的异常,再继续往上看是哪里调用了getBroadcastState

2.2 查看调用方法,及定义的MapStateDescriptor

 在BroadcastProcessFunction里定义了一个Descriptor


 

2.3 思考

在这里留下了疑惑,我明明有定义一个Descriptor,为什么会提示说找不到呢,是不是我定义的有什么问题呀,还是说要跟前面调用广播流定义的Descriptor一模一样?


带着这样子的疑惑我返回去看看了,前面生成广播流时定义的Descriptor,发现有两个地方不一样,一个是生成的一个参数是configBroadcastDescriptorconfigDesCriptor,另一个是MapStateDescriptor里面的参数那么不一样,一个是mysql-config-table另一个是config,那既然发现了不一样的地方那我们来一个个修正。

 

2.3.1 修改参数名字

统一改成configBroadcastDescriptor

结论:发现仍然还是启动报相同的错误,与这个无关

2.3.2 修改MapStateDescroptor中的name

哦豁~,发现程序正常启动了,奶思~

3、 反思

3.1 首先对广播的Descriptor有了更深入的理解,dataStream.broadcast(MapStateDescriptor<?,?>)需要跟BroadcastProcessFunction中的Descriptor保持一致

3.2 在参数名的时候应该发现其实这最后指引的是两个寻址,因为本身就是两个新的单独标量

3.3 正常情况下并不需要再生成一个MapState,这里跟CoProcessFunction里的还是不一样的,谨慎的别把他们混在一起

 

 

<think>好的,我现在需要解决用户提到的Flink 1.19中出现的'package org.apache.flink.robtime.jobgraph does not exist'的问题。首先,我要理解这个错误通常是什么原因引起的。根据经验,Java项目中出现某个包不存在的错误,最常见的原因是依赖项缺失或者版本不兼容。Flink的runtime包可能没有被正确引入,或者用户可能在使用旧版本的依赖。 接下来,我应该检查用户的项目配置,特别是构建工具,比如Maven或Gradle。如果是Maven项目,需要确认pom.xml文件中是否有正确的依赖项。Flink的runtime模块通常包含jobgraph类,所以需要确保引入了flink-runtime依赖,并且版本是1.19对应的。 然后,考虑到Flink的模块化结构,可能在1.19版本中某些包的位置发生了变化。比如,可能jobgraph类被移动到了其他模块中,或者该模块被重命名了。这时候需要查阅Flink 1.19的官方文档或API变更日志,确认org.apache.flink.runtime.jobgraph是否存在,以及对应的依赖项名称。 另外,用户可能引入了错误的依赖作用域,比如test作用域导致主代码无法访问。或者可能存在依赖冲突,比如引入了其他库的版本覆盖了Flink的依赖。例如,用户提到spark sql包冲突的问题,类似的情况可能在Flink中发生,特别是如果项目同时使用了其他大数据组件。 此外,构建工具的问题也不能排除,比如缓存导致依赖未正确下载。清理本地仓库重新构建可能有效。还有IDE的缓存问题,比如IntelliJ没有正确索引新加入的依赖,这时候需要刷新项目或重新导入。 可能还需要检查JDK版本是否与Flink 1.19兼容,因为不兼容的Java版本有时会导致类找不到的错误,但这种情况可能较少见。不过用户的问题明确提到包不存在,更多是依赖问题。 最后,参考用户提供的引用中,特别是引用[3]提到的包冲突问题,需要提示用户检查是否有其他库导致冲突,并建议排除冲突的依赖。</think>### Flink 1.19 "package org.apache.flink.runtime.jobgraph does not exist" 解决方案 #### 1. 检查依赖配置 **问题原因**: 该错误通常由以下原因导致: - 缺少 `flink-runtime` 依赖 - 依赖版本与 Flink 1.19 不兼容 - 依赖作用域(如 `provided`)导致编译时不可用[^1] **解决方案**: - **Maven 项目**:在 `pom.xml` 中添加以下依赖: ```xml <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-runtime</artifactId> <version>1.19.0</version> <!-- 根据部署环境调整作用域 --> <scope>compile</scope> </dependency> ``` - **Gradle 项目**: ```gradle implementation 'org.apache.flink:flink-runtime:1.19.0' ``` #### 2. 验证依赖冲突 **问题原因**:其他依赖可能覆盖 Flink 的类路径(例如 Spark、Iceberg 等组件冲突)[^3]。 **操作步骤**: - 运行 `mvn dependency:tree`(或 Gradle 的依赖分析工具)检查冲突 - 若存在冲突,通过 `<exclusions>` 排除重复依赖: ```xml <dependency> <groupId>org.apache.other</groupId> <artifactId>library</artifactId> <exclusions> <exclusion> <groupId>org.apache.flink</groupId> <artifactId>*</artifactId> </exclusion> </exclusions> </dependency> ``` #### 3. 清理构建环境 **问题原因**:旧版本依赖缓存可能导致类加载异常。 **操作步骤**: - 删除本地 Maven 仓库中的 Flink 相关目录(默认路径:`~/.m2/repository/org/apache/flink`) - 执行 `mvn clean install` 或 `gradle clean build` #### 4. 检查 Flink 版本兼容性 确认所有 Flink 组件版本统一为 `1.19.x`,例如: ```xml <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-core</artifactId> <version>1.19.0</version> </dependency> <!-- 其他 Flink 组件如 flink-streaming-java、flink-clients 等需同步版本 --> ``` #### 5. IDE 配置修复 - **IntelliJ**:点击菜单栏 **File > Invalidate Caches / Restart** - **Eclipse**:右键项目选择 **Maven > Update Project** ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zsigner

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值