我正在做一个项目,并且打开了 Flink 选项 disableAutoGeneratedUIDs 以确保所有东西都被赋予了正确的 uid。但是我在尝试运行以下作业时遇到错误:
<块引用>java.lang.IllegalStateException:自动生成的 UID 已被禁用,但未将 UID 或哈希分配给操作员时间戳/水印
现在我遇到了我在没有设置 uid 时创建的操作符的错误(正如预期的那样),但是这个操作符不是我创建或命名的。所以我假设它是用于创建源函数正在使用的 WatermarkStrategy 的代码,但我不能给 WatermarkStrategy 一个 uid,所以这是一个死胡同。
我一年前在网上看到一个错误,说分区需要一个 uid 而它不应该有,我想知道这是否是类似的情况 (http://apache-flink-user-mailing-list-archive.2336050.n4.nabble.com/How-to-assign-a-UID-to-a-KeyedStream-td32052.html)。
接下来我可以尝试什么?
答案 0 :(得分:1)
刚刚想通了。我认为这只是一个疏忽。
所以代码最初只是:
0 75.777778
1 66.666667
2 87.222222
3 65.777778
4 43.000000
5 77.666667
6 68.000000
7 71.777778
8 90.777778
9 74.000000
dtype: float64
在我第一次尝试时,我尝试在此处添加 uid:
getSource().name(NAME).assignTimestampsAndWatermarks(getWatermarkStrategy())
.process(new CountOperation())
.name(COUNT_OPERATION_NAME);
认为这可以处理整个“部分”。然后,当我第一次收到错误消息“这个计数操作名称没有 uid”时,我将 uid 移到了 .process 之后:
getSource().name(NAME).assignTimestampsAndWatermarks(getWatermarkStrategy())
.uid("WatermarkUid")
.process(new CountOperation())
.name(COUNT_OPERATION_NAME);
然后我看到错误提示操作员时间戳/水印没有 Uid。我开始寻找在代码中命名的运算符。但是在我朦胧的“星期五大脑”逻辑中,我不知何故没有弄清楚错误是由第一个 uid 解决的,因为这是assignTimestampsAndWatermarks的默认名称(感谢@hourcos提供查看仪表板ui的提示。看到操作符块中的名字让一切都点击了)。所以解决它只是添加一个 uid 像这样:
getSource().name(NAME).assignTimestampsAndWatermarks(getWatermarkStrategy())
.process(new CountOperation())
.uid("WatermarkUid")
.name(COUNT_OPERATION_NAME);