1. 程式人生 > >spark2.0 新特性總結

spark2.0 新特性總結

新特性:

1,用sparksession實現hivecontext和sqlcontext統一

2,whole-stage code generation,大幅提高計算效能,因為把物理計劃變成硬編碼,每秒處理的sql中的資料量增加十倍,即對物理執行的多次呼叫轉化為程式碼for迴圈,蕾絲hardcode方式,減少執行的函式呼叫次數,當資料記錄多時,這個呼叫次數時很大的。

3,合併dataframe和datasets,1.6的dataset包含了dataframe的功能,這樣兩者存在很大冗餘,所以2.0將兩者統一,保留dataset api,把dataframe表示為dataset[Row],即dataset的子集。dataframe是sql查詢結果rdd的抽象類,相當於java裡的resultset。

4,結構化流計算,sparkstreaming是把流計算看成一個一個的離線計算來完成流計算,提供一套dstream的流api,相比其他的流計算,sparkstreaming的優點是容錯行和吞吐量上有優勢,在2.0以前的版本,使用者在使用時,如果有流計算,又有離線計算,就需要兩套api去編寫程式,一套是rddapi,一套是dstream api,而且dstream api在易用性上遠不如sql或dataframe。為了真正將流計算和離線計算在程式設計api上統一,同時也讓streaming作業能夠享受dataframe/dataset上所帶來的優勢:效能提升和API易用,於是提出了structed streaming,最後我們只需要基於dataframe/dataset可以開發離線計算和流計算的程式,很容易使得spark在api跟業界所說的dataflow來統一離線計算和流計算效果一樣。比如在做batch聚合時我們可以寫成下面程式碼:

logs = ctx.read.format("json").open("s3://logs")

logs.groupBy(logs.user_id).agg(sum(logs.time)).write.format("jdbc").save("jdbc:mysql//...")

那麼對於流計算時,我們僅僅是呼叫了dataframe/dataset的不同函式程式碼,如下:

logs = ctx.read.format("json").stream("s3://logs")

logs.groupBy(logs.user_id).agg(sum(logs.time)).write.format("jdbc").stream("jdbc:mysql//...")

5,sql優化,增加了以前很多不支援的sql語句

6,採用vectorized Parquet decoder讀取parquet上資料,以前是一行一行的讀取,然後處理,現在改為一次讀取4096行記錄,不需要沒處理一行紀錄去呼叫一次parquet獲取記錄的方法,而是改為一批去呼叫一次(spark-12854) 。加上parquet本身是列儲存,這個優化使得parquet讀取速度提高三倍

7,採用radix sort提高sort的效能(spark-14724)。在某些情況下排序效能可以提高10~20倍

8,使用vectorizedhashmap來代替java的hashmap加速groupby的執行

9,將hive中的window函式用native spark window實現,因為native spark window在記憶體管理上有優勢

10,避免複雜語句中的邏輯相同部分在執行時重複計算

11,壓縮演算法預設使用lz4

12,mllib裡的計算用dataframe-based api代替以前的rdd計算邏輯

13,提供更多的r語言演算法

14,使用scala-2.11編譯執行

15,在和舊版本的相容方面,將hive語句解析以及語法移動到core裡,在沒有hive原資料庫和hive依賴包時,我們可以像以前版本使用標準sql一樣去使用hivesql語句。