2017-03-08 76 views
3

我念叨spark及其real-time stream processing.I很困惑,如果spark可以自己从源,如叽叽喳喳文件读取流,那么我们为什么需要kafka才能将数据提供给spark?如果有人向我解释,如果我们使用sparkkafka,那将会很棒。谢谢。为什么我们需要卡夫卡到数据反馈到Apache火花

+3

你不需要*它 - 他们服务于不同的目的。卡夫卡提供了一个统一的消费源。 –

回答

3

Kafka为您的输入流提供了解耦和缓冲。

以Twitter数据为例,afaik连接到twitter api,并获得与您指定的条件匹配的连续推文。如果你现在关闭你的Spark作业一个小时,在你的服务器上进行一些调整或者推出一个新版本,那么你将错过那个小时的推文。

现在想象一下,您将Kafka放在您的Spark作业前,并且拥有一个非常简单的摄取线程,它只会连接到api并向Kafka发送推文,Spark工作可从中检索这些推文。由于Kafka坚持将所有内容都保存到光盘中,因此您可以关闭处理作业,执行维护操作,重新启动后,它们将从脱机状态恢复所有数据。此外,如果您以显着方式更改处理作业并希望重新处理上周的数据,那么如果您的连锁店中有Kafka(假设您将保留时间设置得足够高),则可以轻松地执行此操作 - 您您只需推出新工作,然后在卡夫卡中更改抵消额度,以便您的工作重新读取旧数据,并且数据存储完成后,您的新处理模型即可完成。

关于卡夫卡背后的人之一杰伊•克雷普斯(Jay Kreps)所写的总原则,有一个good article,如果您想了解更多信息,请阅读它。

+0

谢谢你的回答。对于我,这说得通。就像你说的那样,我刚刚还有一个关于从上周重新获取数据的问题。如果我们也将数据存储在HDFS中,该怎么办?在这种情况下,kafka的目的是仅在系统关闭时保存数据,对吗?我实际上是在讨论lambda架构。在服务层,我们可以使用来自hadoop的数据,而kafka将保存新的数据。这是对的吗?谢谢。 –

+0

您可以使用Spark HDFS输入流处理来自指定目录的新文件。然而,从特定的时间点控制重新处理将会困难得多 - 您必须在HDFS目录之间移动文件。使用Kafka,您可以指定从哪个位置(偏移量)开始处理你的数据。另外,如果你的Spark工作长时间运行 - 文件管家可能会成为一个问题 - 我想你可能不想在同一输入HDFS目录中拥有数百万个文件。您必须设计一个流程来删除/移动旧文件等。 – Marina

+0

取决于如何将数据放入HDFS中,您可以写入暂存目录,并从那里定期运行Oozie作业以将数据插入分区的Hive表中,这样Hive就会负责您的底层文件组织并你有一个批量重新处理数据的简单方法(假设他们有我假设的时间戳),甚至删除旧数据。 这里真的没有对错的方式,这一切都很大程度上取决于你的要求是什么:) –

0

卡夫卡将所有东西都分离开来,消费者 - 生产者不需要彼此了解。 卡夫卡提供基于主题的发布 - 子模型。

您可以从多个来源向kafka中的任何主题写入数据(消息),并且消费者(spark或其他)可以根据主题使用数据。

多个使用者可以使用同一主题的数据,因为kafka会在一段时间内存储数据。

但最后,如果您确实需要经纪人,则取决于您的使用情况。

相关问题