在我的工作中,我希望每个源/接收器/操作员都应定义uid
和name
属性,以便于识别。
operator.process(myFunction).uid(MY_FUNCTION).name(MY_FUNCTION);
现在,我需要手动检查每个作业以检测缺少的设置。如果未定义任何name
或uid
,如何告诉Flink失败?
答案 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的一部分,也可以直接在您的应用程序中使用。