今天聚焦於內存和CPU的優化使用,這是Spark2.0提供的關於執行時的很是大的優化部分。數據結構
對過去的代碼研究,咱們會發現,抽象的提升,轉過來會變成對CPU和內存的使用。也就是說,抽象提高,會對內存對Cpu會有不少沒必要要的使用,執行不少無謂的沒有實際做用的操做。好比面向接口調用,就是使用了指針的指針,接口這層並無實際的做用,能夠直接跳過。框架
Spark2.x的Tungsten中作了個很是重要的改進,也就是whole-stage code,把抽象的使用直接合併到具體的函數上。函數
具體來講,Tungsten引擎會看哪些部分運行比較慢,會把這些比較慢的功能,代碼單獨放在一個函數中,消除虛函數調用,同時,將數據放在寄存器中,這樣就減小CPU無謂的消耗,訪問速度更快。性能
好比對RDD執行next方法,RDD是一個抽象類,存在虛函數尋址的過程,會消耗CPU,另一方面做爲next訪問每條記錄都會調用一次方法,開銷仍是比較大的。大數據
Spark2.x的做用就是按照本身的邏輯翻譯成數據集合的for/while循環,把屢次函數調用變成了一個代碼塊,極大的提高效率。優化
剛纔說的是循環來源問題,還有一種狀況的問題。spa
當數據來源或者數據結構比較複雜,好比採用parquet數據,有個編解碼的過程,會有很是大的開銷。翻譯
這個時候會採用向量化的方式vectorization,相似於構成了一個矩陣,假設處理很複雜的話,這時候能夠一批一批進行處理,相似於用mapPartitions替代map。以對parquet進行批量解碼爲例,性能能夠提高5-10倍。指針
可是要作到優化,Spark首先要對代碼進行分析,因此全部的子框架都使用到了Tungsten。目前已經完成了on-heap/off-heap、Register/Memory、Cpu的優化,官方主要下一步會對IO操做進一步優化。code
DT大數據天天晚上20:00YY頻道現場授課頻道68917580