1. 程式人生 > >Python+大資料計算平臺,PyODPS架構手把手教你搭建

Python+大資料計算平臺,PyODPS架構手把手教你搭建

在2016年10月的雲棲社群線上培訓上,來自阿里雲大資料事業部的秦續業分享了《雙劍合壁——Python和大資料計算平臺的結合實戰》。他主要介紹了資料分析和機器學習的方法、DataFrame整體架構以及基礎API、前端、後端、機器學習的具體實現方法。

本次視訊直播的整理文章整理完畢,如下內容。

資料分析和機器學習

9bed0bd850ac3c854151a370532c16738d0df9fc

大資料基本都是建立在Hadoop系統的生態上的,其實一個Java的環境。很多人喜歡用Python和R來進行資料分析,但是這往往對應一些小資料的問題,或者本地資料處理的問題。如何將二者進行結合使其具有更大的價值?Hadoop現有的生態系統和現有的Python環境如上圖所示。

MaxCompute

MaxCompute是面向離線計算的大資料平臺,提供TB/PB級的資料處理,多租戶、開箱即用、隔離機制確保安全。MaxCompute上主要分析的工具就是SQL,SQL非常簡單、容易上手,屬於描述型。Tunnel提供資料上傳下載通道,不需要經過SQL引擎的排程。

Pandas

Pandas是基於numpy的資料分析的工具,裡面最重要的結構是DataFrame,提供一系列繪圖的API,背後是matplotlib的操作,非常容易和Python第三方庫互動。

PyODPS架構

e280fd73cad955b1288760cf2d7f14a91381bf52

PyODPS即利用Python進行大資料分析,其架構如上圖所示。底層是基礎API,可以利用其操作MaxCompute上的表、函式或者資源。再上面是DataFrame框架,DataFrame包括兩部分,一部分是前端,定義了一套表示式的操作,使用者寫的程式碼會轉化成表示式樹,這與普通的語言是一樣的。使用者可以自定義函式,也可以進行視覺化,與第三方庫進行互動。後端最下面是Optimizer,其作用是對錶達式樹進行優化。ODPS和pandas都是通過compiler和analyzer提交到Engine來執行。

背景

為什麼要做DataFrame框架?

d0bfe89af3fed66453a477e75ab06e7ff0905078

對於任何一個大資料分析工具,都會面臨三個維度上的問題:表達力,API、語法、程式語言是否簡單、符合直覺?資料,儲存、元資料是否能壓縮、有效?引擎,計算的效能是否足夠?所以就會面臨pandas和SQL兩個選擇。

b2e61045c9e60724835726b6f13116206d42a10f

如上圖所示,pandas的表達力非常好,但是其資料只能放在記憶體中,引擎是單機的,受限於本機的效能。SQL的表達力有限,但是可以用於大量的資料,資料量小的時候沒有引擎的優勢,資料量大的時候引擎會變得很有優勢。ODPS的目標是綜合這兩者的優點。

PyODPS DataFrame

PyODPS DataFrame是使用Python語言寫的,可以使用Python的變數、條件判斷、迴圈。可以使用pandas類似的語法,定義了自己的一套前端,有了更好的表達力。後端可以根據資料來源來決定具體執行的引擎,是visitor的設計模式,可擴充套件。整個執行是延遲執行,除非使用者呼叫立即執行的方法,否則是不會直接執行的。

fd8adc266467d88c5f0b484a73527af2703a8b95

從上圖中可以看出,語法非常類似於pandas。

表示式和抽象語法樹

5227955b299aef4e2c09ce9de696cf4df702ddca

從上圖可以看出,使用者從一個原始的Collection來進行GroupBy操作,再進行列選擇的操作,最下面是Source的Collection。取了兩個欄位species,這兩個欄位是做By操作的,pental_length是進行聚合的操作取聚合值。Species欄位是直接取出來,shortest欄位是進行加一的操作。

Optimizer(操作合併)

1bd6133ff553c7c80c15138d0affdccbfc11df95

後端首先會使用Optimizer對錶達式樹進行優化,先做GroupBy,然後在上面做列選擇,通過操作合併可以去除petal_length做聚合操作,再加一,最終形成了GroupBy的Collection。

Optimizer(列剪枝)

501347d2b2ea938ee88643fe727bee725f8de710

使用者join了兩個data frame,再取來自data frame 的兩個列的時候,如果提交到一個大資料的環境,這樣一個過程是非常低下的,因為不是每個列都用到了。所以要對joined下的列進行剪枝操作。比如,data frame1我們只用到了其中的一個欄位,我們只需要將欄位截取出來做一個projection來形成新的Collection,data frame2也類似。這樣,對這兩部分進行校驗操作的時候就能極大的減少資料的輸出量。

Optimizer(謂詞下推)

23bc94bb362fdcb8bdc7f80f5901b1d6090d9652

如果對兩個data frame進行joined然後再分別進行過濾的話,這個過濾操作是應該下推到下面來執行的,這樣就能減少joined 的輸入的量。

視覺化

270ec903b6736f0c5e41d351a36e69bc8374ebab

提供了visualize()來方便使用者進行視覺化。在右邊的例子中可以看到,ODSP SQL後端會compile成一條SQL執行。

後端

0d719dc433e64ae858adda2d97a3fdaa0f0ee4c3

從上圖中可以看出,計算後端是非常靈活的。使用者甚至可以joined一個pandas的data frame和maxcompute上一個表的資料。

Analyzer

Analyzer的作用是針對具體的後端,將一些操作進行轉化。比如:

  • 有些操作比如value_counts,pandas本身支援,因此對於pandas後端,無需處理;對於ODPS SQL後端,沒有一個直接的操作來執行,所以在analyzer執行的時候,會被改寫成groupby + sort的操作;
  • 還有一些運算元,在compile到ODPS SQL時,沒有內建函式能完成,會被改寫成自定義函式。

ODPS SQL後端

42652599b70fda0e6411358958abe1e18c04bb02

ODPS SQL後端怎麼進行SQL編譯再執行的操作?編譯器可以從上到下遍歷表示式樹,找到Join或者Union。對於子過程,進行遞迴compile。再到Engine來具體執行時,會使用Analyzer對錶達式樹進行改寫,compile自上而下的子過程,自底向上compile成SQL子句,最終得到完整的SQL語句,提交SQL並返回任務。

pandas後端

首先訪問這個表示式樹,然後對每個表示式樹節點對應到pandas操作,整個表示式樹遍歷完之後就會形成DAG。Engine執行按DAG拓撲順序執行,不斷地把它應用到pandas操作,最終得到一個結果。對於大資料環境來說,pandas後端的作用是做本地DEBUG;當資料量很小時,我們可以使用pandas進行計算。

難點+坑

  • 後端編譯出錯容易丟失上下文,多次optimize和analyze,導致難以查出是之前哪處visit node導致。解決:保證每個模組獨⽴立性、測試完備;
  • bytecode相容問題,maxcompute只支援Python2.7的自定義函式的執行;
  • SQL的執行順序。

ML機器學習

22a5a9d3982cc046f166251553cf49251272e765

機器學習是輸入輸出一個data frame。比如,有一個iris的data frame,先用name欄位來做一個分類欄位,呼叫split方法將其分成60%的訓練資料和40%的測試資料。然後初始化一個RandomForests,其裡面有一棵決策樹,呼叫train方法訓練訓練資料,呼叫predict方法形成一個預測資料,呼叫segments[0]就可以看到視覺化結果。

未來計劃

  • 分散式numpy,DataFrame基於分散式numpy的後端;
  • 記憶體計算,提升互動式體驗;
  • Tensorflow

35a12d1cfb9f44bb6eead5bf43e9e0ca60393eff

原文連結:

http://click.aliyun.com/m/13965/