MaxCompute mendukung penggunaan paket pihak ketiga dalam user-defined function (UDF) Python. Bergantung pada jenis paketnya, proses unggah dan registrasi berbeda. Topik ini mencakup tiga skenario: paket NumPy (Python 3), paket yang memerlukan kompilasi, dan paket yang bergantung pada dynamic-link library (DLL).
Prasyarat
Sebelum memulai, pastikan Anda telah:
-
Python telah terinstal (disarankan menggunakan Python 3)
-
menginstal dan mengonfigurasi MaxCompute client — lihat Instal dan konfigurasi MaxCompute client
-
menginstal pip, setuptools, dan wheel jika paket Anda memerlukan kompilasi:
pip install setuptools pip install wheel -
menginstal PROJ 6 jika paket Anda bergantung pada GDAL 3.0 atau versi lebih baru
-
menginstal Docker jika Anda berencana melakukan kompilasi di Windows — lihat dokumentasi Docker
Pilih skenario
| Skenario | Gunakan saat |
|---|---|
| Referensikan paket NumPy dalam UDF Python 3 | Anda membutuhkan NumPy di Python 3. NumPy sudah pra-instal di Python 2, sehingga tidak perlu diunggah secara manual untuk Python 2. |
| Paket referensi yang memerlukan kompilasi | Paket Anda berupa file TAR.GZ dari PyPI atau paket kode sumber dari GitHub yang berisi file setup.py di direktori root-nya. |
| Mereferensikan paket yang bergantung pada DLL | Paket Anda bergantung pada DLL, seperti GDAL 3.0.4. |
Referensikan paket NumPy dalam UDF Python 3
Gunakan jalur ini saat: Anda menggunakan Python 3 dan membutuhkan pustaka NumPy. NumPy sudah pra-instal di Python 2, sehingga tidak perlu unggah manual untuk Python 2.
-
Buka halaman NumPy di PyPI dan, di bagian Download files, unduh paket yang namanya diakhiri dengan
cp37-cp37m-manylinux1_x86_64.whl. Contoh ini menggunakan NumPy 1.19.2. Paket dengan akhiran lain mungkin gagal saat runtime. Untuk menggunakan versi berbeda, klik Release history di bagian Navigation untuk menelusuri rilis historis.
-
Ubah nama file yang diunduh dengan mengganti ekstensinya dari
.whlmenjadi.zip. Contoh:numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zip -
Unggah paket
.zipke proyek MaxCompute Anda menggunakan MaxCompute client. Untuk detailnya, lihat Operasi resource.ADD ARCHIVE D:\Downloads\numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zip -f; -
Buat skrip UDF Python dan simpan sebagai file
.py. Contoh ini menyimpan file sebagaiimport_numpy.py.from odps.udf import annotate @annotate("->string") class TryImport(object): # Nama kelas adalah TryImport. def __init__(self): import sys sys.path.insert(0, 'work/numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zip') # Perbarui nama file setelah work/ agar sesuai dengan nama paket Anda. def evaluate(self): import numpy return "import succeed" -
Unggah skrip tersebut ke proyek MaxCompute Anda sebagai resource.
ADD PY D:\Desktop\import_numpy.py -f; -
Buat UDF menggunakan skrip dan paket NumPy yang telah diunggah. Untuk detailnya, lihat Operasi fungsi. Contoh ini memberi nama UDF
numpy. Sertakan file.zipNumPy dalam daftar resource.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'; -
Panggil UDF dalam pernyataan SQL. Python 3 harus diaktifkan sebelum menjalankan SQL. Untuk detailnya, lihat Python 3 UDF.
Paket referensi yang memerlukan kompilasi
Gunakan jalur ini saat: Paket Anda berupa file TAR.GZ dari PyPI atau paket kode sumber dari GitHub yang berisi file setup.py di direktori root-nya. Anda harus mengompilasi setup.py untuk menghasilkan paket wheel di lingkungan yang kompatibel dengan MaxCompute, lalu mengunggahnya dan membuat UDF.
Paket pihak ketiga dijalankan di lingkungan Linux. Lakukan kompilasi di Linux untuk menghindari masalah kompatibilitas. Jika Anda menggunakan Windows, gunakan Docker.
Kompilasi di Linux
Sebelum mengompilasi, verifikasi bahwa lingkungan Anda memenuhi persyaratan berikut:
Kompatibilitas Python: Jalankan perintah berikut untuk memeriksa tag ABI:
python -c "import wheel.pep425tags; print(wheel.pep425tags.get_abi_tag())"
-
Jika mengembalikan
cp27mataucp37m, versi Python tersebut kompatibel. -
Jika mengembalikan
cp27muataucp37mu, jalankan./configure --enable-unicode=ucs2untuk mengubah format encoding ke UCS-2.
Kompatibilitas GNU Compiler Collection (GCC): Gunakan GCC 4.9.2 atau versi sebelumnya. Versi yang lebih baru dapat menghasilkan file .so yang tidak kompatibel dengan MaxCompute.
Setelah lingkungan Anda siap:
-
Ekstrak paket dan arahkan ke direktori yang berisi
setup.py. Contoh: setelah mengekstrakGDAL-3.2.0.zip, filesetup.pyberada diD:\Downloads\GDAL-3.2.0.
cd D:\Downloads\GDAL-3.2.0 -
Periksa apakah
bdist_wheeltersedia:python setup.py --help-command-
Jika
bdist_wheelmuncul dalam output, lanjutkan ke langkah berikutnya. -
Jika
bdist_wheeltidak tercantum, bukasetup.py, ubahfrom distutils.core import setupmenjadifrom setuptools import setup, lalu lanjutkan.
-
-
Kompilasi
setup.pyuntuk menghasilkan paket wheel:python setup.py bdist_wheelPaket wheel disimpan di folder
dist.
Setelah menghasilkan paket wheel, ubah ekstensinya dari .whl menjadi .zip, lalu unggah sebagai resource dan buat UDF. Ikuti langkah-langkah yang sama seperti pada Referensikan paket NumPy dalam UDF Python 3.
Kompilasi di Windows menggunakan Docker
Di Windows, lakukan kompilasi di dalam kontainer Docker dari image quay.io/pypa/manylinux2010_x86_64. Binari Python untuk versi yang diperlukan tersedia di:
-
Python 2:
/opt/python/cp27-cp27m/bin/python -
Python 3:
/opt/python/cp37-cp37m/bin/python3
Jalankan python setup.py bdist_wheel di dalam kontainer untuk menghasilkan paket wheel, lalu ubah ekstensinya dari .whl menjadi .zip dan ikuti langkah unggah serta pembuatan UDF pada Referensikan paket NumPy dalam UDF Python 3.
Referensikan paket yang bergantung pada DLL
Gunakan jalur ini saat: Paket Anda bergantung pada DLL. Contoh ini menggunakan GDAL 3.0.4, yang bergantung pada libgdal dan numpy. Kompilasi dilakukan di dalam kontainer Docker dari image quay.io/pypa/manylinux2010_x86_64. Pastikan Docker telah diinstal sebelum melanjutkan — lihat dokumentasi Docker.
Langkah 1: Periksa dependensi
Buka halaman GDAL di PyPI dan tinjau bagian Dependencies.
GDAL 3.0.4 memerlukan libgdal dan numpy. Anda akan mengompilasi libgdal dari kode sumber dan memperoleh numpy secara terpisah.
Langkah 2: Dapatkan paket NumPy
Gunakan salah satu metode berikut:
-
Buka halaman NumPy di PyPI dan, di bagian Download files, unduh paket yang diakhiri dengan
cp37-cp37m-manylinux1_x86_64.whl. Untuk Python 2, klik Release history di bagian Navigation, pilih versi 1.16.6 atau sebelumnya, lalu unduh paket yang diakhiri dengancp27-cp27m-manylinux1_x86_64.whl. -
Jalankan perintah berikut di dalam kontainer untuk mengunduh NumPy secara langsung:
/opt/python/cp37-cp37m/bin/pip download numpy -d ./
Langkah 3: Kompilasi file pustaka .so
-
Unduh kode sumber GDAL 3.0.4 dan ekstrak ke mesin Anda.
-
Ambil image Docker dan mulai kontainer:
docker pull quay.io/pypa/manylinux2010_x86_64 docker run -it quay.io/pypa/manylinux1_x86_64 /bin/bash -
Salin kode sumber GDAL ke dalam kontainer. Ganti
<CONTAINER ID>dengan ID kontainer aktual (lihat docker ps untuk cara mendapatkannya):docker cp ./gdal-3.0.4 <CONTAINER ID>:/opt/source/ -
Kompilasi kode sumber GDAL di dalam kontainer. Untuk instruksi build lengkap, lihat BuildingOnUnix.
# Tentukan direktori instalasi PROJ 6 pada langkah configure. ./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 # Verifikasi build. gdalinfo --versionJika Anda mengalami error selama kompilasi:
-
configure: error: PROJ 6 symbols not found— instal PROJ 6 untuk mendukung GDAL 3.0 atau versi lebih baru. -
fatal error: zlib.h: No such file or directory— jalankanyum install zlib-develdan coba lagi.
-
-
Salin dua file pustaka
.so(bukan tautan simbolik) dari kontainer ke mesin Anda:-
libgdal.sodari folderlibdi direktori instalasi GDAL -
libproj.sodari folderlibdi direktori instalasi PROJ 6
-
Langkah 4: Hasilkan paket wheel GDAL
Jalankan perintah berikut di dalam kontainer. Untuk konteks lebih lanjut, lihat BuildingOnUnix.
# Instal NumPy jika diperlukan.
/opt/python/cp37-cp37m/bin/pip install numpy
# Beralih ke direktori binding Python GDAL.
cd swig/python
# Hasilkan paket wheel. Output: dist/GDAL-3.0.4-cp37-cp37m-linux_x86_64.whl
/opt/python/cp37-cp37m/bin/python setup.py bdist_wheel
Langkah 5: Unggah resource dan buat UDF
-
Ubah ekstensi file paket wheel dari
.whlmenjadi.zip. -
Unggah resource ke proyek MaxCompute Anda:
-
Unggah
libgdal.sodanlibproj.sosebagai file resource. -
Unggah
numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zipdanGDAL-3.0.4-cp37-cp37m-linux_x86_64.zipsebagai archive resource.
-
-
Buat UDF dan tambahkan keempat file tersebut ke daftar resource:
libgdal.so,libproj.so,numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zip, danGDAL-3.0.4-cp37-cp37m-linux_x86_64.zip. Untuk langkah unggah dan pembuatan UDF, lihat Referensikan paket NumPy dalam UDF Python 3. Kode contoh UDF Python 3 berikut mengimpor 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') # Perbarui nama file setelah work/ agar sesuai dengan paket GDAL hasil kompilasi Anda. sys.path.insert(0, 'work/numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zip') # Perbarui nama file setelah work/ agar sesuai dengan paket NumPy Anda. 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"Jika Anda mendapat error yang menyatakan
libgdal.so.26ataulibproj.so.15tidak ditemukan, perbarui nama file dalam pemanggilaninclude_file()agar sesuai dengan nama file.sober-versi aktual di sistem Anda (misalnya, ubahlibgdal.somenjadilibgdal.so.26). Untuk Python 2, parameterget_cache_fileberbeda. Lihat Referensi resource di topik "Kembangkan UDF dalam Python 2".
Langkah selanjutnya
-
Python 3 UDF — aktifkan Python 3 dan pelajari tentang lingkungan runtime
-
Operasi resource — kelola resource di MaxCompute
-
Operasi fungsi — buat dan kelola UDF