为啥我们需要 kafka 向 apache spark 提供数据
Posted
技术标签:
【中文标题】为啥我们需要 kafka 向 apache spark 提供数据【英文标题】:Why do we need kafka to feed data to apache spark为什么我们需要 kafka 向 apache spark 提供数据 【发布时间】:2017-07-29 03:20:57 【问题描述】:我正在阅读有关 spark
及其 real-time stream
处理的信息。我很困惑如果 spark
本身可以从 twitter 或 file 等源读取流,那么为什么我们需要kafka
将数据提供给spark
?如果有人向我解释如果我们将spark
与kafka
一起使用会获得什么优势,那就太好了。谢谢。
【问题讨论】:
您不需要它——它们有不同的用途。 Kafka 提供了一个统一的消费源。 【参考方案1】:Kafka 为您的输入流提供解耦和缓冲功能。
以 Twitter 数据为例,afaik 您连接到 twitter api 并获得符合您指定条件的持续推文流。如果您现在将 Spark 作业关闭一个小时以对服务器进行一些维护或推出新版本,那么您将错过该小时的推文。
现在想象一下,您将 Kafka 放在 Spark 作业的前面,并有一个非常简单的摄取线程,它除了连接到 api 并将推文写入 Kafka,Spark 作业从中检索它们。由于 Kafka 将所有内容都保存在磁盘上,因此您可以关闭处理作业、执行维护,当它们重新启动时,它们将检索离线时的所有数据。
此外,如果您对处理工作进行了重大更改并希望重新处理上周的数据,如果您的链中有 Kafka(前提是您将保留时间设置得足够高),那么您可以轻松做到这一点 - 您d 只需推出您的新作业并更改 Kafka 中的偏移量,以便您的作业重新读取旧数据,一旦完成,您的数据存储就会与您的新处理模型保持同步。
有一个good article 是由 Kafka 背后的人 Jay Kreps 写的关于一般原则的,如果您想了解更多信息,请阅读它。
【讨论】:
感谢您的回答。对于我,这说得通。正如你所说,我还有一个关于重现上周数据的问题。如果我们也将数据存储在 HDFS 中会怎样。在那种情况下,kafka 的目的是仅在系统关闭时保存数据,对吗?我实际上是在讨论 lambda 架构的意义。在服务层,我们可以使用来自 hadoop 的数据,而 kafka 将保存新数据。这是正确的吗?谢谢。 您可以将 Spark 流与 HDFS 输入一起使用,处理来自指定目录的新文件。但是,从特定时间点控制重新处理将更加困难 - 您必须在 HDFS 目录之间移动文件......使用 Kafka,您可以指定您可以从哪个位置(偏移量)开始处理您的数据。此外,如果您的 Spark 作业长时间运行 - 文件管理可能会成为一个问题 - 我假设您可能不希望在同一个输入 HDFS 目录中拥有数百万个文件。您必须设计一个过程来删除/移动旧文件等。 取决于您如何将数据放入 HDFS,您可以写入暂存目录并从那里定期运行 Oozie 作业以将数据插入分区的 Hive 表中,Hive 将采用这种方式照顾你的底层文件组织,你有一个简单的方法来批量重新处理数据(假设它们有一个时间戳,我假设),甚至删除旧数据。这里真的没有对错之分,这在很大程度上取决于你的要求是什么:) 您好,感谢您的解释。但是,我有一个问题。如果你需要维护kafka本身,它是如何工作的?【参考方案2】:Kafka 解耦了一切,消费者和生产者不需要相互了解。 Kafka 提供基于主题的 pub-sub 模型。
您可以从多个来源将数据(消息)写入 kafka 中的任何主题,消费者(spark 或任何东西)可以根据主题消费数据。
多个消费者可以消费来自同一主题的数据,因为kafka存储数据一段时间。
但最后,如果您真的需要代理,这取决于您的用例。
【讨论】:
以上是关于为啥我们需要 kafka 向 apache spark 提供数据的主要内容,如果未能解决你的问题,请参考以下文章