跳轉到主要內容
工程的博客

矢量化在即將到來的Apache火花3.0 R I / O

通過Hyukjin Kwon

2020年6月1日 工程的博客

分享這篇文章

R是一個最受歡迎的計算機語言數據的科學,專門負責統計分析的擴展,如RStudio外接程序和其他R包、數據處理和機器學習任務。此外,它使數據科學家能夠輕易地將自己的數據集。

通過使用SparkR在Apache火花TM可以很容易地擴展,R代碼。交互運行工作,您可以很容易地通過運行R shell運行分布式計算。

當SparkR不需要與R的互動過程,性能幾乎相同的Scala等其他語言api, Java和Python。然而,當SparkR發生顯著的性能退化工作與本機R的函數或數據類型。

磚在SparkR運行時引入了向量化改進的性能數據I / O之間的火花和R .我們興奮地宣布,使用R apiApache箭頭0.15.1,向量化現在可以在即將到來的Apache火花3.0顯著改善性能。

這篇文章概述了火花和R SparkR內相互作用,目前SparkR本機實現和矢量化實現與基準測試結果。

火花和R交互

不僅SparkR支持一組豐富的ML和sql api還常用一組api直接與R代碼——例如,火花DataFrame的無縫轉換/ R DataFrame和火花DataFrame R本機函數的執行在一個分布式的方式。

在大多數情況下,性能幾乎一致在其他語言api火花——例如,當用戶代碼依賴於火花udf和/或SQL api,在JVM中執行發生完全沒有性能損失的I / O。看到下麵的情況下同樣~ 1秒。

//Scala API//~1第二個sql(“從範圍選擇id (2000000000)”)。過濾器(“id > 10”)。()
# R API#~1第二個(過濾器(sql(“SELECT * FROM範圍(2000000000)”),“id > 10”))

然而,在這種情況下,它需要執行本機函數或把它從/ R原生類型,下麵的性能是非常不同的。

/ / Scala APIval ds = (1 l到100000 l) .toDS/ / ~ 1秒ds.mapPartitions (iter= >iter.filter (_
              
              < pre > # R APIdf
              雖然簡單的情況下以上隻是過濾器值低於50,000年每個分區,SparkR是15 x慢。
              <前>/ / Scala API/ / ~ 0.2秒val df = sql (“SELECT * FROM範圍(1000000)”).collect ()
# R API# ~ 8秒- 40倍慢df
              上麵的例子更糟。它隻是收集相同的數據到驅動程序,但它40 x慢SparkR。因為需要交互的apiR本機函數數據類型它的實現是很能幹的人。有六個api有明顯的性能損失:
  • createDataFrame ()
  • 收集()
  • 有斑紋的()
  • dapplyCollect ()
  • 新聞出版總署()
  • gapplyCollect ()

簡而言之,createDataFrame ()收集()需要(反)序列化和轉換數據從JVM / R司機一邊。例如,字符串在Java中變得字符在r .有斑紋的()新聞出版總署(),JVM和R執行人之間的轉換是必需的,因為它需要(反)序列化R本機函數和數據。在的情況下dapplyCollect ()gapplyCollect (),它需要的開銷在司機和執行者之間的JVM和R。

本機實現

本機實現R在沒有向量化的火花,這就需要效率低下(反)序列化和轉換的數據在不同的JVM R司機一邊,導致顯著的性能損失。

計算在SparkR DataFrame被分布在所有節點上可用集群的火花。上麵沒有與R通信過程中司機或執行人雙方如果不需要收集數據,Rdata.frame或執行R本機函數。當它需要Rdata.frame或R本機函數的執行,他們JVM和R之間使用套接字通信驅動程序/執行人。

(反)序列化和傳輸數據行,行JVM和R之間使用低效的編碼格式,不考慮現代CPU設計如CPU流水線。

矢量化實現

在Apache 3.0火花,一個新的矢量化實現介紹了SparkR利用Apache箭頭JVM和R之間直接交換數據驅動程序/執行人以最少的(反)序列化開銷。

實施R在火花向量化(3.0中可用的火花),在JVM和R執行人/驅動程序之間的數據交換與有效的(反)序列化Apache箭頭,提供更好的性能。

相反的(反)序列化的數據行行JVM和R之間使用低效的格式,新的實現利用Apache箭頭讓流水線和單指令多數據(SIMD)與一個高效的柱狀的格式。

新的矢量化SparkR api不默認啟用,但可以通過設置啟用spark.sql.execution.arrow.sparkr.enabled真正的在即將到來的Apache 3.0火花。請注意,矢量化dapplyCollect ()gapplyCollect ()還沒有實現。這是鼓勵用戶使用有斑紋的()新聞出版總署()代替。

基準測試結果

的基準進行一個簡單的數據集500000條記錄通過執行相同的代碼和比較時的總運行時間向量化是啟用和禁用。我們的代碼,數據集和筆記本是可用的在GitHub上

SparkR之間性能比較有和沒有向量化表明前者對後者的性能優越。

在的情況下收集()createDataFrame ()R DataFrame,大約17 x和42個更快的向量化時啟用。為有斑紋的()新聞出版總署(),這是43 x和33比向量化被禁用時,分別。

有一個性能改進的17 x-43x優化時啟用spark.sql.execution.arrow.sparkr.enabled真正的。數據越大,性能越高。有關詳細信息,請參見以前對磚運行時執行的基準

結論

即將到來的Apache 3.0火花,支持矢量化api,有斑紋的(),新聞出版總署(),收集()createDataFrame ()R DataFrame利用Apache箭頭。使向量化SparkR改善了性能快43倍,預計更增加大小的數據時更大。

對於未來的工作,有一個持續的問題在Apache箭頭,箭- 4512。JVM和R之間的通信是目前沒有完全以流媒體的方式。它必須在批處理(反)序列化,因為箭R API不支持這個的。此外,dapplyCollect ()gapplyCollect ()將支持Apache火花3。x版本。用戶可以通過周圍工作有斑紋的()收集(),新聞出版總署()收集()同時分別。

嚐試這些新功能今天在磚,通過我們的DBR 7.0測試版,包括即將到來的火花3.0版本的預覽。在我們了解更多關於火花3.0預覽網絡研討會。

免費試著磚
看到所有工程的博客的帖子
Baidu
map