Apache flink 如果源/接收器/运算符具有未定义的uid或名称,则Flink作业失败

Apache flink 如果源/接收器/运算符具有未定义的uid或名称,则Flink作业失败,apache-flink,flink-streaming,Apache Flink,Flink Streaming,在我的工作中,我希望每个源/接收器/操作员都应该定义uid和name属性,以便于识别 operator.process(myFunction).uid(MY_FUNCTION).name(MY_FUNCTION); 现在我需要手动检查每个作业,以检测缺少的设置。如果未定义任何name或uid,我如何告诉Flink作业失败?一旦获得StreamExecutionEnvironment,您就可以获得操作符的图形 当您不定义名称时,Flink会自动为您生成一个名称。此外,如果您设置了一个名称(至少是

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

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

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

一旦获得
StreamExecutionEnvironment
,您就可以获得操作符的图形

当您不定义名称时,Flink会自动为您生成一个名称。此外,如果您设置了一个名称(至少是源或汇),Flink会在名称中添加前缀
源:
汇:

如果未定义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的一部分停用,也可以直接在应用程序中使用