2016-07-21 39 views
1

嗨,我正在计划一个部署,其中Spark可以完成处理来自卡夫卡的传入数据的繁重工作,以将StreamingKMeans应用于异常检测。Spark与多个KMeans与mapWithState

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

这种类型的处理可以用Spark来实现吗?如果是的话,它最终会利用Spark的并行性吗?我是Spark和Scala的新手,觉得我错过了一些东西。

在此先感谢。

UPDATE:

我目前正在调查mapWithState运营商,这似乎解决了这个问题。问题是:我可以直接将StreamingKmeans模型保存到状态中吗?否则,我将不得不保存质心并在状态更新函数中实例化一个新模型,这看起来很昂贵。

回答

1

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

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

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

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

如果不是,您可以将StreamingKMeans替换为第三方本地和可序列化的K均值模型,并与mapWithStateupdateStateByKey组合使用。一般来说,它应该比使用分布式版本更高效,而不会降低总体的并行性。

+0

非常感谢,因为它们取决于数据来源,并且运行时由另一个应用程序层添加Kafka源,因此通用性在这个应用程序层中键是不可预知的。您的建议是使用第三方选项(任何?)还是转向Flink?由于Flink在我看来似乎更适合这种情况... – Peterdeka

+1

噢,也许我误解了,第三方的东西你的意思是不使用Spark和朋友吧?!这是我的第一个选择...:D – Peterdeka

+0

我偏向这里。我试过Flink,我不喜欢API设计。忽略这一点,AFAIK并没有提供任何可以解决这种特殊情况的方法。但我可能是错的。关于当地的库存 - 埃尔基总体来说体面,虽然文件不是很好。 – zero323