实时流作业的架构

Architecture of a real time streaming job

我正在使用 Spark Streaming 开发流应用程序,我想将我的数据索引到弹性搜索中。

我的分析: 我可以直接将数据从 Spark 推送到弹性搜索,但我觉得在这种情况下,这两个组件将紧密耦合。

如果这是一个 spark 核心作业,我们可以将该输出写入 HDFS 并使用 logstash 从 HDFS 获取数据并将其推送到弹性搜索。

根据我的解决方案: 我可以将数据从 Spark Streaming 推送到 Kafka,然后我们可以使用 Logstash 从 Kafka 读取数据并推送到 ES。

求推荐。

首先,很高兴您考虑了不同的方法。

在做出好的设计之前,您应该问几个问题:

  1. 时间表? Spark -> ES 轻而易举,如果您开始使用 PoC,建议使用它。
  2. 操作带宽?引入更多组件将增加操作问题。根据我的个人经验,确保您的 Spark Streaming 工作稳定本身就是一项耗时的工作。您还想添加 Kafka,因此您需要花费更多时间来尝试正确进行监控和其他操作问题。
  3. 规模?如果它需要更大的规模,拥有一个持久的消息总线可能能够帮助吸收背压并仍然很好地扩展。

如果我有时间处理大规模问题,Spark streaming -> Kafka -> ES 看起来是最好的选择。这样当你的 ES 集群不稳定时,你仍然可以选择 Kafka 重放。

我对 Kafka -> HDFS -> ES 有点模糊,因为在 Source 和 Sink 之间添加批处理层可能会对性能产生影响。老实说,我不知道 HDFS 的 logstash 有多好,所以不能真正发表评论。

紧耦合是一个经常被讨论的话题。有人以可重用性问题为由反对它,但也有人赞成它,因为有时它可以创建更简单的设计并使整个系统更容易推理。还要谈谈过早的优化 :) 我们已经成功地使用 Spark -> ES 直接在中等规模的数据流入。所以不要低估像这样更简单的设计的力量:)