将 Apache Beam 的 PCollection 对象收集到驱动程序的内存中
Collecting the Apache Beam's PCollection objects into driver's memory
是否可以将 Apache Beam 中 PCollection 中的对象收集到驱动程序的内存中?类似于:
PCollection<String> distributedWords = ...
List<String> localWords = distributedWords.collect();
我这里借鉴了Apache Spark的方法,但我想知道Apache Beam是否也有类似的功能!?
不直接。管道可以将输出写入接收器(例如 GCS 存储桶或 BigQuery table),并在需要时通过 PubSub 等方式向驱动程序发送进度信号。然后驱动程序从公共源中读取保存的数据。这种方法适用于所有 Beam 运行 用户。
对于特定情况可能还有其他解决方法。例如,DirectRunner 是一个本地内存中执行引擎,它 运行 以顺序方式在本地处理您的管道。它主要用于测试,如果它适合您的用例,您可以利用它,例如通过将处理后的数据存储在共享的内存存储中,驱动程序和管道执行逻辑都可以访问该存储,例如参见 TestTable。这不适用于其他 运行 用户。
一般来说,Pipeline 执行可以并行发生,具体如何发生由 运行ner(例如 Flink、Dataflow 或 Spark)控制。 Beam 管道只是对您应用于数据以及数据源和接收器的转换的定义。你的驱动程序本身不读取或收集数据,也不直接与执行节点通信,它基本上只将管道定义发送到 运行ner,然后决定如何执行它,可能将它传播到机器舰队(或使用其他执行原语 运行 它)。然后每个执行节点可以通过从输入源中提取数据、转换然后将其写入输出来独立处理数据。节点一般不知道驱动程序,它只知道如何执行管道定义。执行环境/运行ners 可能非常不同,目前没有要求 运行ners 实现这种收集机制。参见 https://beam.apache.org/documentation/execution-model/
是否可以将 Apache Beam 中 PCollection 中的对象收集到驱动程序的内存中?类似于:
PCollection<String> distributedWords = ...
List<String> localWords = distributedWords.collect();
我这里借鉴了Apache Spark的方法,但我想知道Apache Beam是否也有类似的功能!?
不直接。管道可以将输出写入接收器(例如 GCS 存储桶或 BigQuery table),并在需要时通过 PubSub 等方式向驱动程序发送进度信号。然后驱动程序从公共源中读取保存的数据。这种方法适用于所有 Beam 运行 用户。
对于特定情况可能还有其他解决方法。例如,DirectRunner 是一个本地内存中执行引擎,它 运行 以顺序方式在本地处理您的管道。它主要用于测试,如果它适合您的用例,您可以利用它,例如通过将处理后的数据存储在共享的内存存储中,驱动程序和管道执行逻辑都可以访问该存储,例如参见 TestTable。这不适用于其他 运行 用户。
一般来说,Pipeline 执行可以并行发生,具体如何发生由 运行ner(例如 Flink、Dataflow 或 Spark)控制。 Beam 管道只是对您应用于数据以及数据源和接收器的转换的定义。你的驱动程序本身不读取或收集数据,也不直接与执行节点通信,它基本上只将管道定义发送到 运行ner,然后决定如何执行它,可能将它传播到机器舰队(或使用其他执行原语 运行 它)。然后每个执行节点可以通过从输入源中提取数据、转换然后将其写入输出来独立处理数据。节点一般不知道驱动程序,它只知道如何执行管道定义。执行环境/运行ners 可能非常不同,目前没有要求 运行ners 实现这种收集机制。参见 https://beam.apache.org/documentation/execution-model/