我将如何在 Java 中为 Apache Storm 实现 HTTP Spout?

How would I implement a HTTP Spout for Apache Storm in Java?

我最近开始使用 Apache Storm,刚刚完成了我的第一个拓扑(全部在 java 中)。

作为下一步,我想将来自连接到 Raspberry Pi 的 TI SensorTag 的传感器值放入其中一个拓扑中。

我可以通过 HTTP 发送传感器数据,但我不确定如何实现接收这些请求的工作 spout。

拓扑的想法:它应该接收带有传感器值信息的 HTTP 请求,将此数据发送到拓扑中,然后使用螺栓将它们写入 file/database。

到目前为止,我在 Whosebug 上发现了一个关于 HTTP-Spout (Storm : Spout for reading data from a port) 的 post,但遗憾的是我不允许发表评论或写任何私人消息(抱歉,如果我错过了一些东西)。 我不确定这个 spout 是如何工作的,想索要一个示例代码。(基本上我想知道整个事情是如何在拓扑中设置的)。

我还尝试使用 Storm (http://storm.apache.org/releases/1.0.0/Distributed-RPC.html) 的 DRPC 功能将我的 HTTP 请求放入拓扑中,但我无法通过文档和 storm-starter-到目前为止的例子,因为我还在学习如何正确使用风暴。我对设置 drpc-server 以及如何配置传入请求的侦听感到非常困惑。

所以我想知道,如果有人也面临这个问题并且找到了解决方案或者可以给我建议,我还能尝试什么。

这样的 HTTP-Spout(据我所知是套接字连接?!)或 DRPC 服务器是否可行?

ps: 还有代码模板、其他示例或任何其他信息来源,如果能有助于理解该主题就更好了!

我会改为编写一个 servlet 来使用这些 HTTP 请求,并在收到请求后将相关信息写入 Kafka。然后,您可以使用 Kafka spout(我会编写自己的 spout,但这是一个完全不同的问题)来读取该数据并将其发送到您的拓扑中。使用 Kafka 作为中间暂存位置的主要好处是能够通过重置提交的 Kafka 偏移量来重放数据。

Storm spout 通常从数据源中提取 数据,所以您所说的并不常见。这就是为什么 Chris 提到使用像 Kafka 这样的排队产品作为 Storm 和你的 Pi 之间的缓冲区。

或许可以在风暴喷口内完成您所说的事情。问题是当您开始从一台机器扩展到多台机器时,因为您的 Pi 不知道 Storm worker 在哪些节点上 运行,因此不知道 HTTP 服务器在何处监听。

我建议从简单开始。这是我编写的一个简单的 WordCountTopology,您可以在您的计算机上本地 运行:storm-stlhug-demo

要开始,至少 运行 storm 之外的服务器:

  1. Pi 执行 HTTP post 到 HTTP 服务器
  2. HTTP 服务器将负载写入数据目录中的文件
  3. Storm Spout 轮询数据目录并处理文件