java - 将 Apache Beam 的 PCollection 对象收集到驱动程序的内存中
问题描述
是否可以将 Apache Beam 中的PCollection中的对象收集到驱动程序的内存中?就像是:
PCollection<String> distributedWords = ...
List<String> localWords = distributedWords.collect();
我从 Apache Spark 借用了这里的方法,但我想知道 Apache Beam 是否也有类似的功能!?
解决方案
不是直接的。管道可以将输出写入接收器(例如 GCS 存储桶或 BigQuery 表),并在需要时通过 PubSub 之类的方式向驱动程序发送进度信号。然后驱动程序从公共源中读取保存的数据。这种方法适用于所有 Beam runner。
对于特定情况,可能还有其他解决方法。例如,DirectRunner 是一个本地内存执行引擎,它以顺序方式在本地进程中运行您的管道。它主要用于测试,如果它适合您的用例,您可以利用它,例如,将处理后的数据存储在共享的内存存储中,驱动程序和管道执行逻辑都可以访问该存储,例如参见TestTable . 这在其他跑步者中不起作用。
一般来说,Pipeline 执行可以并行发生,具体如何发生由运行程序(例如 Flink、Dataflow 或 Spark)控制。Beam 管道只是对您应用于数据以及数据源和接收器的转换的定义。您的驱动程序本身不会读取或收集数据,也不会直接与执行节点通信,它基本上只会将管道定义发送给运行器,然后运行器决定如何执行它,可能会将其传播到整个机器队列(或使用其他执行原语来运行它)。然后每个执行节点可以通过从输入源中提取数据,转换然后将其写入输出来独立处理数据。节点一般不知道驱动程序,它只知道如何执行管道定义。执行环境/运行器可能非常不同,目前运行器不需要实现这种收集机制。看https://beam.apache.org/documentation/execution-model/
推荐阅读
- php - PHP 8 调用未定义函数 Illuminate\Encryption\openssl_cipher_iv_length()
- gtk - 当我使用 Glade 运行 GTK 时,我收到以下警告 - 找不到信号处理程序“on_window_main_destory”。你用 -rdnamic 编译了吗?
- python - 密钥 - 设置环境变量 PowerShell (Windows)
- typescript - 绘制分类数据后更新 ChartJS 填充
- spring - 如何将 spring boot oauth2 与自定义用户帐户结合使用?
- react-hooks - 无法列出数组中的键
- mysql - 如何使表格列成为其他两列的平均值
- sql - SQL中的递归查找朋友的朋友
- ios - Xcode 抱怨:“LLDB 没有提供错误字符串。”
- android - 尝试在空对象上调用虚拟方法 com.google.firebase.remoteconfig com.google.firebase.remoteconfig.RemoteConfigComponent.getDefault()