Apache Beam 测试因 Java SDK 中的未知输出标签异常而失败

Apache Beam Test Fails Due to Unknown Output Tag Exception in Java SDK

提问人:Igor Tiulkanov 提问时间:11/7/2023 更新时间:11/7/2023 访问量:24

问:

我正在使用 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 也用于主管道中,没有任何问题。

有人可以帮我了解可能导致测试环境中出现此“未知输出标记”异常的原因以及如何解决它吗?

Java 测试 标签 google-cloud-dataflow junit4

评论

0赞 Igor Tiulkanov 11/8/2023
通过正确实例化标签来解决

答:

0赞 John Casey 11/7/2023 #1

有两个地方可以开始检查。首先,请务必将 .withOutputTags() 添加到您的 ParDo。

其次,这可能是在测试中的不同运行器上运行的,而不是在主管道上运行的,这可能会导致行为不一致。

评论

0赞 Igor Tiulkanov 11/8/2023
标签的实例化似乎是主要问题。我应该简单地在testProcessElement函数中创建它们。