【问题标题】:Is there a way to upload jars for a dataflow job so we don't have to serialize everything?有没有办法为数据流作业上传 jar,这样我们就不必序列化所有内容?
【发布时间】:2023-03-16 04:32:01
【问题描述】:

例如,我记得在 hadoop 中,我可以使类可序列化,或者为我的工作所需的 jar 提供路径。我有两种选择。我想知道这在数据流作业中是否属实,这样我就可以将我们在 jar 文件中的所有客户端打包给所有工作人员。

在我们的例子中,我们有 MicroserviceApi 和生成的客户端等,并且希望输出到该下游微服务,而不必使其可序列化。

有没有办法做到这一点?

【问题讨论】:

    标签: google-cloud-dataflow dataflow


    【解决方案1】:
    1. 首先,让我澄清一下序列化

    当您将implements Serializable 添加到Java 中的类时,您可以使该类的对象实例 可以被序列化(而不是类本身)。目标 JVM 需要访问该类才能理解您发送给它的序列化实例。所以,实际上你总是需要为它提供 JAR。

    Beam 具有自动查找类路径中的所有 JAR 并将它们上传到 Dataflow 或您正在使用的任何运行器的代码,因此如果 JAR 在您的类路径中,那么您无需担心(如果您重新使用 Maven/Gradle 并将其指定为依赖项,那么您很可能没问题)。


    1. 现在,如果 Beam 中的类不可序列化,我该如何使用它?

    在 Beam 中,更重要的部分是弄清楚管道代码的不同部分将在 wherewhen 执行。有些事情在管道构建时执行,有些事情在管道运行时执行

    在构建时运行的东西

    • 所有类(DoFns、PTransforms 等)的构造函数
    • PTransforms 的 expand 方法

    在执行时运行的东西

    • 对于您的 DoFns:ProcessElementStartBundleFinishBundleSetupTearDown 方法。

    如果您的类没有实现可序列化,但您想在执行时访问它,那么您需要在执行时创建它。所以,假设你有一个 DoFn:

    class MyDoFnImplementation extends DoFn<String, String> {
    
      // All members of the object need to be serializable. String is easily serializable.
      String config;
      // Your MicroserviceApi is *not* serializable, so you can mark it as transient.
      // The transient keyword ensures that Java will ignore the member when serializing.
      transient MicroserviceApi client;
    
      public MyDoFnImplementation(String configuration) {
        // This code runs at *construction time*.
        // Anything you create here needs to be serialized and sent to the runner.
        this.config = configuration;
      }
    
      @ProcessElement
      public void process(ProcessContext c) {
        // This code runs at execution time. You can create your object here.
        // Add a null check to ensure it's only created once.
        // You can also create it at @Setup or @StartBundle.
        if (client == null) client = new MicroserviceApi(this.config);
      }
    }
    

    通过确保在执行时创建对象,您可以避免使它们可序列化 - 但您的配置需要可序列化。

    【讨论】:

    • 多么棒的答案,谢谢!!!!现在我得到了那部分,我有一个关于我在这里发布的问题stackoverflow.com/questions/67076158/…。我将深入研究那个 ProcessContext,希望它可以容纳 api,以便我可以模拟它,但是在我发布的下一个 SO 问题中,任何模拟 MicroServiceApi 的捷径都会很棒。
    • 有没有办法不'new MicroserviceApi'并注入它,以便我可以交换一个模拟?理想情况下,由于序列化问题,不需要“静态”字段。也许是查找或什么?或者 apache Beam 直接运行器的客户端可以在设置后以某种方式访问​​客户端吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-15
    • 1970-01-01
    • 2011-01-11
    • 2018-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多