7

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

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

所以,我想问的是:

  • 这是实现 Lambda 架构的好方法吗?还是应该改用 Haddop 和 Storm?(我找不到有关使用 Kafka 和 Apache Spark 进行批处理、Map Reduce 的人的信息)
  • 有没有更好的方法来解决用户会话问题?

谢谢。

4

3 回答 3

5

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

关于会话问题,既然您是在批处理模式下进行的,为什么不将数据从 Kafka 摄取到 HDFS 或 Cassandra,然后在那里编写完整会话的查询呢?您可以使用 Spark Streaming 与 Kafka 的“直接连接”来执行此操作。

于 2015-07-09T21:52:19.780 回答
0

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

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

Spark Streaming 的要点是,流数据的最小延迟为 100 毫秒,对我来说还有另一个大问题,即流作业消耗的数据顺序混乱。这与潜在的落后者的结合导致完全缺乏信心,我至少以部分顺序处理数据(至少据我所知)。据说Storm解决了这些问题,但我不能保证,因为我没有使用它。

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

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

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

于 2016-03-18T15:43:17.747 回答
0

我将回应 Dean Wampler 的注释,即这是一个很好的方法,特别是如果您没有特定的要求会引导您远离 Spark 作为 Batch 和 Speed 层的首选工具。加上:

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

如果您正在寻找关于您提到的具体技术和用例的具体示例,我将向您介绍 Pluralsight 课程,您可以在其中学习并实践它使用 Spark、Kafka 和 Cassandra 应用 Lambda 架构

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

祝你好运!

于 2016-11-18T11:56:13.607 回答