隨着互聯網知識信息指數級膨脹,個性化的需求對於用戶來講愈來愈重要,經過推薦算法和用戶點擊行爲的流式計算能夠很簡單的作出一個商用的推薦系統。java
spark streaming從kafka讀取用戶行爲數據,過濾數據後從redis中拉取物品類似度矩陣,從db或緩存中獲取用戶歷史行爲,經過協同過濾進行興趣/ctr候選集計算,將結果緩存到redis,異步持久化到db,經過接口進行數據展現。mysql
開發包使用KafkaUtils類redis
數據從kafka拉取時,可能由於程序異常,形成數據丟失或不一致,能夠經過kafka把數據從新拉取,能夠指定offset讀取。算法
從kafka拉取數據,轉換爲spark streaming中的數據結構DStream。 接收數據有兩種:sql
基本的使用kafka高階api,接收的全部數據存儲在spark的executor中,以後spark streaming提交的job會處理這些數據。數據庫
reveiver方式,spark中partiton和kafka的partition並非相關的,若是加大每一個topic的partition數量,僅僅增長線程來處理由單一receiver消費的主題,但並無增長spark在處理數據上的並行度。api
對於不一樣的group和topic,可使用多個receiver建立不一樣的DStream來提高並行度,以後利用union來統一成一個DStream。緩存
Direct方式,沒有receiver這一層,會週期性的獲取kafka中每一個topic的每一個partition中新的offset,以後根據設定的maxRatePerPartition來處理每一個batch。網絡
相較於receiver方式的優點是:數據結構
receiver方式,是從zk獲取offset值,zk保存了當前消費的offset值,若是從新啓動開始消費會接着上次offset繼續消費。 direct方式中,直接從kafka來讀取數據,offset要本身記錄,能夠經過checkpoint,數據庫,文件記錄,或者寫回到zk。
若是批處理時間設置短,產生的job並不能在這期間完成,就會形成數據不斷累積,致使spark streaming阻塞。
spark streaming中的DStream若是被反覆利用,最好使用cache(),將數據流緩存起來,防止過分調度形成網絡開銷。
設置合理的GC,並行垃圾回收。