Lambda 架构与 Apache Spark

Lambda Architecture with Apache Spark

我正在尝试使用以下工具实现 Lambda 架构:Apache Kafka 用于接收所有数据点,Spark 用于批处理(大数据),Spark Streaming 用于实时(快速数据)和 Cassandra 用于存储结果。

此外,我收到的所有数据点都与用户会话相关,因此,对于批处理,我只对在会话结束后处理数据点感兴趣。所以,因为我使用的是 Kafka,解决这个问题的唯一方法(假设所有数据点都存储在同一个主题中)是批处理获取主题中的所有消息,然后忽略那些对应于会话的消息还没有完成。

那么,我想问的是:

谢谢。

这是一个很好的方法。将 Spark 用于 speedbatch 层可以让您一次编写逻辑并在两个上下文中使用它。

关于您的会话问题,既然您是在批处理模式下执行此操作,为什么不直接将数据从 Kafka 提取到 HDFS 或 Cassandra 中,然后在其中编写完整会话的查询?您可以使用 Spark Streaming 的 "direct connection" 到 Kafka 来执行此操作。

我目前正在研究相同的实现。我使用 Kafka、HBase、Spark 和 Spark Streaming。

使用这些技术时需要考虑很多事情,可能没有简单的答案。

Spark Streaming 的要点是流数据的最小延迟为 100 毫秒,还有一个让我很头疼的问题,即流作业消耗的数据顺序混乱。结合潜在的散乱者会导致我完全不相信我正在至少按部分顺序处理数据(至少据我所知)。 Storm应该可以解决这些问题,但我没用过,不敢保证。

在批处理层方面,Spark 肯定比 MapReduce 更好,因为它更快、更灵活。

然后是批处理和速度之间的同步问题,因为要知道批处理作业的数据停止的地方速度会继续。我通过让我的速度层也成为在对其进行处理之前将数据放入 HBase 的层来解决这个问题。

这只是一堆随机点,我希望其中的一些帮助。

我赞同 Dean Wampler 的观点,这是一个很好的方法,特别是如果您没有特定的要求会阻止您将 Spark 作为批处理和速度层的首选工具。添加:

假设您正在处理的内容(归约)是一个关联操作,您不必在能够处理主题之前重新使用主题会话的所有数据。即使它不是关联的(如唯一用户),您仍然可以使用可以像 Hyper Log Log 一样迭代计算的高度准确的估计。您可能会使用某种有状态聚合。在 Spark 中,您可以使用 updateStateByKey 或最好使用 mapWithState 函数来做到这一点。

如果您正在寻找有关您提到的具体技术和用例的具体示例,我会向您推荐 Pluralsight 课程,您可以在其中全面了解并练习 Applying the Lambda Architecture with Spark, Kafka, and Cassandra

我还会注意到,如果您正在做的事情相当简单,并且因为您已经在使用 Kafka,您可能需要考虑将 Kafka Connect 用于 HDFS 持久性,将 Kafka Streams 用于流式处理。您甚至可以使用 Kafka Streams 将数据直接流回 Kafka,并使用 Kafka Connect 将其通过管道传输到多个目的地,例如 Cassandra 和 ElasticSearch。我提到 Kafka Streams 是因为它还具有在内存中保存一些状态并执行简单流操作的能力。

祝你好运!