2016-07-21 41 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