![](/img/trans.png)
[英]Running two parallel custom receiver streams in local setup with Spark streaming for local test
[英]Spark streaming gc setup questions
我的邏輯如下。
使用createDirectStream在Kafka中按日志類型獲取主題。
重新分區后,將通過各種處理來處理日志。
使用combineByKey為每種日志類型創建一個字符串(使用StringBuilder)。
最后,按日志類型保存到HDFS。
有很多操作可以添加字符串,因此GC經常發生。
在這種情況下如何設置GC更好?
//////////////////////
有各種邏輯,但我認為在執行combineByKey時存在問題。
rdd.combineByKey[StringBuilder](
(s: String) => new StringBuilder(s),
(sb: StringBuilder, s: String) => sb.append(s),
(sb1: StringBuilder, sb2: StringBuilder) => sb1.append(sb2)
).mapValues(_.toString)
使用combineByKey
表達式可以做的最簡單的事情就是調整你創建的StringBuilder
大小,這樣當你將字符串值合並到它中時就不必擴展它的后備字符數組。 調整大小會放大分配率並通過從舊的后備陣列復制到新的后備陣列來浪費內存帶寬。 作為猜測,我會說選擇結果數據集記錄的字符串長度的第90個百分位數。
第二件事(在收集關於你的中間值的一些統計數據之后)將是你的組合器函數在你調用sb1.append(sb2)
時選擇有空間適合另一個的StringBuilder
實例。
照顧好的一件好事就是使用Java 8; 當字符串和字符串緩沖區工作繁重時,它具有顯着差異的優化。
最后但並非最不重要的是,了解您實際花費周期的位置。 這個工作量(不包括你正在做的任何其他自定義處理)不需要向老一代提升很多對象(如果有的話),所以你應該確保年輕一代有足夠的規模並且是並行收集的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.