我尝试使用以下工具实现lambda体系结构:apache kafka接收所有数据点,spark用于批处理(大数据),spark streaming用于实时(快速数据),cassandra用于存储结果。
而且,我收到的所有数据点都与用户会话相关,因此,对于批处理,我只想在会话完成后处理数据点。因此,由于我使用kafka,解决这个问题的唯一方法(假设所有数据点都存储在同一个主题中)是批处理获取主题中的所有消息,然后忽略那些与尚未完成的会话相对应的消息。
所以,我想问的是:
这是实现lambda体系结构的好方法吗?还是应该用haddop和storm来代替(我找不到有关使用kafka和apachespark进行批处理的人的信息(map reduce)
有没有更好的方法来解决用户会话问题?
谢谢。
3条答案
按热度按时间2ledvvac1#
我将附和dean wampler的观点,即这是一个很好的方法,特别是如果您没有特定的要求,可以将spark作为批处理层和速度层的首选工具。添加:
在处理某个主题之前,您不必重新使用该主题中某个会话的所有数据,前提是您对该主题所做的(缩减)是一个关联操作。即使它不是关联的(像唯一的用户),你仍然可以用一个可以像hyperlog一样迭代计算的高度精确的估计值。您可能会使用某种状态聚合。在spark中,您可以使用updatestatebykey,或者最好使用mapwithstate函数。
如果您正在寻找关于您提到的具体技术和用例的具体示例,我将向您介绍pluralsight课程,在该课程中,您可以学习所有关于它的知识,并使用spark、kafka和cassandra的lambda体系结构进行实践
我还将注意到,如果您所做的是相当直接的,并且因为您已经在使用kafka,那么您可能需要考虑kafka connect用于hdfs持久性,kafka streams用于流式传输。您甚至可以使用kafka streams将数据直接流回到kafka,并使用kafka connect将数据传输到多个目的地,如cassandra和elasticsearch。我提到kafka流是因为它还能够在内存中保存一些状态并执行简单的流操作。
祝你好运!
ki0zmccv2#
我现在也在做同样的工作。我使用Kafka,hbase,spark和spark流媒体。
在使用这些技术时需要考虑很多事情,可能没有简单的答案。
spark streaming的要点是,流数据的最小延迟为100毫秒,还有一个让我很苦恼的问题,流作业消耗的数据顺序混乱。这些潜在的散乱者的组合导致我完全没有信心,我至少是按部分顺序处理数据(至少据我所知)。storm应该可以解决这些问题,但我不能保证,因为我还没用过它。
在批处理层方面,spark肯定比mapreduce更好,因为它更快、更灵活。
然后是批处理和速度之间的同步问题,即知道批处理作业的数据在哪里停止,速度就在哪里继续。我通过让我的速度层在对数据进行处理之前将数据放入hbase来解决这个问题。
这只是一堆随机点,我希望他们中的一些帮助。
mqxuamgl3#
这是个好办法。对速度层和批处理层都使用spark可以让您编写一次逻辑,并在两种上下文中使用它。
关于会话问题,既然您是在批处理模式下进行的,为什么不直接将kafka的数据摄取到hdfs或cassandra中,然后在那里编写完整会话的查询呢?你可以使用spark流媒体的“直接连接”Kafka来实现这一点。