我正在编写一个Dataflow流媒体管道。在其中一个转换中,DoFn我想访问外部服务 - 在这种情况下,它是数据存储区。
这种初始化步骤是否有最佳实践?我不想为每个processElement方法调用创建数据存储区连接对象。
答案 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
}
}