首页 > 解决方案 > 如果 source/sink/operator 具有未定义的 uid 或名称,则 Flink 作业失败

问题描述

在我的工作中,我希望每个源/接收器/操作员都应该uid定义name属性以便于识别。

operator.process(myFunction).uid(MY_FUNCTION).name(MY_FUNCTION);

现在我需要手动检查每个作业以检测缺失的设置。name如果有或uid未定义,我如何告诉 Flink 失败?

标签: apache-flinkflink-streaming

解决方案


一旦你得到一个StreamExecutionEnvironment,你就可以得到运营商的图表。

当你没有定义一个名字时,Flink 会自动为你生成一个。此外,如果您设置了名称,至少在源或接收器的情况下,Flink 会在名称中添加前缀Source:Sink:

当不定义uid时,这个阶段图中的uid值为null。

鉴于您的场景,名称和 uid 始终相同,要检查所有操作员是否已提供名称和 uid,您可以执行以下操作:

        getExecutionEnvironment().getStreamGraph().getStreamNodes().stream()
            .filter(streamNode -> streamNode.getTransformationUID() == null ||
                    !streamNode.getOperatorName().contains(streamNode.getTransformationUID()))
            .forEach(System.out::println);

此代码段将打印所有与您的规则不匹配的运算符。

这在 100% 的情况下不起作用,例如使用作为名称子字符串的 uid。但是您可以在此处获得访问运营商信息并应用适合您的情况的过滤器并执行您自己的策略的通用方法。

该片段可以用作 CI 的一部分,也可以直接在应用程序中使用。


推荐阅读