使用Apache Spark的Lambda架构

7
我正在尝试使用以下工具实现Lambda体系结构:Apache Kafka接收所有数据点,Spark进行批处理(大数据),Spark Streaming用于实时处理(快速数据),Cassandra用于存储结果。
此外,我接收到的所有数据点都与用户会话相关,因此,对于批处理,我只需要在会话完成后处理数据点。因此,由于我使用Kafka,解决此问题的唯一方法(假设所有数据点都存储在同一主题中)是让批处理获取主题中的所有消息,然后忽略那些对应尚未结束的会话的消息。
所以,我想问的是:
  • 这是实现Lambda体系结构的好方法吗?还是应该使用Hadoop和Storm?(我找不到有关人们使用Kafka和Apache Spark进行批处理,Map Reduce的信息)
  • 是否有更好的方法来解决用户会话问题?
谢谢。
3个回答

5
这是一个很好的方法。在速度和批处理层面上都使用Spark,让您只需编写一次逻辑,并在两个上下文中使用它。
关于您的会话问题,既然您是在批处理模式下进行操作,为什么不将数据从Kafka输入到HDFS或Cassandra中,然后在那里编写完整会话的查询?您可以使用Spark Streaming的“直接连接”到Kafka来实现此目的。

0

我赞同Dean Wampler的观点,特别是如果您没有特定的要求会让您远离Spark作为批处理和速度层的首选工具。此外:

假设您正在使用的是可关联操作(如缩减),则在会话中处理数据之前,您不必从主题重新消耗所有数据。即使它不是可关联的(例如唯一用户),您仍然可以使用可以通过Hyper Log Log迭代计算的高度准确的估计值。您可能会使用某种有状态聚合。在Spark中,您可以使用updateStateByKey或更好地使用mapWithState函数来实现。

如果您正在寻找有关您提到的技术和用例的具体示例,我将指向Pluralsight课程,您可以在其中学习并练习{{link1:使用Spark,Kafka和Cassandra应用Lambda架构}}。

我还要注意,如果你正在做的事情相当简单,并且因为你已经在使用Kafka,你可能想考虑使用Kafka Connect进行HDFS持久化和Kafka Streams进行流处理。你甚至可以使用Kafka Streams将数据直接流回Kafka,并使用Kafka Connect将其导出到多个目的地,如Cassandra和ElasticSearch。我提到Kafka Streams是因为它还具有在内存中保存一些状态并执行简单流操作的能力。
祝你好运!

0

我目前正在做同样的实现。我使用Kafka、HBase、Spark和Spark Streaming。

使用这些技术时需要考虑很多问题,也许没有简单的答案。

对于Spark Streaming来说,主要的问题是你可以获得至少100毫秒的最小延迟流数据,以及另一个大问题,即流作业所消耗的数据的顺序可能会混乱。与潜在的stragglers组合在一起,导致我完全不确定我是否按照至少部分顺序处理数据(据我所知,至少如此)。据说Storm可以解决这些问题,但我不能保证,因为我没有使用过它。

在批量层面上,Spark绝对比MapReduce更好,因为它更快,更灵活。

然后就是在Batch和Speed之间进行同步的问题,即了解批作业的数据何时停止,速度何时继续。我通过让我的速度层也将数据放入HBase来解决这个问题,然后再对其进行处理。

这只是一堆随机的要点,希望其中一些能够有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接