提问人:Igor Tiulkanov 提问时间:11/7/2023 更新时间:11/7/2023 访问量:24
Apache Beam 测试因 Java SDK 中的未知输出标签异常而失败
Apache Beam Test Fails Due to Unknown Output Tag Exception in Java SDK
问:
我正在使用 Java SDK 处理 Apache Beam 项目,在测试过程中遇到了一个持续存在的问题。我的管道使用 DoFn,将元素发送到主输出和侧输出。但是,在运行测试时,我收到一个 IllegalArgumentException,指示“未知输出标记”。
以下是查明问题的堆栈跟踪:
Caused by: java.lang.IllegalArgumentException: Unknown output tag Tag<com.myproject.SomeClassWithDefinedTags#10>
at org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Preconditions.checkArgument(Preconditions.java:216)
at org.apache.beam.repackaged.direct_java.runners.core.SimpleDoFnRunner.outputWindowedValue(SimpleDoFnRunner.java:274)
at org.apache.beam.repackaged.direct_java.runners.core.SimpleDoFnRunner.access$900(SimpleDoFnRunner.java:85)
at org.apache.beam.repackaged.direct_java.runners.core.SimpleDoFnRunner$DoFnProcessContext.output(SimpleDoFnRunner.java:423)
at org.apache.beam.sdk.transforms.DoFnOutputReceivers$WindowedContextOutputReceiver.output(DoFnOutputReceivers.java:76)
at myProject.DoFn.processElement(DoFn.java:136)
我已经仔细检查了我的 TupleTags 是否在测试中正确导入和使用。下面是上下文的代码片段:
import static com.myproject.transform.SomeClassWithDefinedTags.SuccessTag;
import static com.myproject.transform.SomeClassWithDefinedTags.FailTag;
@Test
@Category(NeedsRunner.class)
public void testProcessElement() {
String testInput = "";
List<String> input = List.of(testInput);
PCollection<String> output =
p.apply(Create.of(input))
.apply(ParDo.of(new DoFn(SuccessTag, FailTag)));
PAssert.that(output).containsInAnyOrder("");
p.run().waitUntilFinish();
}
MyDoFn 类的结构是相应地输出到 SuccessTag 和 FailTag 标记。尽管确保标记一致,但测试失败,并出现上述异常。DoFn 也用于主管道中,没有任何问题。
有人可以帮我了解可能导致测试环境中出现此“未知输出标记”异常的原因以及如何解决它吗?
答:
0赞
John Casey
11/7/2023
#1
有两个地方可以开始检查。首先,请务必将 .withOutputTags() 添加到您的 ParDo。
其次,这可能是在测试中的不同运行器上运行的,而不是在主管道上运行的,这可能会导致行为不一致。
评论
0赞
Igor Tiulkanov
11/8/2023
标签的实例化似乎是主要问题。我应该简单地在testProcessElement函数中创建它们。
评论