天天看點

Python+大資料計算平台,PyODPS架構手把手教你搭建資料分析和機器學習PyODPS架構未來計劃

在2016年10月的雲栖社群線上教育訓練上,來自阿裡雲大資料事業部的秦續業分享了《雙劍合壁——python和大資料計算平台的結合實戰》。他主要介紹了資料分析和機器學習的方法、dataframe整體架構以及基礎api、前端、後端、機器學習的具體實作方法。

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

Python+大資料計算平台,PyODPS架構手把手教你搭建資料分析和機器學習PyODPS架構未來計劃

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

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

pandas

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

Python+大資料計算平台,PyODPS架構手把手教你搭建資料分析和機器學習PyODPS架構未來計劃

pyodps即利用python進行大資料分析,其架構如上圖所示。底層是基礎api,可以利用其操作maxcompute上的表、函數或者資源。再上面是dataframe架構,dataframe包括兩部分,一部分是前端,定義了一套表達式的操作,使用者寫的代碼會轉化成表達式樹,這與普通的語言是一樣的。使用者可以自定義函數,也可以進行可視化,與第三方庫進行互動。後端最下面是optimizer,其作用是對表達式樹進行優化。odps和pandas都是通過compiler和analyzer送出到engine來執行。

為什麼要做dataframe架構?

Python+大資料計算平台,PyODPS架構手把手教你搭建資料分析和機器學習PyODPS架構未來計劃

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

Python+大資料計算平台,PyODPS架構手把手教你搭建資料分析和機器學習PyODPS架構未來計劃

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

pyodps

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

Python+大資料計算平台,PyODPS架構手把手教你搭建資料分析和機器學習PyODPS架構未來計劃

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

Python+大資料計算平台,PyODPS架構手把手教你搭建資料分析和機器學習PyODPS架構未來計劃

從上圖可以看出,使用者從一個原始的collection來進行groupby操作,再進行列選擇的操作,最下面是source的collection。取了兩個字段species,這兩個字段是做by操作的,pental_length是進行聚合的操作取聚合值。species字段是直接取出來,shortest字段是進行加一的操作。

Python+大資料計算平台,PyODPS架構手把手教你搭建資料分析和機器學習PyODPS架構未來計劃

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

Python+大資料計算平台,PyODPS架構手把手教你搭建資料分析和機器學習PyODPS架構未來計劃

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

Python+大資料計算平台,PyODPS架構手把手教你搭建資料分析和機器學習PyODPS架構未來計劃

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

Python+大資料計算平台,PyODPS架構手把手教你搭建資料分析和機器學習PyODPS架構未來計劃

提供了visualize()來友善使用者進行可視化。在右邊的例子中可以看到,odsp sql後端會compile成一條sql執行。

Python+大資料計算平台,PyODPS架構手把手教你搭建資料分析和機器學習PyODPS架構未來計劃

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

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

有些操作比如value_counts,pandas本身支援,是以對于pandas後端,無需處理;對于odps

sql後端,沒有一個直接的操作來執行,是以在analyzer執行的時候,會被改寫成groupby + sort的操作;

還有一些算子,在compile到odps sql時,沒有内建函數能完成,會被改寫成自定義函數。

Python+大資料計算平台,PyODPS架構手把手教你搭建資料分析和機器學習PyODPS架構未來計劃

odps sql後端怎麼進行sql編譯再執行的操作?編譯器可以從上到下周遊表達式樹,找到join或者union。對于子過程,進行遞歸compile。再到engine來具體執行時,會使用analyzer對表達式樹進行改寫,compile自上而下的子過程,自底向上compile成sql子句,最終得到完整的sql語句,送出sql并傳回任務。

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

後端編譯出錯容易丢失上下文,多次optimize和analyze,導緻難以查出是之前哪處visit node導緻。解決:保證每個子產品獨⽴立性、測試完備;

bytecode相容問題,maxcompute隻支援python2.7的自定義函數的執行;

sql的執行順序。

Python+大資料計算平台,PyODPS架構手把手教你搭建資料分析和機器學習PyODPS架構未來計劃

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

分布式numpy,dataframe基于分布式numpy的後端;

記憶體計算,提升互動式體驗;

tensorflow。

Python+大資料計算平台,PyODPS架構手把手教你搭建資料分析和機器學習PyODPS架構未來計劃