您好我正在计划部署,其中Spark可以解决从Kafka处理传入数据的繁重工作,以应用StreamingKMeans进行异常值检测。
然而,来自Kafka主题的数据来自各种来源,定义了需要不同KMeans模型(状态)的不同数据结构。因此,潜在的离散RDD中的每个条目都应该通过其自己的KMeans模型,基于“关键”字段(基本上我需要单个事件处理)。
使用Spark可以实现这种处理吗?如果是的话,它最终会利用Spark并行吗?我是Spark和Scala的新手,觉得我错过了什么。
提前致谢。
更新:
我目前正在调查似乎可以解决此问题的mapWithState
运算符。问题是:我可以直接将StreamingKmeans模型保存到状态吗?否则我将不得不保存质心并在状态更新功能中实例化一个新模型,这似乎很昂贵。
答案 0 :(得分:1)
使用Spark可以实现这种处理吗?如果是的话,它最终会利用Spark并行吗?
从理论上讲,这种类型的处理是可能的,它可以从分布式处理中受益,但绝对不能使用您想要使用的工具。
StreamingKMeans
是一个专门用于处理RDD的模型,由于Spark不支持嵌套转换,因此无法在有状态转换中使用它。
如果一组键的基数较低且所有值都是预先知道的,您可以按键split RDDs并按键保持单独的模型。
如果没有,您可以将StreamingKMeans
替换为第三方本地和可序列化K-means模型,并与mapWithState
或updateStateByKey
结合使用。通常,它应该比使用分布式版本更有效,而不会降低整体并行性。