MaxCompute は、Python ユーザー定義関数 (UDF) でのサードパーティパッケージをサポートしています。パッケージの種類によって、アップロードと登録のプロセスは異なります。このトピックでは、NumPy パッケージ (Python 3)、コンパイルが必要なパッケージ、ダイナミックリンクライブラリ (DLL) に依存するパッケージの 3 つのシナリオについて説明します。
前提条件
開始する前に、以下が準備できていることを確認してください:
-
Python がインストールされていること (Python 3 を推奨)
-
MaxCompute クライアントがインストールおよび設定されていること — 詳細については、「MaxCompute クライアントのインストールと設定」をご参照ください
-
パッケージのコンパイルが必要な場合は、pip、setuptools、wheel がインストールされていること:
pip install setuptools pip install wheel -
パッケージが GDAL 3.0 以降に依存する場合は、PROJ 6 がインストールされていること
-
Windows でコンパイルする場合は、Docker がインストールされていること — 詳細については、「Docker ドキュメント」をご参照ください
シナリオの選択
| シナリオ | 使用する状況 |
|---|---|
| Python 3 UDF での NumPy パッケージの参照 | Python 3 で NumPy が必要な場合。NumPy は Python 2 にプリインストールされているため、Python 2 ではアップロードは不要です。 |
| コンパイルが必要なパッケージの参照 | パッケージが PyPI の TAR.GZ ファイル、またはルートディレクトリに setup.py ファイルを含む GitHub のソースコードパッケージである場合。 |
| DLL に依存するパッケージの参照 | お客様のパッケージは、GDAL 3.0.4 などの DLL に依存しています。 |
Python 3 UDF での NumPy パッケージの参照
このシナリオは、Python 3 を使用しており、NumPy ライブラリが必要な場合に使用します。NumPy は Python 2 にプリインストールされているため、Python 2 では手動でのアップロードは不要です。
-
PyPI 上の NumPy ページ に移動し、[ダウンロード ファイル] セクションで、名前が
cp37-cp37m-manylinux1_x86_64.whlで終わるパッケージをダウンロードします。この例では NumPy 1.19.2 を使用しています。他のサフィックスを持つパッケージは、ランタイムで失敗する可能性があります。別のバージョンを使用するには、[リリース履歴] を [ナビゲーション] セクションでクリックして、過去のリリースを参照してください。
-
ダウンロードしたファイルの名前を変更し、拡張子を
.whlから.zipに変更します。例:numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zip -
MaxCompute クライアントを使用して、
.zipパッケージを MaxCompute プロジェクトにアップロードします。詳細については、「リソース操作」をご参照ください。ADD ARCHIVE D:\Downloads\numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zip -f; -
Python UDF スクリプトを作成し、
.pyファイルとして保存します。この例では、ファイルをimport_numpy.pyとして保存します。from odps.udf import annotate @annotate("->string") class TryImport(object): # クラス名は TryImport です。 def __init__(self): import sys sys.path.insert(0, 'work/numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zip') # work/ の後のファイル名をパッケージ名に合わせて更新してください。 def evaluate(self): import numpy return "import succeed" -
スクリプトをリソースとして MaxCompute プロジェクトにアップロードします。
ADD PY D:\Desktop\import_numpy.py -f; -
アップロードしたスクリプトと NumPy パッケージを使用して UDF を作成します。詳細については、「関数操作」をご参照ください。この例では、UDF に
numpyという名前を付けます。リソースリストに NumPy の.zipファイルを含めます。CREATE FUNCTION numpy AS 'import_numpy.TryImport' USING 'doc_test_dev/resources/import_numpy.py,numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zip'; -
SQL ステートメントで UDF を呼び出します。SQL を実行する前に Python 3 を有効にする必要があります。詳細については、「Python 3 UDF」をご参照ください。
コンパイルが必要なパッケージの参照
このシナリオは、パッケージが PyPI の TAR.GZ ファイル、またはルートディレクトリに setup.py ファイルを含む GitHub のソースコードパッケージである場合に使用します。MaxCompute と互換性のある環境で setup.py をコンパイルして WHL パッケージを生成し、それをアップロードして UDF を作成する必要があります。
サードパーティパッケージは Linux 環境で実行されます。互換性の問題を避けるため、Linux でコンパイルしてください。Windows を使用している場合は、Docker を使用します。
Linux でのコンパイル
コンパイルする前に、ご利用の環境が以下の要件を満たしていることを確認してください:
Python の互換性:次のコマンドを実行して ABI タグを確認します:
python -c "import wheel.pep425tags; print(wheel.pep425tags.get_abi_tag())"
-
cp27mまたはcp37mが返された場合、Python のバージョンは互換性があります。 -
cp27muまたはcp37muが返された場合は、./configure --enable-unicode=ucs2を実行して、エンコード形式を UCS-2 に切り替えます。
GNU Compiler Collection (GCC) の互換性:GCC 4.9.2 以前を使用してください。それ以降のバージョンでは、MaxCompute と互換性のない .so ファイルが生成される可能性があります。
環境の準備ができたら、以下の手順を実行します:
-
パッケージを解凍し、
setup.pyを含むディレクトリに移動します。例:GDAL-3.2.0.zipを解凍した後、setup.pyファイルはD:\Downloads\GDAL-3.2.0にあります。
cd D:\Downloads\GDAL-3.2.0 -
bdist_wheelが利用可能かどうかを確認します:python setup.py --help-command-
出力に
bdist_wheelが表示された場合は、次のステップに進みます。 -
bdist_wheelがリストにない場合は、setup.pyを開き、from distutils.core import setupをfrom setuptools import setupに変更してから進みます。
-
-
setup.pyをコンパイルして WHL パッケージを生成します:python setup.py bdist_wheelWHL パッケージは
distフォルダに保存されます。
WHL パッケージを生成した後、その拡張子を .whl から .zip に変更し、リソースとしてアップロードして UDF を作成します。「Python 3 UDF での NumPy パッケージの参照」と同じ手順に従ってください。
Docker を使用した Windows でのコンパイル
Windows では、quay.io/pypa/manylinux2010_x86_64 イメージから Docker コンテナ内でコンパイルします。必要なバージョンの Python バイナリは次の場所にあります:
-
Python 2:
/opt/python/cp27-cp27m/bin/python -
Python 3:
/opt/python/cp37-cp37m/bin/python3
コンテナ内で python setup.py bdist_wheel を実行して WHL パッケージを生成し、その拡張子を .whl から .zip に変更し、「Python 3 UDF での NumPy パッケージの参照」のアップロードと UDF 作成の手順に従ってください。
DLL に依存するパッケージの参照
このシナリオは、パッケージが DLL に依存する場合に使用します。この例では、libgdal と numpy に依存する GDAL 3.0.4 を使用します。コンパイルは quay.io/pypa/manylinux2010_x86_64 イメージの Docker コンテナ内で行われます。進める前に Docker がインストールされていることを確認してください — 詳細については、「Docker ドキュメント」をご参照ください。
ステップ 1:依存関係の確認
PyPI の GDAL ページに移動し、[依存関係] セクションを確認します。
GDAL 3.0.4 は libgdal と numpy を必要とします。libgdal はソースからコンパイルし、numpy は別途取得します。
ステップ 2:NumPy パッケージの取得
以下のいずれかの方法を使用します:
-
PyPI の NumPy ページ に移動し、[ファイルをダウンロード] セクションで、
cp37-cp37m-manylinux1_x86_64.whlで終わるパッケージをダウンロードします。Python 2 の場合は、[ナビゲーション] セクションで [リリース履歴] をクリックし、バージョン 1.16.6 以前を選択して、cp27-cp27m-manylinux1_x86_64.whlで終わるパッケージをダウンロードします。 -
コンテナ内で次のコマンドを実行して、NumPy を直接ダウンロードします:
/opt/python/cp37-cp37m/bin/pip download numpy -d ./
ステップ 3:.so ライブラリファイルのコンパイル
-
GDAL 3.0.4 のソースコードをダウンロードし、お使いのマシンに解凍します。
-
Docker イメージをプルし、コンテナを起動します:
docker pull quay.io/pypa/manylinux2010_x86_64 docker run -it quay.io/pypa/manylinux1_x86_64 /bin/bash -
GDAL のソースコードをコンテナにコピーします。
<CONTAINER ID>を実際のコンテナ ID に置き換えてください (取得方法については「docker ps」をご参照ください):docker cp ./gdal-3.0.4 <CONTAINER ID>:/opt/source/ -
コンテナ内で GDAL のソースコードをコンパイルします。完全なビルド手順については、「BuildingOnUnix」をご参照ください。
# configure ステップで PROJ 6 のインストールディレクトリを指定します。 ./configure --prefix=/path/to/install/prefix --with-proj=/path/to/install/proj6/prefix make make install export PATH=/path/to/install/prefix/bin:$PATH export LD_LIBRARY_PATH=/path/to/install/prefix/lib:$LD_LIBRARY_PATH export GDAL_DATA=/path/to/install/prefix/share/gdal # ビルドを検証します。 gdalinfo --versionコンパイル中にエラーが発生した場合:
-
configure: error: PROJ 6 symbols not found— GDAL 3.0 以降をサポートするために PROJ 6 をインストールしてください。 -
fatal error: zlib.h: No such file or directory—yum install zlib-develを実行してリトライしてください。
-
-
コンテナから 2 つの
.soライブラリファイル (シンボリックリンクではない) をお使いのマシンにコピーします:-
GDAL インストールディレクトリの
libフォルダにあるlibgdal.so -
PROJ 6 インストールディレクトリの
libフォルダにあるlibproj.so
-
ステップ 4:GDAL WHL パッケージの生成
コンテナ内で次のコマンドを実行します。詳細なコンテキストについては、「BuildingOnUnix」をご参照ください。
# 必要に応じて NumPy をインストールします。
/opt/python/cp37-cp37m/bin/pip install numpy
# GDAL Python バインディングディレクトリに切り替えます。
cd swig/python
# WHL パッケージを生成します。出力:dist/GDAL-3.0.4-cp37-cp37m-linux_x86_64.whl
/opt/python/cp37-cp37m/bin/python setup.py bdist_wheel
ステップ 5:リソースのアップロードと UDF の作成
-
WHL パッケージのファイル拡張子を
.whlから.zipに変更します。 -
リソースを MaxCompute プロジェクトにアップロードします:
-
libgdal.soとlibproj.soをファイルリソースとしてアップロードします。 -
numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zipとGDAL-3.0.4-cp37-cp37m-linux_x86_64.zipをアーカイブリソースとしてアップロードします。
-
-
UDF を作成し、4 つのファイルすべてをリソースリストに追加します:
libgdal.so、libproj.so、numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zip、およびGDAL-3.0.4-cp37-cp37m-linux_x86_64.zip。アップロードと UDF 作成の手順については、「Python 3 UDF での NumPy パッケージの参照」をご参照ください。以下のサンプル Python 3 UDF コードは GDAL をインポートします:# coding: utf-8 from odps.udf import annotate from odps.distcache import get_cache_file def include_file(file_name): import os, sys so_file = get_cache_file(file_name, 'b') with open(so_file.name, 'rb') as fp: content = fp.read() so = open(file_name, "wb") so.write(content) so.flush() so.close() @annotate("->string") class TryImport(object): def __init__(self): import sys include_file('libgdal.so.26') include_file('libproj.so.15') sys.path.insert(0, 'work/GDAL-3.0.4-cp37-cp37m-linux_x86_64.zip') # work/ の後のファイル名をコンパイルした GDAL パッケージに合わせて更新してください。 sys.path.insert(0, 'work/numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zip') # work/ の後のファイル名を NumPy パッケージに合わせて更新してください。 def evaluate(self): from osgeo import gdal from osgeo import ogr from osgeo import osr from osgeo import gdal_array from osgeo import gdalconst return "import succeed"libgdal.so.26またはlibproj.so.15が見つからないというエラーが発生した場合は、include_file()の呼び出しでファイル名を、システム上の実際のバージョン付き.soファイル名と一致するように更新してください (例:libgdal.soをlibgdal.so.26に変更)。Python 2 の場合、get_cache_fileパラメーターは異なります。「Python 2 で UDF を開発する」トピックの「リソースの参照」をご参照ください。
次のステップ
-
Python 3 UDF — Python 3 を有効にし、実行環境について学びます
-
リソース操作 — MaxCompute でリソースを管理します
-
関数操作 — UDF を作成および管理します