SparkSql優化

1、避免用in和not in
解決方案:
- 用exists和not exists代替
- 用join代替
效率:
not in 慢是因爲not in 不走索引
2、in 會導致數據傾斜
3、大表join小表
策略:將小表廣播(brodcast)
參數:spark.sql.autoBroadcastJoinThreshold 默認值10485760(10M),當小表或df的大小小於此值,Spark會自動的將該表廣播到每個節點上
原理:join是個shuffle類算子,shuffle時,各個節點上會先將相同的key寫到本地磁盤,之後再通過網絡傳輸從其他節點的磁盤文件在拉取相同的key,因此shuffle可能會發生大量的磁盤IO和網絡傳輸,性能很低,而broadcast先將小表廣播到每個節點,這樣join時都是在本地完成,不需要網絡傳輸,所以會提升性能

注意:broadcast join 也稱爲replicated join 或者 map-side join
4、寫MySQL慢
Spark df批量寫MySQL很慢,如我900萬條數據寫需要5-10個小時
解決辦法:在url後面加上
&rewriteBatchedStatements=true
&rewriteBatchedStatements=true
加上之後,寫數據10分鐘左右,快很多。
個人環境經驗:MySQL不用加就沒問題,MariaDB需要加,也就是不同的MySQL版本不一樣

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章