MaxCompute Mars 完全指南

Mars 簡介

Mars 能利用並行和分佈式技術,加速 Python 數據科學棧,包括 numpypandasscikit-learn。同時,也能輕鬆與 TensorFlow、PyTorch 和 XGBoost 集成。

Mars tensor 的接口和 numpy 保持一致,但支持大規模高維數組。樣例代碼如下。

import mars.tensor as mt

a = mt.random.rand(10000, 50)
b = mt.random.rand(50, 5000)
a.dot(b).execute()

Mars DataFrame 接口和 pandas 保持一致,但可以支撐大規模數據處理和分析。樣例代碼如下。

import mars.dataframe as md                                                                                       

ratings = md.read_csv('Downloads/ml-20m/ratings.csv') 
movies = md.read_csv('Downloads/ml-20m/movies.csv') 
movie_rating = ratings.groupby('movieId', as_index=False).agg({'rating': 'mean'}) 
result = movie_rating.merge(movies[['movieId', 'title']], on='movieId') 
result.sort_values(by='rating', ascending=False).execute() 

Mars learn 保持和 scikit-learn 接口一致。樣例代碼如下。

import mars.dataframe as md
from mars.learn.neighbors import NearestNeighbors

df = md.read_csv('data.csv') 
nn = NearestNeighbors(n_neighbors=10)
nn.fit(df)
neighbors = nn.kneighbors(df).fetch()

Mars learn 可以很方便地與 TensorFlow、PyTorch 和 XGBoost 集成,點擊鏈接查看文檔。

在 MaxCompute 上使用 Mars,我們提供了簡單易用的接口來拉起 Mars 集羣,用戶不需要關心安裝和維護集羣。同時,通過 MaxCompute 拉起的 Mars,也支持直接讀寫 MaxCompute 表。

申請試用

目前我們採用申請開通的方式,公共雲用戶請提工單申請。

環境準備

要在 MaxCompute 上運行 Mars,需要有相應的運行環境。這可以分爲如下幾種情況。

  1. 開箱即用的環境,如 dataworks,會包含所需要的依賴。
  2. 其他環境,需要自己安裝相關依賴。

我們分別展開。

開箱即用的環境

開箱即用的環境,如 dataworks 的 pyodps3 節點,已經包含了 PyODPS 和 Mars。

在新建的 pyodps3 節點裏運行如下命令檢查版本,確保滿足要求。

from odps import __version__ as odps_version
from mars import __version__ as mars_version

print(odps_version)
print(mars_version)

輸出的第一個爲 PyODPS 版本,第二個爲 Mars 版本。要求 PyODPS 至少是 0.9.0

其他環境

這個環境就要求通過 pip 安裝 PyODPS 和 Mars。Python 版本推薦使用 3.7 版本,至少需要是 3.5 版本。

通過如下命令安裝:

pip install -U pip  # 可選,確保 pip 版本足夠新
pip install pyarrow==0.11.1  # 目前 pyarrow 版本固定到 0.11.1
pip install pyodps>0.9.0  # pyodps 需要至少 0.9.0
pip install pymars>=0.4.0rc1  # mars 版本需要至少是 0.4.0rc1

準備 ODPS 入口

ODPS 入口是 MaxCompute 所有操作的基礎:

  • 對於開箱即用的環境,如 dataworks,我們會自動創建 o 即 ODPS 入口實例,因此可以不需要創建。
  • 對於其他環境,需要通過 access_idaccess_key 等參數創建,詳細參考 文檔

基本概念

  • MaxCompute 任務實例:MaxCompute 上任務以 instance 概念存在。Mars 集羣也是通過一個 MaxCompute Instance 拉起。
  • Logview 地址:每個 MaxCompute instance 包含一個 logview 地址來查看任務狀態。拉起 Mars 集羣的 instance 也不例外。
  • Mars UI: Mars 集羣拉起後,會包含一個 Web UI,通過這個 Web UI,可以查看 Mars 集羣、任務狀態,可以提交任務。當集羣拉起後,一般來說就不需要和 MaxCompute 任務實例交互了。
  • Mars session:Mars session 和具體的執行有關,一般情況下用戶不需要關心 session,因爲會包含默認的 session。通過 o.create_mars_cluster 創建了 Mars 集羣后,會創建默認連接到 Mars 集羣的 session。
  • Jupyter Notebook:Jupyter Notebook 是一個基於網頁的用於交互式計算的應用程序,可以用來開發、文檔編寫、運行代碼和展示結果。

基礎用法

創建 Mars 集羣

準備好環境後,接着我們就可以拉起 Mars 集羣了。

有了 o 這個對象後,拉起 Mars 集羣非常簡單,只需要運行如下代碼。

from odps import options
options.verbose = True  # 在 dataworks pyodps3 裏已經設置,所以不需要前兩行代碼
client = o.create_mars_cluster(5, 4, 16, min_worker_num=3)

這個例子裏指定了 worker 數量爲 5 的集羣,每個 worker 是4核、16G 內存的配置,min_worker_num 指當 worker 已經起了3個後,就可以返回 client 對象了,而不用等全部 5 個 worker 都啓動再返回。Mars 集羣的創建過程可能比較慢,需要耐心等待。

注意:申請的單個 worker 內存需大於 1G,CPU 核數和內存的最佳比例爲 1:4,例如單 worker 4核、16G。同時,新建的 worker 個數也不要超過 30 個,否則會對鏡像服務器造成壓力,如果需要使用超過 30 個 worker,請工單申請。

這個過程中會打印 MaxCompute instance 的 logview、 Mars UI 以及 Notebook 地址。Mars UI 可以用來連接 Mars 集羣,亦可以用來查看集羣、任務狀態。

Mars 集羣的創建就是一個 MaxCompute 任務,因此也有 instance id、logview 等 MaxCompute 通用的概念。

提交作業

Mars 集羣創建的時候會設置默認 session,通過 .execute() 執行時任務會被自動提交到集羣。

import mars.dataframe as md
import mars.tensor as mt

md.DataFrame(mt.random.rand(10, 3)).execute()  # execute 自動提交任務到創建的集羣

停止並釋放集羣

目前一個 Mars 集羣超過3天就會被自動釋放。當 Mars 集羣不再需要使用時,也可以通過調用 client.stop_server() 手動釋放:

client.stop_server()

MaxCompute 表讀寫支持

Mars 可以直讀和直寫 MaxCompute 表。

讀表

通過 o.to_mars_dataframe 來讀取 MaxCompute 表,並返回 Mars DataFrame

In [1]: df = o.to_mars_dataframe('test_mars')
In [2]: df.head(6).execute()
Out[2]: 
       col1  col2
0        0    0
1        0    1
2        0    2
3        1    0
4        1    1
5        1    2

寫表

通過 o.persist_mars_dataframe(df, 'table_name') 將 Mars DataFrame 保存成 MaxCompute 表。

In [3]: df = o.to_mars_dataframe('test_mars')
In [4]: df2 = df + 1
In [5]: o.persist_mars_dataframe(df2, 'test_mars_persist')  # 保存 Mars DataFrame
In [6]: o.get_table('test_mars_persist').to_df().head(6)  # 通過 PyODPS DataFrame 查看數據
       col1  col2
0        1    1
1        1    2
2        1    3
3        2    1
4        2    2
5        2    3

使用 Mars 集羣自帶的 Jupyter Notebook

創建 Mars 集羣會自動創建一個 Jupyter Notebook 以編寫代碼。

新建一個 Notebook 會自動設置 session,提交任務到集羣。因此在這個 notebook 內也不需要顯示創建 session

import mars.dataframe as md

md.DataFrame(mt.random.rand(10, 3)).sum().execute() # 在 notebook 裏運行,execute 自動提交到當前集羣

有一點要注意:這個 notebook 不會保存你的 notebook 文件,所以要記得自行保存

用戶也可以使用自己的 notebook 連接到集羣,此時參考 使用已經創建的 Mars 集羣

其他用法

使用已經創建的 Mars 集羣

首先,我們可以通過 instance id 重建 Mars 集羣的 client。

client = o.create_mars_cluster(instance_id=**instance-id**)

如果只是想使用 Mars,可以使用 Mars session 來連接。給定 Mars UI 的地址。則:

from mars.session import new_session
new_session('**Mars UI address**').as_default() # 設置爲默認 session

獲取 Mars UI 地址

Mars 集羣創建的時候指定了 options.verbose=True 會打印 Mars UI 地址。

也可以通過 client.endpoint 來獲取 Mars UI。

print(client.endpoint)

獲取 Logview 地址

創建集羣的時候指定了 options.verbose=True 會自動打印 logview。

也可以通過 client.get_logview_address() 獲取 logview 地址。

print(client.get_logview_address())

獲取 Jupyter Notebook 地址

Mars 集羣創建的時候指定了 options.verbose=True 會打印 Jupyter Notebook 地址。

也可以通過 client.get_notebook_endpoint() 獲取 Jupyter Notebook 地址。

print(client.get_notebook_endpoint())

Mars 和 PyODPS DataFrame 對比

會有同學關心,何時使用 Mars,何時使用 PyODPS DataFrame。我們分別闡述。

適合 Mars 的使用場景。

  • 如果你經常使用 PyODPS DataFrame 的 to_pandas() 方法,將 PyODPS DataFrame 轉成 pandas DataFrame,推薦使用 Mars DataFrame。
  • Mars DataFrame 目標是完全兼容 pandas 的接口以及行爲,如果你熟悉 pandas 的接口,而不願意學習 PyODPS DataFrame 的接口,那麼使用 Mars。
  • Mars DataFrame 因爲兼容 pandas 的行爲,因此如下的特性如果你需要用到,那麼使用 Mars。

    • Mars DataFrame 包含行和列索引,如果需要使用索引,使用 Mars。
    • Mars DataFrame 創建後會保證順序,通過 iloc 等接口可以獲取某個偏移的數據。如 df.iloc[10] 可以獲取第10行數據。此外,如 df.shift()df.ffill() 等需要有保證順序特性的接口也在 Mars DataFrame 裏得到了實現,有這方面的需求可以使用 Mars。
  • Mars 還包含 Mars tensor 來並行和分佈式化 Numpy,以及 Mars learn 來並行和分佈式化 scikit-learn、以及支持在 Mars 集羣裏分佈式運行 TensorFlow、PyTorch 和 XGBoost。有這方面的需求使用 Mars。
  • Mars 集羣一旦創建,後續不再需要通過 MaxCompute 調度,任務可以直接提交到 Mars 集羣執行;此外,Mars 對於中小型任務(數據量 T 級別以下),會有較好的性能。這些情況可以使用 Mars。

適合 PyODPS DataFrame 的使用場景

  • PyODPS DataFrame 會把 DataFrame 任務編譯成 MaxCompute SQL 執行,如果希望依託 MaxCompute 調度任務,使用 PyODPS DataFrame。
  • PyODPS DataFrame 會編譯任務到 MaxCompute 執行,由於 MaxCompute 相當穩定,而 Mars 相對比較新,如果對穩定性有很高要求,那麼使用 PyODPS DataFrame。
  • 數據量特別大(T 級別以上),使用 PyODPS DataFrame。

Mars 參考文檔

技術支持

技術支持請加 PyODPS 釘釘羣:11701793

FAQ

Q:一個用戶創建的 Mars 集羣,別人能不能用。

A:可以,參考 使用已經創建的 Mars 集羣

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