KStreams + Spark Streaming + 机器学习

Posted

技术标签:

【中文标题】KStreams + Spark Streaming + 机器学习【英文标题】:KStreams + Spark Streaming + Machine Learning 【发布时间】:2017-04-29 01:59:32 【问题描述】:

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

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

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

问题: 1. Spark Streaming 和 Kafka Streaming 有什么区别? 2. 如何结合 ? 3.我的想法是连续训练测试数据而不是批量训练..

【问题讨论】:

【参考方案1】:

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

我从 Kafka 作者那里找到了一些关于 when to use Kafka Streams 和 comparison with Apache flink 的用例。

【讨论】:

这个答案根本不包括 Spark,但提到了 Flink... 不是真正的问题。【参考方案2】:

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

    它被称为 Kafka 的 Streams API(又名 Kafka Streams) 它是 Apache Kafka 的一部分,因此归 Apache 软件基金会(而不是 Confluent)“拥有” 有 Confluent Open SourceConfluent Enterprise -- Confluent 提供的两个产品都利用了 Apache Kafka(因此也利用了 Kafka Streams)

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

关于差异(我只强调一些主要差异,有关更多详细信息,请参阅 Internet 和文档:http://docs.confluent.io/current/streams/index.html 和 http://spark.apache.org/streaming/)

Spark 流式传输:

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

卡夫卡流

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

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

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

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

【讨论】:

嘿,你的回答是从 2016 年开始的,如果能根据目前的情况更新它会非常好,再次感谢你在 *** 上的所有回答【参考方案3】:

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

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

另一方面,您首先使用 Apache Spark MLlib(或 H2O.ai 或 XYZ)等工具首先使用历史数据集构建分析模型。

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

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

【讨论】:

【参考方案4】:
从流处理的角度来看,

Spark StreamingKStreams 合二为一。

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

Spark Streaming 相对于 KStreams 的优势:

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

KStreams 优势:

    用于 ETL 处理和 ML 模型服务/训练具有丰富功能的消息的紧凑库。到目前为止,源和目标都应该只是 Kafka 主题。 轻松实现恰好一次的语义。 不需要单独的处理集群。 易于在 docker 上部署,因为它是一个可以运行的纯 java 应用程序。

【讨论】:

以上是关于KStreams + Spark Streaming + 机器学习的主要内容,如果未能解决你的问题,请参考以下文章

sparkstreaming+kafka

Spark 结构化流文件源起始偏移量

Spring kstreams 无法让处理器工作 - 类“[B”不在受信任的包中

Apache Spark 2.2.0 中文文档 - Structured Streaming 编程指南 | ApacheCN

Spark Streaming性能优化: 如何在生产环境下应对流数据峰值巨变

C++ MFC VC 6.0 到 VS2013 lStreamReturn = GetRichEditCtrl().StreamIn(SF_RTF, es);