【问题标题】:Spark streaming multiple KMeans with mapWithStateSpark 使用 mapWithState 流式传输多个 KMeans
【发布时间】:2016-11-25 10:19:11
【问题描述】:

您好,我正在计划一个部署,Spark 可以完成处理来自 Kafka 的传入数据的繁重工作,以应用 StreamingKMeans 进行异常值检测。

然而,从 Kafka 主题传入的数据来自各种来源,定义了需要不同 KMeans 模型(状态)的不同数据结构。因此,传入离散 RDD 中的每个条目可能都应该通过其自己的 KMeans 模型,基于“关键”字段(基本上我需要单个事件处理)。

这种类型的处理可以用 Spark 实现吗?如果是,它最终是否利用了 Spark 并行性?我是 Spark 和 Scala 的新手,感觉自己缺少了一些东西。

提前致谢。

更新:

我目前正在研究似乎可以解决此问题的 mapWithState 运算符。问题是:我可以直接将 StreamingKmeans 模型保存到状态中吗?否则我将不得不保存质心并在状态更新函数中实例化一个新模型,这似乎很昂贵。

【问题讨论】:

    标签: scala apache-spark spark-streaming apache-spark-mllib


    【解决方案1】:

    这种类型的处理可以用 Spark 实现吗?如果是,它最终是否利用了 Spark 并行性?

    理论上这种类型的处理是可能的,它可以从分布式处理中受益,但绝对不能使用您想要使用的工具。

    StreamingKMeans 是一种设计用于 RDD 的模型,由于 Spark 不支持嵌套转换,因此您不能在有状态转换中使用它。

    如果一组键的基数较低并且所有值都是预先知道的,您可以通过键 split RDDs 并为每个键保留单独的模型。

    如果没有,您可以将 StreamingKMeans 替换为 3 方本地和可序列化 K-means 模型,并与 mapWithStateupdateStateByKey 组合使用。一般来说,它应该比在不降低整体并行度的情况下使用分布式版本更有效。

    【讨论】:

    • 感谢零,一般来说,密钥在此应用程序层是不可预测的,因为它们取决于数据来自的源,而 Kafka 源是在运行时由另一个应用程序层添加的。你的建议是选择 3-rd 方选项(任何?)还是转向 Flink?因为我认为 Flink 似乎更适合这种情况......
    • 哦,也许我误会了,你的意思是不使用 Spark 和朋友的 3-rd 派对的东西,对吧?!那是我的第一个选择...:D
    • 我这里有偏见。我尝试了 Flink,但我不喜欢 API 设计。忽略这一点,AFAIK 没有提供任何可以解决这种特定情况的方法。不过我可能是错的。关于本地库 - 尽管文档远非很好,但 Elki 总体上还是不错的。
    • 在 Flink 中,如果我想通过命令流上的命令消息以某种方式编辑模型,我可能会使用 CoFlatMapFunction。关于我使用 GO 的自定义解决方案,所以我有很多选择,当谈到扩展到需要持久 Kakfa 偏移量以及最重要的是在实例之间共享和更新 KMeans 模型状态的多个实例时,疑问仍然存在。
    • 但是我仍然不明白为什么在 mapWithState 更新函数中我不能将 kmeans 应用于单个 RDD 对象(它是一个地图,所以我应该通过键获取单个对象及其状态)@987654323 @
    猜你喜欢
    • 2016-08-25
    • 1970-01-01
    • 2016-08-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-27
    • 1970-01-01
    • 1970-01-01
    • 2020-07-17
    相关资源
    最近更新 更多