Spark使用mapWithState流式传输多个KMeans

时间:2016-07-21 17:30:36

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

您好我正在计划部署,其中Spark可以解决从Kafka处理传入数据的繁重工作,以应用StreamingKMeans进行异常值检测。

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

使用Spark可以实现这种处理吗?如果是的话,它最终会利用Spark并行吗?我是Spark和Scala的新手,觉得我错过了什么。

提前致谢。

更新:

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

1 个答案:

答案 0 :(得分:1)

  

使用Spark可以实现这种处理吗?如果是的话,它最终会利用Spark并行吗?

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

StreamingKMeans是一个专门用于处理RDD的模型,由于Spark不支持嵌套转换,因此无法在有状态转换中使用它。

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

如果没有,您可以将StreamingKMeans替换为第三方本地和可序列化K-means模型,并与mapWithStateupdateStateByKey结合使用。通常,它应该比使用分布式版本更有效,而不会降低整体并行性。