【问题标题】:Initializing external service connections in Beam在 Beam 中初始化外部服务连接
【发布时间】:2017-06-27 15:20:45
【问题描述】:

我正在编写一个 Dataflow 流式传输管道。在其中一种转换中,DoFn 我想访问一个外部服务——在这种情况下,它是 Datastore。

这种初始化步骤有什么最佳实践吗?我不想为每个 processElement 方法调用创建数据存储连接对象。

【问题讨论】:

    标签: java google-cloud-datastore google-cloud-dataflow apache-beam


    【解决方案1】:

    在 Dataflow SDK 中,您可以做的最简单的事情是在您的第一个元素中添加一个检查以初始化您的外部服务:

    class DatastoreCallingDoFn extends DoFn {
    
        private ExtServiceHandle handle = null;
    
        private ExtServiceHandle initializeConnection() {
          // ...
        }
    
        public void processElement(ProcessContext c) {
          // ... process each element -- setup will have been called
          if (handle == null) {
            handle = initializeConnection();
          }
          // Process elements
        }
    }
    

    如果您使用的是 Beam,您可以使用 @Setup 装饰器来装饰您的 DoFn 中的一个函数来设置您的 DoFn,例如初始化数据存储连接。

    class DatastoreCallingDoFn extends DoFn {
        @Setup
        public void initializeDatastoreConnection() {
          // ...
        }
    
        @ProcessElement
        public void processElement(ProcessContext c) {
            // ... process each element -- setup will have been called
        }
    }
    

    这类似于answer in this question

    【讨论】:

    • 它的流式传输管道,因此每个元素都会调用 setup 方法。我在标准数据流依赖项中没有找到 SetupProcessElement 注释。
    • 对不起。 @SetupProcessElement 是 Beam 库的一部分。我很困惑。虽然 @Setup 不被称为每个元素。它被称为 per-DoFn 实例。我将编辑问题以考虑这两个选项。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-15
    • 1970-01-01
    • 2021-10-26
    • 1970-01-01
    相关资源
    最近更新 更多