Spark 2.0的大多數代碼比Spark 1.6的快5-10倍(所謂的大多數代碼指的是hashjoin,filter等等,可是全局的排序在2.0版本並無作太多的努力),若是在Spark 1.6比較耗CPU的話,在2.0上有很大的改進架構
其實特別大的改進指的就是數據規模特別大且特別耗CPU的狀況下,性能獲得了很大的提高函數
Spark 2.0採用了whole stage code generation性能
在Spark 2.0中,若是物理計劃中有*,則都會啓用 whole-stage code generation的機制,Range,Filter等等都有這個*優化
其實從這個名字能夠看出來,是針對一個stage的,Exchange does not have whole-stage code generation because it is sending data accross the data(Shuffle)翻譯
從這裏能夠看出Spark 2.0的精髓所在:
Spark 1.6 一個Stage 內部之間的多個算子是經過Iterator的next next 來實現的(多個Function)code
而Spark 2.0是經過一個Function 來完成的排序
Spark 2.0中之因此能比1.6快,是由於:hash
1.減小了虛函數的調用,極大地減小了CPU無用的指令的消耗(不須要經過next,next的調用)it
2.數據直接放在寄存器中,至少提高了一個數量級的提高速度(例如咱們寫一個Spark SQL,只是翻譯成了普通的循環,不須要方法調用,數據能夠直接放在寄存器中)io
3.如今的CPU等硬件架構對基本的條件語句,循環語句等進行了極大的優化,而且可使用硬件加速
4.對於複雜的數據操做,採用Vectorzation的方式,列的方式讀寫數據(一次next就是整列的數據),也就是一行實際上是原來的一列
優勢:擅長CPU密集型的計算
弱點:對IO沒有進行太多優化
概括總結:1.Spark 2.0比Spark 1.6.x快,什麼代碼會快?適用於什麼狀況?
2.Spark 採用了什麼策略,是由於什麼會快,優勢和弱點?