MaxCompute memungkinkan penggunaan paket pihak ketiga dalam Python user-defined function (UDF), seperti paket NumPy, paket yang memerlukan kompilasi, atau paket yang bergantung pada dynamic-link library. Topik ini menjelaskan cara menggunakannya.
Informasi latar belakang
Paket pihak ketiga dapat digunakan dalam Python UDF pada skenario berikut:
Gunakan paket NumPy (Python 3 UDF)
Anda harus mengubah ekstensi nama file paket NumPy, mengunggahnya menggunakan klien MaxCompute, lalu mendaftarkan fungsi tersebut agar dapat dipanggil dari Python 3 UDF Anda.
Gunakan paket pihak ketiga yang memerlukan kompilasi
Dalam lingkungan yang kompatibel dengan MaxCompute, kompilasi skrip setup.py dalam paket pihak ketiga untuk menghasilkan paket wheel dan ubah ekstensi nama file paket tersebut. Kemudian, unggah paket dan daftarkan fungsinya menggunakan klien MaxCompute agar dapat dipanggil dari Python UDF Anda.
Gunakan paket pihak ketiga yang bergantung pada dynamic-link library
Kompilasi file pustaka .so dari kode sumber paket pihak ketiga, hasilkan paket wheel, lalu ubah ekstensi nama file paket tersebut. Selanjutnya, unggah paket dan file pustaka .so menggunakan klien MaxCompute serta daftarkan fungsinya agar dapat dipanggil dari Python UDF Anda.
Prasyarat
Sebelum memulai, pastikan persyaratan berikut terpenuhi:
Python telah diinstal. Disarankan menggunakan Python 3.
Klien MaxCompute telah diinstal dan dikonfigurasi. Untuk informasi selengkapnya, lihat Instal dan konfigurasi klien MaxCompute.
Untuk paket yang memerlukan kompilasi, pastikan pip, setuptools, dan wheel telah diinstal. Jalankan perintah
pip install setuptoolsuntuk menginstal setuptools dan perintahpip install wheeluntuk menginstal wheel.Jika Anda menggunakan GDAL 3.0 atau versi yang lebih baru, pastikan PROJ 6 telah diinstal.
Jika Anda menggunakan Docker untuk mengompilasi paket pihak ketiga, pastikan Docker telah diinstal. Untuk informasi selengkapnya, lihat dokumentasi instalasi Docker.
Gunakan paket NumPy (Python 3 UDF)
Lingkungan Python 2 MaxCompute menyertakan NumPy secara default. Untuk menggunakan paket NumPy dalam Python 3 UDF, Anda harus mengunggah paket tersebut secara manual dengan mengikuti langkah-langkah berikut:
Dengan mengambil versi 1.19.2 sebagai contoh, buka halaman PyPI. Di bagian Download files, unduh paket NumPy yang nama filenya diakhiri dengan cp37-cp37m-manylinux1_x86_64.whl.
CatatanPemuatan dapat gagal jika Anda menggunakan paket dengan ekstensi nama file yang berbeda. Jika ingin menggunakan versi lain, buka bagian Navigation di pojok kiri atas halaman PyPI dan klik Release history untuk melihat versi-versi sebelumnya.
Ubah ekstensi nama file paket NumPy yang telah diunduh menjadi .zip.
Contoh: numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zip.
Gunakan klien MaxCompute untuk mengunggah paket NumPy ke proyek MaxCompute. Untuk informasi selengkapnya tentang cara mengunggah resource, lihat Operasi resource.
Contoh perintah:
ADD ARCHIVE D:\Downloads\numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zip -f;Tulis skrip Python UDF dan simpan sebagai file .py.
Berikut adalah contoh skrip Python UDF yang disimpan sebagai import_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') # Paket NumPy. Anda hanya perlu mengganti nama paket setelah work/. def evaluate(self): import numpy return "import succeed"Gunakan klien MaxCompute untuk mengunggah skrip import_numpy.py sebagai resource ke proyek MaxCompute Anda.
Contoh perintah:
ADD PY D:\Desktop\import_numpy.py -f;Gunakan skrip import_numpy.py dan paket NumPy yang telah diunggah untuk mendaftarkan fungsi user-defined melalui klien MaxCompute. Untuk informasi selengkapnya tentang cara mendaftarkan fungsi, lihat Operasi fungsi.
Asumsikan fungsi user-defined yang didaftarkan diberi nama numpy dan resource fungsi tersebut berada di proyek test_project. Contoh perintah:
CREATE FUNCTION numpy AS 'import_numpy.TryImport' USING 'test_project/resources/import_numpy.py,numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zip';CatatanSaat mendaftarkan fungsi, Anda harus menambahkan paket NumPy, seperti numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zip, ke daftar resource.
Setelah fungsi terdaftar, panggil fungsi tersebut dari Pernyataan SQL Anda. Pastikan Anda mengaktifkan Python 3 untuk eksekusi. Untuk informasi selengkapnya, lihat Spesifikasi pengembangan dan alur kerja Python 3 UDF.
Gunakan paket yang memerlukan kompilasi
Jika paket pihak ketiga berupa arsip TAR.GZ dari PyPI atau paket kode sumber dari GitHub, direktori root paket yang diekstrak mungkin berisi file setup.py. Sebelum dapat menggunakan jenis paket ini, Anda harus mengompilasi file setup.py untuk menghasilkan paket wheel dalam lingkungan yang kompatibel dengan MaxCompute. Setelah itu, unggah resource dan daftarkan fungsinya. Anda kemudian dapat memanggil paket pihak ketiga menggunakan Python UDF. Untuk informasi selengkapnya tentang cara mengunggah resource dan mendaftarkan fungsi, lihat Gunakan paket NumPy (Python 3 UDF).
Paket pihak ketiga dijalankan dalam lingkungan Linux di MaxCompute. Untuk menghindari masalah kompatibilitas, kompilasi paket tersebut dalam lingkungan Linux, bukan Windows.
Jika Anda menggunakan lingkungan Windows, kami menyarankan agar Anda menggunakan versi Python yang sesuai (
/opt/python/cp27-cp27m/bin/pythonatau/opt/python/cp37-cp37m/bin/python3) untuk membuat paket wheel dalam kontainer Dockerquay.io/pypa/manylinux2010_x86_64.
Jika Anda menggunakan lingkungan Linux, periksa poin-poin berikut untuk memastikan kompatibilitas:
Anda harus menggunakan versi Python yang kompatibel. Di antarmuka baris perintah (CLI) sistem Anda, jalankan perintah berikut untuk memeriksa kompatibilitas versi Python Anda:
python -c "import wheel.pep425tags; print(wheel.pep425tags.get_abi_tag())"Jika
cp27mataucp37mdikembalikan, versi Python memenuhi persyaratan kompatibilitas.Jika
cp27muataucp37mudikembalikan, versi Python tidak memenuhi persyaratan kompatibilitas. Anda harus menjalankan perintah./configure --enable-unicode=ucs2di CLI untuk mengatur encoding Python ke UCS-2.
Jika terdapat dependensi pada kode C atau C++, Anda harus menggunakan versi GNU Compiler Collection (GCC) yang kompatibel.
CatatanKami menyarankan agar Anda menggunakan GCC 4.9.2 atau versi sebelumnya. Jika Anda menggunakan versi GCC yang lebih baru dari 4.9.2, file .so dalam paket wheel yang dihasilkan mungkin tidak kompatibel dengan lingkungan MaxCompute.
Setelah lingkungan Anda memenuhi persyaratan kompatibilitas, ikuti langkah-langkah berikut untuk menghasilkan paket wheel dari file setup.py:
Ekstrak paket pihak ketiga ke direktori lokal. Di CLI sistem Anda, beralihlah ke folder tempat file setup.py berada.
Misalnya, jika Anda mengunduh paket GDAL-3.2.0.zip dan mengekstraknya, file setup.py berada di direktori D:\Downloads\GDAL-3.2.0. Contoh perintah:
cd D:\Downloads\GDAL-3.2.0Di CLI, jalankan perintah berikut untuk memeriksa apakah bdist_wheel ada dalam output.
Contoh perintah:
python setup.py --help-commandDi CLI, jalankan perintah berikut untuk mengompilasi dan menghasilkan paket wheel.
python setup.py bdist_wheelCatatanPaket wheel berada di direktori dist.
Gunakan paket dengan dynamic-link libraries
Beberapa paket Python pihak ketiga mungkin bergantung pada dynamic-link library lain selain pustaka Python. Bagian ini menggunakan GDAL 3.0.4 sebagai contoh untuk menjelaskan cara menggunakan kontainer Docker quay.io/pypa/manylinux2010_x86_64 untuk mengompilasi file pustaka .so terkait dan menghasilkan paket wheel yang dapat digunakan di MaxCompute. Anda kemudian akan menggunakan file yang dihasilkan ini untuk diunggah sebagai resource dan mendaftarkan fungsi, sehingga memungkinkan Anda memanggil paket tersebut dari Python UDF. Untuk informasi selengkapnya tentang cara mengunggah resource dan mendaftarkan fungsi, lihat Gunakan paket NumPy (Python 3 UDF).
Pastikan Docker telah diinstal sebelum melanjutkan. Untuk informasi selengkapnya tentang operasi Docker, lihat dokumentasi Docker.
Untuk menggunakan paket pihak ketiga yang bergantung pada file pustaka .so dalam Python UDF, ikuti langkah-langkah berikut:
Lihat dependensinya. Anda dapat melihat dependensi di bagian Dependencies pada halaman PyPI.
Misalnya, dependensi GDAL 3.0.4 adalah sebagai berikut.
Dependencies - libgdal (3.0.4 atau lebih tinggi) dan file header (gdal-devel) - numpy (1.0.0 atau lebih tinggi) dan file header (numpy-devel) (tidak secara eksplisit diperlukan, tetapi banyak contoh dan utilitas tidak akan berfungsi tanpanya)CatatanSeperti yang ditunjukkan di atas, dependensinya mencakup libgdal dan numpy. libgdal diperoleh dengan mengompilasi kode sumber GDAL dalam kontainer, dan numpy diperoleh dengan mengunduh paket NumPy dari halaman PyPI atau dalam kontainer Docker.
Unduh paket NumPy.
Anda dapat mengunduh paket NumPy dengan salah satu metode berikut:
Di halaman PyPI, buka bagian Download files dan unduh paket NumPy yang nama filenya diakhiri dengan cp37-cp37m-manylinux1_x86_64.whl.
CatatanJika Anda menggunakan lingkungan Python 2, Anda harus mengunduh paket NumPy yang kompatibel. Di area Navigation di sisi kiri halaman PyPI, klik Release history, pilih versi 1.16.6 atau sebelumnya, lalu unduh paket yang nama filenya diakhiri dengan cp27-cp27m-manylinux1_x86_64.whl.
Dalam kontainer Docker quay.io/pypa/manylinux2010_x86_64, jalankan perintah
/opt/python/cp37-cp37m/bin/pip download numpy -d ./untuk mengunduh paket NumPy ke direktori saat ini.
Kompilasi file pustaka .so.
Unduh kode sumber GDAL 3.0.4 dan ekstrak ke direktori lokal.
Gunakan Docker untuk menarik gambar kontainer quay.io/pypa/manylinux2010_x86_64 dan masuk ke mode terminal interaktif.
Contoh perintah:
docker pull quay.io/pypa/manylinux2010_x86_64 docker run -it quay.io/pypa/manylinux2010_x86_64 /bin/bashSalin kode sumber GDAL 3.0.4 ke dalam kontainer.
Contoh perintah:
docker cp ./gdal-3.0.4 <CONTAINER ID>:/opt/source/Untuk mendapatkan CONTAINER ID, lihat docker ps.
Kompilasi GDAL 3.0.4 dalam kontainer. Untuk informasi selengkapnya, lihat BuildingOnUnix.
Contoh perintah:
# Anda harus menentukan direktori instalasi PROJ 6 dalam opsi 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 # Test gdalinfo --versionGalat berikut mungkin terjadi selama kompilasi:
configure: error: PROJ 6 symbols not found: GDAL 3.0 dan versi yang lebih baru bergantung pada PROJ 6. Anda harus mengunduh dan menginstal PROJ 6.fatal error: zlib.h: No such file or directory: Jalankan perintahyum install zlib-develdan kompilasi ulang.
Gunakan perintah docker cp untuk menyalin file libgdal.so dan libproj.so dari kontainer ke mesin lokal Anda. File-file ini berada di folder lib dari direktori instalasi masing-masing. Pastikan Anda menyalin file aslinya, bukan tautan simboliknya.
Buat paket wheel GDAL dalam kontainer. Untuk informasi selengkapnya, lihat BuildingOnUnix.
Contoh perintah:
# Jika NumPy diperlukan, Anda harus menginstal NumPy terlebih dahulu. /opt/python/cp37-cp37m/bin/pip install numpy # Beralih ke direktori kode sumber GDAL. cd swig/python # Paket wheel dihasilkan di direktori dist. Contoh: GDAL-3.0.4-cp37-cp37m-linux_x86_64.whl /opt/python/cp37-cp37m/bin/python setup.py bdist_wheelBerdasarkan file pustaka .so, paket wheel, atau paket NumPy yang dihasilkan, unggah resource dan daftarkan fungsi untuk menggunakan paket pihak ketiga dalam Python UDF. Untuk informasi selengkapnya tentang cara mengunggah resource dan mendaftarkan fungsi, lihat Gunakan paket NumPy (Python 3 UDF).
Perhatikan poin-poin berikut:
Saat mengunggah resource, Anda harus mengunggah libgdal.so dan libproj.so sebagai resource FILE, serta mengunggah numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zip dan GDAL-3.0.4-cp37-cp37m-linux_x86_64.zip sebagai resource ARCHIVE.
Saat mendaftarkan fungsi, Anda harus menambahkan libgdal.so, libproj.so, numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zip, dan GDAL-3.0.4-cp37-cp37m-linux_x86_64.zip ke daftar resource fungsi.
Berikut adalah contoh kode untuk Python UDF:
CatatanContoh ini menggunakan kode Python 3 dan harus dijalankan dalam lingkungan Python 3. Jika Anda perlu menjalankannya dalam lingkungan Python 2, perhatikan penggunaan parameter
get_cache_file. Untuk informasi selengkapnya, lihat Referensi resource.# 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') # Paket GDAL yang dikompilasi. Anda hanya perlu mengganti nama paket setelah work/. sys.path.insert(0, 'work/numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zip') # Paket NumPy. Anda hanya perlu mengganti nama paket setelah work/. 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"CatatanJika Anda mengalami kesalahan waktu proses bahwa libgdal.so.26 atau libproj.so.15 tidak ditemukan, ubah nama file libgdal.so dan libproj.so yang diunggah menjadi libgdal.so.26 dan libproj.so.15, masing-masing.