項目中遇到Spark Streaming吞吐量太低的問題,redis集羣使用HashMap優化鍵值存儲結構提升Spark Streaming吞吐量。
場景:
設備將運行報文發送到kafka,Spark Streaming對報文進行加工處理,生成6類不同報文信息以json字符串形式set進redis集羣。
問題:
kafka消費速度跟不上。
分析:
對於1000萬設備一個上報週期上報1000萬條報文,極端情況下同時上報,Spark Streaming消費1000萬條報文,生成6000萬個鍵值對存儲入redis集羣。
優化思路,降低Spark Streaming操作redis的頻率,降低key的數量。提升Spark Streaming吞吐量,提升redis集羣的查詢速度以及後續key的更新速度。計劃使用HashMap結構將6類json報文的屬性提取出來作爲HashMap的field。
測試:
相同集羣環境下set操作和hset操作均使用基於Lettuce的Spring data redis客戶端。使用pipliene的方式進行命令提交。每批處理命令1000條。
set模式使用3個json報文共32個屬性,hset模式使用一個相同32屬性的Map。則set模式下存儲報文量爲hset模式下的3倍。
結果:
set | hset | 速度提升 | |
---|---|---|---|
10萬數量級場景 | 1.3min(30萬) | 51s(10萬) | 34% |
100萬數量級場景 | 1.3min(300萬) | 51s(100萬) | 27% |
1000萬數量級場景 | 1.789hours(3000萬) | 1.295hous(1000萬) | 27% |
結論:
使用HashMap結構降低redsi集羣鍵值數量可以提升存儲性能,提升Spark Streaming吞吐量。提升預估20%~30%,待現網驗證,補充結果。