问题描述
我正在运行自己的GRPC服务器,以收集来自各种数据源的事件。服务器是用Go开发的,所有事件源都以预定义格式将事件发送为protobuf消息。
我要做的是使用内存中的Apache Beam处理所有这些事件。
我浏览了Apache Beam的文档,却找不到一个执行我想要的操作的示例。我不会使用Kafka,Flink或任何其他流媒体平台,只处理内存中的消息并输出结果。
有人可以告诉我开始编写简单流处理应用程序的正确方法的方向吗?
解决方法
好吧,首先,Apache Beam不是数据处理引擎,它是一个SDK,可让您创建统一的管道并在不同的引擎(例如Spark,Flink,Google Dataflow等)上运行它。一个Beam管道,您需要利用任何受支持的数据处理引擎或使用DirectRunner
,它将在本地运行您的管道,但是(!)它有很多限制,并且主要是出于测试目的而开发的。
与Beam中的每个管道一样,必须有一个源转换(有界或无界),它将从您的数据源读取数据。我可以猜测,在您的情况下,应该是您的GRPC服务器应该重新传输收集的事件。因此,对于源转换,您可以使用已经实现的Beam IO transforms(IO连接器),也可以创建自己的,因为在Beam中现在没有GrpcIO或类似的东西。
关于处理内存中的数据,我不确定我是否完全理解您的意思。这最终将取决于所使用的数据处理引擎,因为最后,在实际运行之前,您的Beam管道将转换为例如Spark或Flink管道(如果您相应地使用SparkRunner
或FlinkRunner
)。然后数据处理引擎将管理管道工作流程。大多数现代引擎都尽力将所有已处理的数据保留在内存中,并仅在万不得已时才将其刷新到磁盘上。