繁体   English   中英

在调试器中调试 apache 光束/数据流?

[英]debug apache beam / dataflow in a debugger?

这首先与这篇文章高度相关 -> 如何在 Dataflow 中进行此类测试(在 twitter 上称为功能测试)?

我们在生产中有一些这样的代码

@Override
public PDone expand(PCollectionTuple in) {
    final RosterPipelineOptions options = (RosterPipelineOptions) in.getPipeline().getOptions();
    try {
        final Schema schema = new Schema.Parser().parse(PractitionerStandardAvroWriter.class.getResourceAsStream("/standardFormat.avsc"));
        final String schemaStr = new BufferedReader(new InputStreamReader(PractitionerStandardAvroWriter.class.getResourceAsStream("/standardFormat.avsc")))
            .lines().collect(Collectors.joining("\n"));

        final PCollection<Validated<PractitionerStandardOutputDto>> validOutputs = in.get(PractitionerStandardOutputConverter.VALID_OUTPUTS_TAG);
        final PCollection<Validated<PractitionerStandardOutputDto>> invalidOutputs = in.get(PractitionerStandardOutputConverter.INVALID_OUTPUTS_TAG);

        final PCollection<GenericRecord> validRecords = validOutputs.apply(
            "Transform Valid Standard Output into Generic Rows", ParDo.of(new GenericRecordConverter(schemaStr)));
        final PCollection<GenericRecord> invalidRecords = invalidOutputs.apply(
            "Transform Invalid Standard Output into Generic Rows", ParDo.of(new GenericRecordConverter(schemaStr)));

        validRecords
            .setCoder(AvroCoder.of(GenericRecord.class, schema))
            .apply("Write Records", AvroIO.writeGenericRecords(schema)
                .to(options.getValidOutput())
                .withoutSharding());

        final PCollection<String> invalidRows = invalidRecords
            .setCoder(AvroCoder.of(GenericRecord.class, schema))
            .apply("Convert Error Avro to Csv", ParDo.of(new AvroToCsvConvertFn(schemaStr, ",")));
        invalidRows.apply("Write Error Records to Csv",
            TextIO.write().to(options.getInvalidOutput()).withoutSharding());

        return PDone.in(in.getPipeline());
    }
    catch (IOException e) {
        SneakyThrow.sneak(e); return null;
    }
}

但是当我们在测试中调试它时,我们无法看到错误。 很难通过这段代码来查看发生了什么,因为我认为它是在这段代码之后运行以变形数据,而这段代码只是如何处理传入数据的定义。 如果我在这里错了,请纠正我?

两个问题

  • 这是编写可调试的 apache-beam/dataflow 代码的最佳方式吗?我们可以单步执行并轻松查看我们的错误在哪里?
  • 有没有其他方法可以轻松调试它,因为我怀疑在应用东西时会在该方法之后发生“真正的执行”?

谢谢,院长

一般来说,就像你的其他问题一样,我的建议如下:

  1. 要逐步完成管道,您可以编写一个单元测试,使用 IDE 运行,它将在 DirectRunner 中运行。 这使您可以轻松地逐步完成您的管道。 这不是在 Dataflow 中运行,而是在本地运行 - 它仍然很有价值。

您可以在expand中设置断点,这些断点将在管道构建时被命中。 您可以在 DoFn 的process中设置断点,或者splitread for Sources - 这些将在管道执行时被命中。

  1. 关于编写可调试管道的建议——好吧,在这种情况下,我的建议是编写可以单独测试的可组合转换。 您可以使用 Beam 必须为您的管道编写测试的各种测试实用程序。 请参阅: https://beam.apache.org/documentation/pipelines/test-your-pipeline/

一些最有价值的测试工具是PAssertTestStreamTestPipeline 我建议您查看我共享的页面,看看这些实用程序是否有帮助。


对于您的特定管道,我可能认为您可以将 PTransform 分成更小的部分,并为每个部分编写简单的单元测试。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM