无法为不存在的操作员时间戳/水印设置 uid

时间:2021-06-11 16:50:47

标签: apache-flink

我正在做一个项目,并且打开了 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)。

接下来我可以尝试什么?

1 个答案:

答案 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);
相关问题