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 Source 和 Confluent 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 Streaming 和 KStreams 合二为一。
在此强调 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 + 机器学习的主要内容,如果未能解决你的问题,请参考以下文章
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);