Apache Spark 3.0.0重磅發布 —— 重要特性全面解析


圖標

2020年6月18日,開發了近兩年(自2018年10月份至今)的Apache Spark 3.0.0 正式發布!

Apache Spark 3.0.0版本包含3400多個補丁,是開源社區做出巨大貢獻的結晶,在Python和SQL功能方面帶來了重大進展並且將重點聚焦在了開發和生產的易用性上。同時,今年也是Spark開源10周年,這些舉措反映了Spark自開源以來,是如何不斷的滿足更廣泛的受眾需求以及更多的應用場景。

首先來看一下Apache Spark 3.0.0主要的新特性:

  • 在TPC-DS基准測試中,通過啟用自適應查詢執行、動態分區裁剪等其他優化措施,相比於Spark 2.4,性能提升了2倍
  • 兼容ANSI SQL
  • 對pandas API的重大改進,包括python類型hints及其他的pandas UDFs
  • 簡化了Pyspark異常,更好的處理Python error
  • structured streaming的新UI
  • 在調用R語言的UDF方面,速度提升了40倍
  • 超過3400個Jira問題被解決,這些問題在Spark各個核心組件中分布情況如下圖:

 

此外,采用Spark3.0版本,主要代碼並沒有發生改變。

改進的Spark SQL引擎

Spark SQL是支持大多數Spark應用的引擎。例如,在Databricks,超過 90%的Spark API調用使用了DataFrame、Dataset和SQL API及通過SQL優化器優化的其他lib包。這意味着即使是Python和Scala開發人員也通過Spark SQL引擎處理他們的大部分工作。

如下圖所示,Spark3.0在整個runtime,性能表現大概是Spark2.4的2倍:

接下來,我們將介紹Spark SQL引擎的新特性。

即使由於缺乏或者不准確的數據統計信息和對成本的錯誤估算導致生成的初始計划不理想,但是自適應查詢執行(Adaptive Query Execution)通過在運行時對查詢執行計划進行優化,允許Spark Planner在運行時執行可選的執行計划,這些計划將基於運行時統計數據進行優化,從而提升性能。

由於Spark數據存儲和計算是分離的,因此無法預測數據的到達。基於這些原因,對於Spark來說,在運行時自適應顯得尤為重要。AQE目前提供了三個主要的自適應優化:

  • 動態合並shuffle partitions

可以簡化甚至避免調整shuffle分區的數量。用戶可以在開始時設置相對較多的shuffle分區數,AQE會在運行時將相鄰的小分區合並為較大的分區。

  • 動態調整join策略

在一定程度上避免由於缺少統計信息或着錯誤估計大小(當然也可能兩種情況同時存在),而導致執行次優計划的情況。這種自適應優化可以在運行時sort merge join轉換成broadcast hash join,從而進一步提升性能

  • 動態優化傾斜的join(skew joins)

skew joins可能導致負載的極端不平衡,並嚴重降低性能。在AQE從shuffle文件統計信息中檢測到任何傾斜后,它可以將傾斜的分區分割成更小的分區,並將它們與另一側的相應分區連接起來。這種優化可以並行化傾斜處理,獲得更好的整體性能。

基於3TB的TPC-DS基准測試中,與不使用AQE相比,使用AQE的Spark將兩個查詢的性能提升了1.5倍以上,對於另外37個查詢的性能提升超過了1.1倍。

 


動態分區裁剪

當優化器在編譯時無法識別可跳過的分區時,可以使用"動態分區裁剪",即基於運行時推斷的信息來進一步進行分區裁剪。這在星型模型中很常見,星型模型是由一個或多個並且引用了任意數量的維度表的事實表組成。在這種連接操作中,我們可以通過識別維度表過濾之后的分區來裁剪從事實表中讀取的分區。在一個TPC-DS基准測試中,102個查詢中有60個查詢獲得2到18倍的速度提升。

更多動態分區裁剪介紹可參考:

 

 

ANSI SQL兼容性

對於將工作負載從其他SQL引擎遷移到Spark SQL來說至關重要。為了提升兼容性,該版本采用Proleptic Gregorian日歷,用戶可以禁止使用ANSI SQL的保留關鍵字作為標識符。此外,在數字類型的操作中,引入運行時溢出檢查,並在將數據插入具有預定義schema的表時引入了編譯時類型強制檢查,這些新的校驗機制提高了數據的質量。更多ASNI兼容性介紹,可參考:

 

Join hints

盡管社區一直在改進編譯器,但仍然不能保證編譯器可以在任何場景下做出最優決策——join算法的選擇是基於統計和啟發式算法。當編譯器無法做出最佳選擇時,用戶可以使用join hints來影響優化器以便讓它選擇更好的計划。

Apache Spark 3.0對已存在的join hints進行擴展,主要是通過添加新的hints方式來進行的,包括:

SHUFFLE_MERGE、SHUFFLE_HASH和SHUFFLE_REPLICATE_NL。

增強的Python API:PySpark和Koalas

Python現在是Spark中使用較為廣泛的編程語言,因此也是Spark 3.0的重點關注領域。Databricks有68%的notebook命令是用Python寫的。PySpark在 Python Package Index上的月下載量超過 500 萬。

 

 

很多Python開發人員在數據結構和數據分析方面使用pandas API,但僅限於單節點處理。Databricks會持續開發Koalas——基於Apache Spark的pandas API實現,讓數據科學家能夠在分布式環境中更高效地處理大數據。

通過使用Koalas,在PySpark中,數據科學家們就不需要構建很多函數(例如,繪圖支持),從而在整個集群中獲得更高性能。

經過一年多的開發,Koalas實現對pandas API將近80%的覆蓋率。Koalas每月PyPI下載量已迅速增長到85萬,並以每兩周一次的發布節奏快速演進。雖然Koalas可能是從單節點pandas代碼遷移的最簡單方法,但很多人仍在使用PySpark API,也意味着PySpark API也越來越受歡迎。

 

Spark 3.0為PySpark API做了多個增強功能:

  • 帶有類型提示的新pandas API
    pandas UDF最初是在Spark 2.3中引入的,用於擴展PySpark中的用戶定義函數,並將pandas API集成到PySpark應用中。但是,隨着UDF類型的增多,現有接口就變得難以理解。該版本引入了一個新的pandas UDF接口,利用Python的類型提示來解決pandas UDF類型激增的問題。新接口變得更具Python風格化和自我描述性。
  • 新的pandas UDF類型和pandas函數API
    該版本增加了兩種新的pandas UDF類型,即系列迭代器到系列迭代器和多個系列迭代器到系列迭代器。這對於數據預取和昂貴的初始化操作來說非常有用。此外,該版本還添加了兩個新的pandas函數API,map和co-grouped map。更多詳細信息請參考:
  • 更好的錯誤處理
    對於Python用戶來說,PySpark的錯誤處理並不友好。該版本簡化了PySpark異常,隱藏了不必要的JVM堆棧跟蹤信息,並更具Python風格化。

改進Spark中的Python支持和可用性仍然是我們最優先考慮的問題之一。

Hydrogen、流和可擴展性

Spark 3.0完成了Hydrogen項目的關鍵組件,並引入了新功能來改善流和可擴展性。

  • 加速器感知調度
    Hydrogen項目旨在更好地統一基於Spark的深度學習和數據處理。GPU和其他加速器已經被廣泛用於加速深度學習工作負載。為了使Spark能夠利用目標平台上的硬件加速器,該版本增強了已有的調度程序,使集群管理器可以感知到加速器。用戶可以通過配置來指定加速器(詳細配置介紹可參考:)。然后,用戶可以調用新的RDD API來利用這些加速器。

 

  • 結構化流的新UI
    結構化流最初是在Spark 2.0中引入的。在Databricks,使用量同比增長4倍后,每天使用結構化流處理的記錄超過了5萬億條。

 

Apache Spark添加了一個專門的新Spark UI用於查看流jobs。新UI提供了兩組統計信息:

    • 流查詢作業已完成的聚合信息
    • 流查詢的詳細統計信息,包括Input Rate, Process Rate, Input Rows, Batch Duration, Operation Duration等
  • 可觀察的指標

持續監控數據質量變化是管理數據管道的一種重要功能。Spark 3.0引入了對批處理和流應用程序的功能監控。可觀察的指標是可以在查詢上定義的聚合函數(DataFrame)。一旦DataFrame執行達到一個完成點(如,完成批查詢)后會發出一個事件,該事件包含了自上一個完成點以來處理的數據的指標信息。

  • 新的目錄插件API

現有的數據源API缺乏訪問和操作外部數據源元數據的能力。新版本增強了數據源V2 API,並引入了新的目錄插件API。對於同時實現了目錄插件API和數據源V2 API的外部數據源,用戶可以通過標識符直接操作外部表的數據和元數據(在相應的外部目錄注冊了之后)。

Spark 3.0的其他更新

Spark 3.0是社區的一個重要版本,解決了超過3400個Jira問題,這是440多個contributors共同努力的結果,這些contributors包括個人以及來自Databricks、谷歌、微軟、英特爾、IBM、阿里巴巴、Facebook、英偉達、Netflix、Adobe等公司的員工。

在這篇博文中,我們重點介紹了Spark在SQL、Python和流技術方面的關鍵改進。

除此之外,作為里程碑的Spark 3.0版本還有很多其他改進功能在這里沒有介紹。詳情可以查閱版本發行說明:。發行文檔中提供了更多詳盡的本次版本的改進信息,包括數據源、生態系統、監控等。

 

最后,熱烈祝賀Spark開源發展10周年!

Spark誕生於UC Berkeley’s AMPlab,該實驗室致力於數據密集型計算的研究。AMPLab研究人員與大型互聯網公司合作,致力於解決數據和AI問題。但是他們發現,對於那些那些擁有海量數據並且數據不斷增長的公司同樣面臨類似的問題需要解決。於是,該團隊研發了一個新引擎來處理這些新興的工作負載,同時使處理數據的APIs,對於開發人員更方便使用。

社區很快將Spark擴展到不同領域,在流、Python和SQL方面提供了新功能,並且這些模式現在已經構成了Spark的一些主要用例。作為數據處理、數據科學、機器學習和數據分析工作負載事實上的引擎,持續不斷的投入成就了Spark的今天。Apache Spark 3.0通過對SQL和Python(如今使用Spark的兩種最廣泛的語言)支持的顯著改進,以及對性能、可操作性等方面的優化,延續了這種趨勢。

 

本文主要參考自Databricks博客和Apache Spark官網,包括不局限於以下文章:

1.

2.

關於Apache SparkTM 3.0.0重要特性更詳盡的介紹,除了文中內容,也可參考來自Databricks的其他技術博客:

  • Adaptive Query Execution blog

  • Pandas UDFs and Python Type Hints blog

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM