Spark Tungsten揭祕 Day4 內存和CPU優化使用

Spark Tungsten揭祕 Day4

內存和CPU優化使用

今天聚焦於內存和CPU的優化使用,這是Spark2.0提供的關於執行時的很是大的優化部分。數據結構

對過去的代碼研究,咱們會發現,抽象的提升,轉過來會變成對CPU和內存的使用。也就是說,抽象提高,會對內存對Cpu會有不少沒必要要的使用,執行不少無謂的沒有實際做用的操做。好比面向接口調用,就是使用了指針的指針,接口這層並無實際的做用,能夠直接跳過。框架

whole-stage code

Spark2.x的Tungsten中作了個很是重要的改進,也就是whole-stage code,把抽象的使用直接合併到具體的函數上。函數

具體來講,Tungsten引擎會看哪些部分運行比較慢,會把這些比較慢的功能,代碼單獨放在一個函數中,消除虛函數調用,同時,將數據放在寄存器中,這樣就減小CPU無謂的消耗,訪問速度更快。性能

好比對RDD執行next方法,RDD是一個抽象類,存在虛函數尋址的過程,會消耗CPU,另一方面做爲next訪問每條記錄都會調用一次方法,開銷仍是比較大的。大數據

Spark2.x的做用就是按照本身的邏輯翻譯成數據集合的for/while循環,把屢次函數調用變成了一個代碼塊,極大的提高效率。優化

  • 一方面,沒有接口和虛函數的調用。面向對象極大的方便編寫工程,可是形成了很大的浪費。CPU也有執行優化的方式,若是是while或者if判斷的話,CPU對這種代碼的執行比其餘代碼要快。
  • 另外,CPU操做數據的時候,操做內存比操做磁盤更快,操做寄存器比操做內存更快。

vectorization

剛纔說的是循環來源問題,還有一種狀況的問題。spa

當數據來源或者數據結構比較複雜,好比採用parquet數據,有個編解碼的過程,會有很是大的開銷。翻譯

這個時候會採用向量化的方式vectorization,相似於構成了一個矩陣,假設處理很複雜的話,這時候能夠一批一批進行處理,相似於用mapPartitions替代map。以對parquet進行批量解碼爲例,性能能夠提高5-10倍。指針

可是要作到優化,Spark首先要對代碼進行分析,因此全部的子框架都使用到了Tungsten。目前已經完成了on-heap/off-heap、Register/Memory、Cpu的優化,官方主要下一步會對IO操做進一步優化。code

欲知後事如何,且聽下回分解!

DT大數據天天晚上20:00YY頻道現場授課頻道68917580

相關文章
相關標籤/搜索