9

我正在做一个 POC,用于在数据流上运行机器学习算法。
我最初的想法是获取数据,使用

Spark Streaming --> 从多个表中聚合数据 --> 在数据流上运行 MLLib --> 生成输出。

但我遇到了 KStreams。现在我很困惑!

问题:
1. Spark Streaming 和 Kafka Streaming 有什么区别?
2. 我怎样才能结合 KStreams + Spark Streaming + 机器学习?
3.我的想法是连续训练测试数据而不是批量训练。

4

4 回答 4

20

首先,术语“Confluent 的 Kafka Streaming”在技术上是不正确的。

  1. 它被称为Kafka 的 Streams API(又名Kafka Streams
  2. 它是 Apache Kafka 的一部分,因此归Apache Software Foundation(而不是 Confluent) “拥有”
  3. Confluent Open SourceConfluent Enterprise —— Confluent提供的两个产品都利用了 Apache Kafka(因此也利用了 Kafka Streams)

但是,Confluent 为 Apache Kafka 贡献了很多代码,包括 Kafka Streams。

关于差异(我只强调一些主要差异并参考 Internet 和文档了解更多详细信息: http: //docs.confluent.io/current/streams/index.htmlhttp://spark.apache.org/streaming / )

火花流:

  • 微批处理(没有真正的逐记录流处理)
  • 无亚秒级延迟
  • 有限的窗口操作
  • 没有事件时间处理
  • 处理框架(难以操作和部署)
  • Apache Spark 的一部分——一个数据处理框架
  • 一次处理

卡夫卡流

  • 逐记录流处理
  • 毫秒延迟
  • 丰富的窗口操作
  • 流/表二元性
  • 事件时间、摄取时间和处理时间语义
  • Java 库(易于运行和部署——它只是一个 Java 应用程序)
  • Apache Kafka 的一部分——一个流处理平台(即,它同时提供存储和处理)
  • 至少一次处理(恰好一次处理是 WIP;参见KIP-98KIP-129
  • 弹性的,即动态可伸缩的

因此,没有理由将两者“结婚”——这是一个选择要使用哪一个的问题。

我个人的看法是,Spark 不是流处理的好解决方案。如果您想使用 Kafka Streams 之类的库或 Apache Flink、Apache Storm 或 Apache Apex 之类的框架(这些都是流处理的好选择)取决于您的用例(也可能是个人喜好)并且无法在 SO 上回答.

Kafka Streams 的一个主要区别在于,它是一个库,不需要处理集群。而且因为它是 Apache Kafka 的一部分,并且如果您已经安装了 Apache Kafka,这可能会简化您的整体部署,因为您不需要运行额外的处理集群。

于 2016-12-14T02:29:34.333 回答
4

我最近在一个关于这个话题的会议上发表了演讲。

Apache Kafka Streams 或 Spark Streaming 通常用于通过流处理(在移动时处理数据)将机器学习模型实时应用于新事件。马蒂亚斯的回答已经讨论了他们的差异。

另一方面,您首先使用诸如 Apache Spark MLlib(或 H2O.ai 或 XYZ)之类的东西来首先使用历史数据集构建分析模型。

Kafka Streams 也可以用于模型的在线训练。不过,我认为在线培训有各种注意事项。

所有这些都在我的幻灯片“ Apache Kafka Streams and Machine Learning / Deep Learning for Real Time Stream Processing ”中有更详细的讨论。

于 2017-05-24T05:53:14.213 回答
2

从流处理的角度来看,Spark StreamingKStreams 合二为一。

Spark 和 KStreams

在这里强调了 Spark Streaming 和 KStreams 的显着优势,以便简短回答。

Spark Streaming 相对于 KStreams 的优势:

  1. 易于将 Spark ML 模型和图形计算集成到同一个应用程序中,而无需在应用程序之外写入数据,这意味着您将比再次编写 kafka 和处理快得多。
  2. 将文件系统和其他非 kafka 源等非流源与同一应用程序中的其他流源连接起来。
  3. 带有 Schema 的消息可以使用最喜欢的 SQL ( StructuredStreaming ) 轻松处理。
  4. 可以使用GraphX内置库对流数据进行图形分析。
  5. Spark 应用程序可以部署在(如果)现有的 YARN 或 Mesos 集群上。

KStreams 优势:

  1. 用于 ETL 处理和 ML 模型服务/训练具有丰富功能的消息的紧凑库。到目前为止,源和目标都应该只是 Kafka 主题。
  2. 易于实现恰好一次的语义。
  3. 不需要单独的处理集群。
  4. 易于在 docker 上部署,因为它是一个可以运行的普通 java 应用程序。
于 2018-11-02T08:52:25.597 回答
2

Apache Kafka Steams 是一个库,提供可嵌入的流处理引擎,它很容易在 Java 应用程序中用于流处理,它不是一个框架。

我发现了一些关于何时使用 Kafka Streams 的用例,并与Kafka 作者的 Apache flink 进行了很好的比较。

于 2016-12-14T00:44:51.407 回答