【发布时间】:2017-06-27 15:20:45
【问题描述】:
我正在编写一个 Dataflow 流式传输管道。在其中一种转换中,DoFn 我想访问一个外部服务——在这种情况下,它是 Datastore。
这种初始化步骤有什么最佳实践吗?我不想为每个 processElement 方法调用创建数据存储连接对象。
【问题讨论】:
标签: java google-cloud-datastore google-cloud-dataflow apache-beam
我正在编写一个 Dataflow 流式传输管道。在其中一种转换中,DoFn 我想访问一个外部服务——在这种情况下,它是 Datastore。
这种初始化步骤有什么最佳实践吗?我不想为每个 processElement 方法调用创建数据存储连接对象。
【问题讨论】:
标签: java google-cloud-datastore google-cloud-dataflow apache-beam
在 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
}
}
【讨论】:
Setup 或 ProcessElement 注释。
@Setup 和 ProcessElement 是 Beam 库的一部分。我很困惑。虽然 @Setup 不被称为每个元素。它被称为 per-DoFn 实例。我将编辑问题以考虑这两个选项。