【问题标题】:Using Spark to process requests使用 Spark 处理请求
【发布时间】:2016-01-26 22:29:23
【问题描述】:

我想了解以下是否是 Spark 的正确用例。

对应用程序的请求可以在消息队列中接收,也可以在包含一批请求的文件中接收。对于消息队列,目前每秒大约有 100 个请求,尽管这可能会增加。有些文件只包含几个请求,但更常见的是数百甚至数千个。

对每个请求的处理包括过滤请求、验证、查找参考数据和计算。一些计算引用了规则引擎。一旦这些完成,一条新消息将被发送到下游系统。

我们希望使用 Spark 将处理分布在多个节点上,以获得可扩展性、弹性和性能。

我设想它会像这样工作:

  1. 将一批请求作为 RDD 加载到 Spark 中(在消息队列上接收的请求可能使用 Spark Streaming)。
  2. 将为过滤、验证、参考数据查找和数据计算编写单独的 Scala 函数。
  3. 第一个函数将被传递给 RDD,并返回一个新的 RDD。
  4. 下一个函数将针对前一个函数的 RDD 输出运行。
  5. 所有函数完成后,将对最终 RDD 运行 for 循环理解,以将每个修改后的请求发送到下游系统。

以上听起来是否正确,或者这不是使用 Spark 的正确方法?

谢谢

【问题讨论】:

  • 我做了一些类似的事情。主要是,我们开发了一个网络爬虫,但我们使用了 Scala Akka 框架。它是基于参与者的框架,提供开箱即用的并发性和可扩展性。系统顶部有 MainActor,它触发整个过程。创建 MasterActor,后者反过来为工人提供单元流程。单元过程是处理单个 URL,清除非英语数据,并存储在 Cassandra 中。输出是一个 Future 对象,上面有一些回调。一般来说,参与者只发送/接收不可变的消息。您的系统看起来像是基于演员的。
  • 非常感谢,但我们正在专门考虑使用 Spark,并想知道它是否适合满足要求。 Spark 提供了比 Akka 更高层次的抽象,
  • 我知道,但也可以同时使用它们。

标签: apache-spark spark-streaming


【解决方案1】:

我们在一个小型物联网项目上做了类似的工作。我们测试了在 3 个节点上每秒接收和处理大约 50K mqtt 消息,这很容易。我们的处理包括解析每条 JSON 消息、对创建的对象进行一些操作以及将所有记录保存到时间序列数据库。 我们将批处理时间定义为 1 秒,处理时间约为 300 毫秒,RAM ~100 sKB。 流媒体的一些担忧。确保您的下游系统是异步的,这样您就不会遇到内存问题。确实,火花支持背压,但你需要让它发生。另一件事,尝试将状态保持在最低限度。更具体地说,您不应该保持任何随着输入的增长而线性增长的状态。这对您的系统可扩展性极为重要。

最让我印象深刻的是你可以用 spark 轻松扩展。随着我们添加的每个节点,我们可以处理的消息频率线性增长。

我希望这会有所帮助。 祝你好运

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-24
    相关资源
    最近更新 更多