首页 > 解决方案 > 将 Apache Beam 的 PCollection 对象收集到驱动程序的内存中

问题描述

是否可以将 Apache Beam 中的PCollection中的对象收集到驱动程序的内存中?就像是:

PCollection<String> distributedWords = ...
List<String> localWords = distributedWords.collect();

我从 Apache Spark 借用了这里的方法,但我想知道 Apache Beam 是否也有类似的功能!?

标签: javaapache-beam

解决方案


不是直接的。管道可以将输出写入接收器(例如 GCS 存储桶或 BigQuery 表),并在需要时通过 PubSub 之类的方式向驱动程序发送进度信号。然后驱动程序从公共源中读取保存的数据。这种方法适用于所有 Beam runner。

对于特定情况,可能还有其他解决方法。例如,DirectRunner 是一个本地内存执行引擎,它以顺序方式在本地进程中运行您的管道。它主要用于测试,如果它适合您的用例,您可以利用它,例如,将处理后的数据存储在共享的内存存储中,驱动程序和管道执行逻辑都可以访问该存储,例如参见TestTable . 这在其他跑步者中不起作用。

一般来说,Pipeline 执行可以并行发生,具体如何发生由运行程序(例如 Flink、Dataflow 或 Spark)控制。Beam 管道只是对您应用于数据以及数据源和接收器的转换的定义。您的驱动程序本身不会读取或收集数据,也不会直接与执行节点通信,它基本上只会将管道定义发送给运行器,然后运行器决定如何执行它,可能会将其传播到整个机器队列(或使用其他执行原语来运行它)。然后每个执行节点可以通过从输入源中提取数据,转换然后将其写入输出来独立处理数据。节点一般不知道驱动程序,它只知道如何执行管道定义。执行环境/运行器可能非常不同,目前运行器不需要实现这种收集机制。看https://beam.apache.org/documentation/execution-model/


推荐阅读