【问题标题】:Why can't Beam AvroIO use runtime parameters and how to use AvroIO in Dataflow templates?为什么 Beam AvroIO 不能使用运行时参数以及如何在 Dataflow 模板中使用 AvroIO?
【发布时间】:2017-07-07 12:12:15
【问题描述】:

我尝试将 Dataflow 中的运行时参数与 AvroIO 结合使用,但只是遇到了序列化问题 (java.io.NotSerializableException: org.apache.avro.Schema$RecordSchema)。然后我发现此页面底部的表格中缺少 AvroIO:https://cloud.google.com/dataflow/docs/templates/creating-templates

我猜这是由于某些 Avro 类的不可序列化,这是真的吗?是否有解决此问题的计划?

如果没有,如果我需要在写入 Avro 文件的模板中使用运行时参数,我应该怎么做?我是否必须放弃模板并以某种方式让我的服务运行并在每次需要时以标准方式部署作业?这意味着我这边有很多额外的网络流量和/或基础设施代码。我有点不相信我是第一个需要同时运行模板作业和使用 Avro 的人。人们如何解决这个问题?

【问题讨论】:

    标签: serialization avro google-cloud-dataflow apache-beam


    【解决方案1】:

    使用具有特定 IO 的模板要求 IO 必须接受将由模板填充的任何参数的ValueProvider 版本。 AvroIO 没有被修改为接受ValueProvider 参数,所以它还不支持运行时参数。

    我不确定你在哪里得到可序列化的异常,或者你是如何将RuntimeValueProvider 传递给AvroIO 的。要完成这项工作,AvroIO 需要更改以支持适当的参数化 - 可能采用架构字符串 - 此时您应该能够将架构的 RuntimeValueProvider 传递给它。

    【讨论】:

    • Avro IO 是否支持价值提供者:org.apache.beam.sdk.io.AvroIO.Write#to(org.apache.beam.sdk.options.ValueProvider<java.lang.String>) (Beam SDK 2.0.0)
    • 确实如此。我在看 AvroIO.read(),但 AvroIO.write() 确实支持 ValueProviders。查看实现,它导致它使用匿名内部类,该类捕获不可序列化的 Write 类的字段。 github.com/apache/beam/pull/3538 提交后应该会解决这个问题。
    • 感谢您的快速响应和修复,一旦合并,我们会在测试时更新您。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-15
    • 1970-01-01
    • 2018-09-07
    • 2018-06-16
    • 1970-01-01
    相关资源
    最近更新 更多