我有一个从 PubSub 读取消息的数据流。我需要使用几个 API 来丰富此消息。我想要这个 API 的单个实例用于处理所有记录。这是为了避免为每个请求初始化 API。
我尝试创建静态变量,但仍然看到 API 被初始化了很多次。
如何避免在 Google Dataflow 中多次初始化变量?
最佳答案
Dataflow 使用多台机器并行进行数据分析,因此您的 API 必须在每台机器上至少初始化一次。
事实上,Dataflow 对这些机器的生命周期没有强有力的保证,因此它们的来去可能相对频繁。
让您的作业访问外部服务并避免过多初始化 API 的一个简单方法是在您的 DoFn 中对其进行初始化:
class APICallingDoFn extends DoFn {
private ExternalServiceHandle handle = null;
@Setup
public void initializeExternalAPI() {
// ...
}
@ProcessElement
public void processElement(ProcessContext c) {
// ... process each element -- setup will have been called
}
}
您需要这样做,因为 Beam 和 Dataflow 都保证 DoFn 实例或工作线程的持续时间。
希望这有帮助。
关于google-cloud-platform - Google Dataflow 中的单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44646447/