決戰大數據之巔:Spark、Dask、Vaex、Pandas的正面交鋒

全文共3924字,預計學習時長15分鐘

決戰大數據之巔:Spark、Dask、Vaex、Pandas的正面交鋒

圖源:unsplash

 

新的數據科學問題席捲而來時,首要問題是使用何種技術。廣告宣傳、標準工具、尖端技術、整個平臺和現成的解決方案,都是備選項。

過去的幾年裏,筆者嘗試使用各項技術來構建概念證明和解決方案。筆者註冊試用新平臺、試用任何大型雲平臺發佈的新功能。當一項新技術出現時,筆者必然會瀏覽一些教程並在個人數據集上試用。

筆者決定比較各項數據整理技術,以便爲下一個項目選擇最適合表格式數據探索、清洗和整理的技術。筆者也以此爲契機,重新接觸了好幾年沒有使用過的技術。隨着時間的推移,這些技術已優化很多。

 

TL;DR

Vaex作爲新型大數據技術正在崛起。如果用戶已在使用PySpark平臺或已擁有PySpark人才,這仍是一個不錯的選擇。

 

是什麼

下文中,筆者假設讀者對Python API和大數據功能有基本的掌握程度。我選取了Taxi數據集的10億行數據,容量有100GB。目標是比較這些技術的API、性能和易用性。筆者認爲Pandas是API的基準(確實承認該說法存在爭議的),因爲Pandas是目前最常見的解決方案,但不能處理大數據。

程序員有兩種處理大數據集的傳統方式/方法:一種是更強大的/分佈式計算,使內存與數據大小相匹配;另外一種是核外方法,即只有在必要時纔在內存中讀取數據。二者成本差異巨大,因此,筆者決定只考慮核外計算的解決方案。

 

決戰大數據之巔:Spark、Dask、Vaex、Pandas的正面交鋒

圖源:unsplash

 

競爭產品:

· Koalas —Apache Spark 上的Pandas API。

· Vaex —一個用於延遲外核數據幀的Python庫。

· DaskDataFrame —一款用於分析的靈活並行計算庫。

· PySpark —一款基於Spark的用於大規模數據處理的統一分析引擎。

· Turicreate —一個相對私密的機器學習包,其數據框架結構爲符合標準的SFrame。

· Datatable — H2O無人駕駛AI的支柱。它是一個數據幀包,特別強調單節點速度和大數據支持。

 

榮譽獎:

· Vaex確實具有GPU和numba支持,但筆者沒有進行基準測試。

· Pandas —Pandas具有分塊功能,但在探索和動態交互方面,它與其他工具不同。

· cuDF (RapidAI) — GPU數據框軟件包是一個刺激的概念。對於大數據,必須使用帶有Dask的分佈式GPU來匹配數據大小,適合無底洞。

· H2O — 標準的內存數據框架是全面的。儘管如此,根據集羣是數據集四倍大小的建議,用戶需要有足夠的資金利用H2O進行勘探和開發。它另一個GPU版本也有相同的問題。

· Modin —一種在不更改後臺使用Dask或 Ray的API情況下縮放Pandas的工具。然而目前它只能讀取一個鑲木地板文件,而筆者已擁有一個分塊的鑲木地板數據集。程序員們有望通過Modin獲得與Dask數據幀類似的結果,所以此時將所有鑲木地板文件合併不是最佳選擇。

 

怎麼樣

筆者在AWS Sagemaker上使用了一個0.95美元/小時的ml.c5d.4xlige實例,可以輕鬆複製基準。它有16個vcpu,32GB的RAM加上500個SSD,這與一臺固態筆記本電腦有相似之處。

儘管所有競爭產品都可以讀取CSV文件,但更優化的方法是使用最適合每種技術的二進制版本。

對於PySpark、Koalas和Dask數據幀,我使用了Parquet,而對於Vaex,筆者使用了HDF5。Turicreates的SFrame具有特定的壓縮二進制版本。Datatable是jayformat優化的一種特殊情況。

儘管無法用Datatable讀取CSV文件,但Maarten Breddels還是破解了一種使用HDF5的方法,無論實例大小(即使在RAM中的數據大小是原來的兩倍多)。當Datatable能夠可靠地讀取多個CSV、Arrow或Parquet文件時,最好對工具進行更新。

筆者想指出的是,該基準測試的開發成本有點昂貴,技術在運行幾個小時後多次崩潰。

 

結果

編碼複雜度:只需關注API,就能瞭解每種技術的代碼量和設計模式。

 

決戰大數據之巔:Spark、Dask、Vaex、Pandas的正面交鋒

 

優勝者:Vaex,Dask DataFrame,Turicreate和Koalas的代碼非常類似於Pandas代碼(Koalas和Pandas代碼一樣),用戶可以輕鬆完成任何事情。

淘汰者:PySpark和Datatable具有自己的API設計,用戶必須學習和調整這些API。這項任務並不艱鉅,但如果你習慣使用了Pandas,這是一個限制。

 

特徵

優勝者:PySpark / Koalas和Dask DataFrame提供了各種各樣的功能。注意,在某些複雜情況下使用PySpark時,用戶可能需要“ map-reduce”知識來編寫算法以實現特定需求。

使用Dask DataFrame,用戶需要知道何時可以或不能使用sklearn功能,該功能無需佔用大量內存即可擴展。雖然Vaex和Turicreate缺少一些特定功能,但它們涵蓋了大多數核心功能。

淘汰者:Datatable的功能似乎還不成熟,而且遠遠落後於其他競爭者。

 

管道

決戰大數據之巔:Spark、Dask、Vaex、Pandas的正面交鋒

圖源:unsplash

 

通常,在爲機器學習和後端API構建解決方案時,用戶需要對流程進行編程。例如,在對列進行歸一化時,需要記住均值和標準差以對新觀察值進行歸一化。此時,簡單性,靈活性和代碼簡潔性至關重要。對於許多數據科學應用程序來說,該任務可能佔據整項工作的80%。

優勝者:Vaex。藉助自身表達系統,Vaex對數據集的任何轉換都將保存在後臺,以便用戶可以輕鬆地將其應用於新數據。這使得學習管道輕鬆化,管道運行實際上是在進行一項無任務導向的事情。

其次是Dask DataFrame,它具有各種預處理工具。但可能需要運行轉換器,並考慮可以有效處理哪些sklearn轉換器。

接下來是PySpark。即使構建管道是PySpark的強項之一,用戶需要編寫很多代碼才能實現該任務。不利於PySpark的另一件事是,模型和管道的安裝和部署絕非易事。你肯定需要(或傾向於)昂貴的平臺(例如Databricks和Domino),或嚴重依賴Sagemaker,Dataproc或Azure的基礎結構。

淘汰者:Koalas,Turicreate和 Datatable

Turicreate and Datatable不具備管道功能。儘管Koalas具有比PySpark更好的API,但對在創建管道方面相當不友好。用戶可以輕易將Koalas轉換爲PySpark數據幀並快速返回,但是對於管道功能而言,這很繁瑣,並且會帶來各種麻煩。

 

惰性計算

惰性計算是一項功能,僅在需要時才運行計算。例如,如果我有兩列A和B,則創建新的A * B列實際上需要0秒且沒有內存。如果我想查看該列的前幾個值,則僅計算那些值即可,而無需計算整個列。

惰性計算提速並簡化了使特徵工程和其勘察過程,並防止了在內存中存儲其他龐大的列數據。處理大型數據集時,例如設計新列,連接表或篩選太大而無法放在內存中的數據時,惰性計算的價值功能則相當明顯,因爲普通計算可能會導致計算機崩潰。

從性能角度來說,你會在下一節看到筆者創建了一個新列,然後計算了平均值。Dask 數據幀花費的時間比其他技術長10到200倍,筆者認爲此功能沒有得到很好的優化。不幸的是,儘管Koalas支持,但PySpark不支持惰性評估。

 

決戰大數據之巔:Spark、Dask、Vaex、Pandas的正面交鋒

圖源:unsplash

優勝者:Vaex, Datatable, Koalas和 Turicreate

淘汰者:PySpark和 Dask DataFrame

 

性能

這裏我想誤引喬治·博克斯的話:“所有的基準都是錯誤的,但有些是有用的。”各工具的性能可能會有所不同,筆者受到此博客的啓發,將每個基準測試運行兩次。考慮到首次運行與成批處理工作更相關(更能指示磁盤讀取速度),二次運行更能代表交互工作體驗(方法的實際速度)。

在以下所有圖表中:

· 藍色條表示首次運行,橙色條表示二次運行。

· TuricRate具有草圖功能,可以同時計算一系列統計和估計;它更適合於統計分析。

· 爲了更簡潔的名稱可視化,我使用別名:“dt”表示Datatable,“tc”表示Turicreate,“spark”表示PySpark,“dask”表示dask DataFrame。

 

基本統計

此處,筆者測試了一些基礎數據:平均值、標準差、值計數、兩列乘積的平均值,創建了一個惰性列並計算其平均值:

決戰大數據之巔:Spark、Dask、Vaex、Pandas的正面交鋒

 

· Vaex處於領先地位。

· Koalas得到了與PySpark相似的結果,這是合理的,因爲它在後臺使用了PySpark。

· Dask數據幀、Turicreate和Datatable性能相對落後。

 

繁重計算

筆者在兩列上使用均值和標準差進行分組,然後將其加入原始數據集並計算行數,這樣就不必處理內存中的整個合併數據集。筆者還運行了一個超級繁瑣複雜的數學表達式,以探索冗長特徵工程的過程影響。

決戰大數據之巔:Spark、Dask、Vaex、Pandas的正面交鋒

 

· Vaex在連接方面做得很好,它使圖形失真。

· Datatable在連接方面表現出色。此結果可能與我用HDF5包裝數據表的方式有關。我沒有加入所有的字符串列,這導致數據幀的佔用空間更少。因此它是黑馬,第二名!

· Dask DataFrame和Turicreate再次落後。

注意,當我在一個新創建的列上運行連接時,除了Vaex之外的所有技術都崩潰了,在規劃特徵工程時要考慮到這一點。

可以看到,Dask DataFrame和Turicreate性能落後,Vaex贏得了絕對的勝利。

過濾

此處,筆者首先過濾數據並重覆上述操作。此時Koalas,Datatable和Turicreate崩潰了。這些結果很好地體現了數據清洗性能。

決戰大數據之巔:Spark、Dask、Vaex、Pandas的正面交鋒

 

· 在大多數情況下,尤其是在第二輪比較中,Vaex似乎佔了上風。

· Dask數據幀並未崩潰,因此獲得了榮譽稱號,但結果比Vaex和PySpark慢5到100倍。

 

數量

下面是列表結果:

· 結果以秒爲單位。

· 缺少結果的地方,技術崩潰了。

· 小於一秒的值表示惰性計算。

· 交互式表格。

決戰大數據之巔:Spark、Dask、Vaex、Pandas的正面交鋒

 

優勝者:Vaex明顯勝利,亞軍是PySpark和Koalas

淘汰者:Dask DataFrame,Turicreate和Datatable

 

最後一點

此代碼允許用戶比較API並自己運行基準測試。所有數據集都可以以正確的二進制格式下載。我在使用Dask 數據幀時遇到了種種問題,爲了獲得最佳性能,我竭盡全力重新啓動內核,並在進行一些計算之前重新讀取了數據。

儘管過程很不愉快,但我還是盡了最大努力來獲得最佳性能。如果僅按原樣運行筆記本,則可能要等待幾個小時,不然可能會崩潰。正如預期的那樣,Koalas和PySpark的結果非常相似,因爲它們都在後臺使用Spark。

如前所述,我無法對文件中未保留的新創建列應用測試,因爲這會使Dask 數據幀和PySpark崩潰。爲了解決這個問題,我進一步計算了結果的平均值或計數,以強制使用單個值。我沒有使用任何字符串列,這是因爲破解Datatable對字符串列不起作用。

(免責聲明:我本人認識Turicreate的創建者之一,Spark的撰稿人和Vaex的主要開發人員,但我儘可能地保持公正去發表看法。)

決戰大數據之巔:Spark、Dask、Vaex、Pandas的正面交鋒

圖源:unsplash

自從Turicreate開源以來,筆者一直在使用Turicreate作爲它的首選軟件包,而在此之前,筆者一直使用PySpark,現在已改成Vaex。儘管狀態還處於起步階段,還有些粗糙,但是表達式和狀態轉移減少了因不常用功能而形成的代碼浪費,提升了編碼速度。

筆者對PySpark和Koalas的出色表現感到驚訝,但設置問題、使用非現有平臺部署解決方案、管道問題、開發過程中無法解釋的錯誤(以及常見的PySpark API問題)等麻煩依然存在。

Dask 數據幀是一個高難度挑戰。它崩潰了無數次,筆者經歷了多次考驗,以使其在性能上更具競爭力。

概言之,在基準測試開發過程中,PySpark和Dask DataFrame是時間成本最高、價格成本最大的。

決戰大數據之巔:Spark、Dask、Vaex、Pandas的正面交鋒

一起分享AI學習與發展的乾貨
歡迎關注全平臺AI垂類自媒體 “讀芯術”

(添加小編微信:dxsxbb,加入讀者圈,一起討論最新鮮的人工智能科技哦~)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章