PyODPS は、MaxCompute の Python 用ソフトウェア開発キット (SDK) です。Python を使用して MaxCompute のジョブ作成、テーブルやビューのクエリ、リソース管理を行うためのシンプルなプログラミングインターフェイスを提供します。PyODPS は、ファイルのアップロードとダウンロード、テーブルの作成、ODPS SQL クエリの実行など、ODPS コマンドラインインターフェイスと同様の機能を提供します。また、MapReduce ジョブの送信や MaxCompute のユーザー定義関数 (UDF) の使用など、高度な機能も備えています。本トピックでは、PyODPS の使用シナリオ、サポートツール、および重要な考慮事項について説明します。
機能の紹介
サポートツール
PyODPS は、ローカル環境、DataWorks、および PAI Notebook で実行できます。
使用するツールに関わらず、PyODPS ジョブを実行するために全データをローカルマシンにダウンロードすることは避けてください。この方法は大量のメモリを消費し、メモリ不足 (OOM) エラーを引き起こす可能性があります。代わりに、ジョブを MaxCompute にサブミットして分散実行してください。詳細な比較については、「注意事項: 全データをローカルマシンにダウンロードして PyODPS を実行しない」をご参照ください。
-
ローカル環境: ローカル環境に PyODPS をインストールして使用できます。詳細については、「ローカル環境での PyODPS の使用」をご参照ください。
-
DataWorks: DataWorks の PyODPS ノードには PyODPS がプリインストールされています。これらのノードで PyODPS ジョブを直接開発し、定期的に実行できます。詳細については、「DataWorks での PyODPS の使用」をご参照ください。
-
PAI Notebook: PAI Python 環境に PyODPS をインストールして実行できます。PyODPS は、PAI-Designer のカスタム Python コンポーネントなど、組み込みの PAI イメージにプリインストールされており、すぐに使用できます。PAI Notebook での PyODPS の使用方法は、標準的な使用方法と同様です。詳細については、「基本操作の概要」および「データフレーム (非推奨)」をご参照ください。
注意事項:全データをローカルマシンにダウンロードして PyODPS を実行しない
PyODPS は、PC、DataWorks の PyODPS ノード、PAI Notebook 環境など、さまざまなクライアント上で実行される SDK です。
PyODPS は、トンネルダウンロード、実行、to_pandas といった、データをローカルマシンに取得するための便利な操作をいくつか提供しています。その結果、多くの新規ユーザーは、データをローカルに取得して処理してから MaxCompute にアップロードし直そうと試みます。しかし、この方法は多くの場合、非常に非効率的です。データをローカルに取得すると、MaxCompute の大規模並列計算機能を活用できなくなります。
|
データ処理方法 |
説明 |
シナリオ例 |
|
ローカルマシンへのデータ取得による処理 (非推奨。OOM エラーを引き起こす可能性があります。) |
例えば、DataWorks の PyODPS ノードには、組み込みの PyODPS パッケージと必要な Python 環境が含まれています。このノードは、リソースが制限されたクライアント実行コンテナであり、MaxCompute のコンピューティングリソースを使用せず、厳密なメモリ制限があります。 |
PyODPS は、MaxCompute データを pandas データフレームに直接変換する |
|
MaxCompute へのジョブサブミットによる分散実行 (推奨) |
PyODPS の分散データフレーム機能を使用します。PyODPS クライアントノードでデータをダウンロードして処理する代わりに、主要な計算を MaxCompute にサブミットして分散実行します。これが PyODPS を正しく使用するための鍵です。 説明
SQL 実行結果をデータフレームに変換する場合は、まず
|
データ処理には PyODPS データフレームインターフェイスを使用します。各行を処理してテーブルに書き戻す、または 1 行を複数行に分割するなどの一般的なタスクには、PyODPS データフレームの これらのインターフェイスは、コードを SQL に変換して MaxCompute コンピューティングクラスターで分散実行します。これにより、ローカルメモリをほとんど消費せず、単一マシンでの計算と比較してパフォーマンスが大幅に向上します。 |
以下の形態素解析の例では、両方の方法のコードを比較します。
-
シナリオ例:
日次ログ文字列を分析して情報を抽出する必要があります。文字列型の単一列を含むテーブルがあります。jieba ライブラリを使用して中国語テキストを形態素解析し、必要なキーワードを見つけて、情報テーブルに保存する必要があります。
-
非効率的な処理コードのデモ:
import jieba t = o.get_table('word_split') out = [] with t.open_reader() as reader: for r in reader: words = list(jieba.cut(r[0])) # # processed_data を生成する処理ロジック # out.append(processed_data) out_t = o.get_table('words') with out_t.open_writer() as writer: writer.write(out)このアプローチは、単一マシン処理という考え方に基づいています。つまり、データを行ごとに読み取り、処理し、宛先テーブルに書き込みます。プロセス全体で、データのダウンロードとアップロードに長時間を要します。スクリプトを実行するマシンも、すべてのデータを処理するために大量のメモリを必要とします。DataWorks ノードのユーザーにとって、このアプローチは、デフォルトで割り当てられたメモリを超え、OOM エラーを引き起こしやすくなります。
-
効率的な処理コードのデモ:
from odps.df import output out_table = o.get_table('words') df = o.get_table('word_split').to_df() # 返す必要のあるフィールドと型を想定 out_names = ["word", "count"] out_types = ["string", "int"] @output(out_names, out_types) def handle(row): import jieba words = list(jieba.cut(row[0])) # # processed_data を生成する処理ロジック # yield processed_data df.apply(handle, axis=1).persist(out_table.name)apply メソッドを使用した分散実行:
-
複雑なロジックは handle 関数に記述します。この関数は自動的にシリアル化されてサーバー側に送られ、UDF として呼び出され、実行されます。handle 関数もサーバー側の実行中にデータを行ごとに処理するため、ロジックは同一です。違いは、このプログラムが MaxCompute にサブミットされて実行されると、複数のマシンが同時にデータを処理する点です。これにより、処理時間を大幅に短縮できます。
-
persist インターフェイスを呼び出すと、生成されたデータが別の MaxCompute テーブルに直接書き込まれます。すべてのデータの生成と消費は MaxCompute クラスター内で完結します。これにより、ローカルのネットワークリソースとメモリリソースが節約されます。
-
この例では、サードパーティパッケージも使用しています。MaxCompute では、UDF でこの例の
jiebaのようなサードパーティパッケージを使用できます。そのため、コード変更のコストを心配する必要はありません。主要なロジックをほとんど変更せずに、MaxCompute の大規模コンピューティング機能を活用できます。
-
制限事項
-
サンドボックスの制限により、pandas 計算バックエンドを使用してローカルでデバッグする一部のプログラムは、MaxCompute でデバッグできません。