在Beam中初始化外部服务连接

时间:2017-06-27 15:20:46

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

我正在编写一个Dataflow流媒体管道。在其中一个转换中,DoFn我想访问外部服务 - 在这种情况下,它是数据存储区。

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

1 个答案:

答案 0 :(得分:3)

在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