標籤:

SparkSQL 使用Parquet 和textfile cache 之後的性能比較?

苦於sparksql 的速度太慢

於是使用傳說中的parquet 之後 普遍提升了50%-400%的速度 甚至比cache 之後還快,這是為何?

看到有人說,cache 需要先做shuffle 再cache 才能提升效率,在spark sql 的CLI 中是怎樣的思路? 難道是先執行shuffle 類的sql 字句,再cache 再執行其他sql 字句?括弧笑

另外,據說spark 2.0.1比1.6提升20%事實上並未感到這種提升 是我的打開方式不對么?


Parquet是列式存儲格式,且支持壓縮存儲,Spark自帶對Parquet格式的支持且默認開啟了壓縮。

假設你的表有10列,SQL中只查詢了某幾列,Spark在掃描數據時只會讀取你查詢的這幾列,另外配合數據壓縮,可以大大減少IO。Parquet按列存儲+壓縮是比TextFile快的主要原因。

將TextFile cache後,Spark並不會馬上做cache而是在執行action操作的時候做cache,這個action操作不一定是包含shuffle操作的。

題主提到的TextFile cache比Parquet慢的問題,沒有給出詳細的測試case不好直接對比,不同的cache方案對查詢的影響差異比較大。TextFile是純文本的,Parquet支持數據類型,cache的數據如果沒有做類型轉換,後續計算可能還會有類型轉換的開銷也是影響因素之一。

另外,還需要考慮操作系統對文件緩存的影響,你的Parquet文件雖然沒有被Spark cache到內存,但是如果訪問頻繁,且系統有較多的空閑內存,OS也會幫你cache起來的,這樣Spark在讀取Parquet的時候就能快很多,這也是比TextFile cache查詢速度快的影響因素之一。

最後,題主提到的:Spark 2.0.1比1.6提升20%事實上並未感到這種提升。並不是你的打開方式不對。就連現在最新的Spark 2.2.0平均性能比1.6也好不哪去,這裡面整體性能不好的原因有很多,主要是Spark 2.x的SQL模塊改動比較大,還存在一些性能方面的Regression。2.x中新增了很多優化器,比1.6多出一倍多,但是吧,個別優化器執行起來很慢,會導致某些SQL反而變慢。所以從整體情況來看,題主沒有感覺到20%的性能提升是正常的。

Spark 2.x也不是一無是處,至少在大表聚合計算方面相比1.6還是有不少提升的,小表並發查詢確實有所變差,前不久和社區的commiter也提到過這個問題,社區有計劃改進並發查詢這塊,相信後續版本會有所改善。


你這個慢的原因主要是在GC吧,parquet 會將數據進行壓縮,壓縮之後數據量就少了,緩解了GC壓力所以就快了。性能瓶頸在GC的情況下,使用cache會導致老年代和年輕代的頻繁切換,就會導致性能變慢了


推薦閱讀:

怎麼處理 Spark structured streaming 慢速變化數據 join 的問題?
Spark強大的函數擴展功能
內存有限的情況下 Spark 如何處理 T 級別的數據?
Spark SQL到底支持什麼SQL語句?
矽谷之路54:深入淺出Spark(七)如何排序100TB

TAG:Spark |