【问题标题】:Parallelism behaviour of stream processing engines流处理引擎的并行行为
【发布时间】:2014-10-14 20:15:03
【问题描述】:

我一直在学习 Storm 和 Samza,以了解流处理引擎的工作原理,并意识到它们都是独立的应用程序,为了处理事件,我需要将其添加到也连接到流处理的队列中引擎。这意味着我需要将事件添加到队列(这也是一个独立的应用程序,比如说 Kafka),Storm 将从队列中选择事件并在工作进程中处理它。如果我有多个螺栓,每个螺栓将由不同的工作进程处理。 (这是我不太明白的事情之一,我看到一家公司在生产中使用了 20 多个螺栓,并且每个事件在某个路径的螺栓之间传递)

但是我真的不明白为什么我需要如此复杂的系统。这些进程涉及太多的 IO 操作(我的程序 -> 队列 -> 风暴 ->> 螺栓),这使得控制和调试它们变得更加困难。

相反,如果我从 Web 服务器收集数据,为什么不直接使用同一个节点进行事件处理?这些操作已经通过我用于 Web 服务器的负载均衡器分布在节点上。我可以在相同的 JVM 实例上创建执行器,并将事件从 Web 服务器异步发送到执行器,而不涉及任何额外的 IO 请求。我还可以观察 Web 服务器中的执行程序,并确保执行程序处理了事件(至少一次或完全一次处理保证)。这样,管理我的应用程序会容易得多,并且由于不需要太多的 IO 操作,因此与通过网络将数据发送到另一个节点的其他方式相比,它会更快(这也是不可靠的)并在该节点中处理它。

很可能我在这里遗漏了一些东西,因为我知道很多公司都在积极使用 Storm,而且我认识的很多人推荐使用 Storm 或其他流处理引擎进行实时事件处理,但我就是不明白。

【问题讨论】:

  • 很抱歉,我无法从您的描述中找出问题所在。你能重新制定吗?很难按原样为您提供帮助。
  • @zenbeni 这就是人们通常使用storm的方式:i.imgur.com/qejN8aJ.jpg,这就是我建议的方式:i.imgur.com/VSRtYFk.jpg。你说得对,这篇文章有点复杂,但主要问题是人们为什么需要使用如此复杂的系统。

标签: distributed-computing apache-storm apache-kafka distributed-system stream-processing


【解决方案1】:

我的理解是,使用 Storm 这样的框架的目标是从应用程序/Web 服务器中卸载繁重的处理(无论是 cpu 绑定、I/O 绑定还是两者兼有)并保持它们的响应速度。

考虑到每个应用程序服务器可能必须处理大量并发请求,而不是所有请求都与流处理有关。如果应用服务器已经在处理大量的事件,那么它可能会成为较轻请求的瓶颈,因为服务器资源(例如 CPU 使用率、内存、磁盘争用等)已经与较重的处理请求相关联。

如果您需要面对的实际负载不是那么重,或者如果它可以通过添加应用服务器实例来简单地处理,那么复杂化您的架构/拓扑当然没有意义,事实上这可能让整个事情慢下来。这实际上取决于您的性能和负载要求,以及您可以投入多少(虚拟)硬件来解决问题。像往常一样,根据您的负载要求进行基准测试将有助于决定走哪条路。

【讨论】:

    【解决方案2】:

    您认为通过网络发送数据将消耗总处理时间的更多时间是正确的。 但是,创建这些框架(Storm、Spark、Samza、Flink)是为了处理大量可能无法容纳在一台计算机的内存中的数据。因此,如果我们使用多台计算机来处理数据,我们就可以实现并行性。 并且,根据您关于网络延迟的问题。是的!这是一个需要考虑的权衡。开发人员必须知道他们正在实施要在并行框架中部署的程序。他们构建应用程序的方式也会影响通过网络传输的数据量。

    【讨论】:

      猜你喜欢
      • 2013-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多