如果源/接收器/操作员具有未定义的uid或名称,则失败Flink Job

时间:2019-07-25 09:18:24

标签: apache-flink flink-streaming

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

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

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

1 个答案:

答案 0 :(得分:2)

一旦获得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的一部分,也可以直接在您的应用程序中使用。