将Apache Beam的PCollection对象收集到驱动程序的内存中

时间:2018-11-06 21:55:01

标签: java apache-beam

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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

通常,管道执行可以并行发生,其执行方式的具体情况由运行程序(例如Flink,Dataflow或Spark)控制。梁管道只是对要应用于数据以及数据源和接收器的转换的定义。您的驱动程序本身不会读取或收集数据,也不会直接与执行节点通信,它基本上只会将管道定义发送给运行程序,然后由运行程序决定如何执行它,并可能将其分散到整个机器中(或使用其他执行原语来运行它)。然后,每个执行节点可以通过从输入源中提取数据,进行转换然后将其写入输出中来独立处理数据。通常,该节点不了解驱动程序,仅知道如何执行管道定义。执行环境/运行程序可能非常不同,并且当前没有要求运行程序实现这种收集机制。参见https://beam.apache.org/documentation/execution-model/