【问题标题】:Lambda Architecture with Apache Spark使用 Apache Spark 的 Lambda 架构
【发布时间】:2015-09-28 07:04:36
【问题描述】:
我正在尝试使用以下工具实施 Lambda 架构:Apache Kafka 接收所有数据点,Spark 用于批处理(大数据),Spark Streaming 实时(快速数据)和 Cassandra 存储结果。
此外,我收到的所有数据点都与用户会话相关,因此,对于批处理,我只对会话完成后处理数据点感兴趣。所以,由于我使用的是 Kafka,解决这个问题的唯一方法(假设所有数据点都存储在同一个主题中)是让批处理获取主题中的所有消息,然后忽略那些对应于会话的那些还没写完。
所以,我想问的是:
- 这是实现 Lambda 架构的好方法吗?还是应该改用 Haddop 和 Storm? (我找不到有关使用 Kafka 和 Apache Spark 进行批处理、Map Reduce 的人的信息)
- 是否有更好的方法来解决用户会话问题?
谢谢。
【问题讨论】:
标签:
cassandra
apache-spark
apache-kafka
lambda-architecture
【解决方案1】:
这是一个很好的方法。将 Spark 用于 speed 和 batch 层可以让您编写一次逻辑并在两种上下文中使用它。
关于您的会话问题,既然您是在批处理模式下进行的,为什么不直接将数据从 Kafka 摄取到 HDFS 或 Cassandra 中,然后在那里编写完整会话的查询呢?您可以使用 Spark Streaming 与 Kafka 的“直接连接”来执行此操作。
【解决方案2】:
我目前正在执行相同的实现。我使用 Kafka、HBase、Spark 和 Spark Streaming。
在使用这些技术时需要考虑很多事情,而且可能没有简单的答案。
Spark Streaming 的要点是,流数据的最小延迟为 100 毫秒,以及对我来说的另一个大问题,即流作业消耗的数据顺序混乱。这与潜在的落后者的结合导致完全缺乏信心,我至少以部分顺序处理数据(至少据我所知)。 Storm据说可以解决这些问题,但我没用过,所以不能保证。
在批处理层方面,Spark 绝对比 MapReduce 更好,因为它更快、更灵活。
然后是批处理和速度之间的同步问题,因为要知道批处理作业的数据在哪里停止,速度会继续。我通过让我的速度层也是在对其进行处理之前将数据放入 HBase 来解决这个问题。
这只是一堆随机点,希望对大家有所帮助。
【解决方案3】:
我将回应 Dean Wampler 的注释,即这是一个很好的方法,尤其是如果您没有特定的要求会引导您远离 Spark 作为 Batch 和 Speed 层的首选工具。添加:
假设您正在对它执行的操作(您的归约)是一个关联操作,那么您不必重新使用某个主题的会话的所有数据,然后就可以对其进行处理。即使它不是关联的(如唯一用户),您仍然可以使用可以像 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 是因为它还能够在内存中保存一些状态并执行简单的流操作。
祝你好运!