MaxCompute memungkinkan Anda untuk mengacu paket pihak ketiga dalam fungsi yang ditentukan pengguna (UDF) Python. Paket-paket tersebut dapat berupa paket NumPy, paket pihak ketiga yang perlu dikompilasi, dan paket pihak ketiga yang bergantung pada pustaka tautan dinamis (DLL). Topik ini menjelaskan cara mengacu paket pihak ketiga dalam Python UDF.
Informasi latar belakang
Anda dapat mengacu paket pihak ketiga dalam Python UDF dalam skenario berikut:
Mengacu Paket NumPy dalam Python 3 UDF
Anda harus mengubah ekstensi nama paket NumPy, menggunakan klien MaxCompute untuk mengunggah paket NumPy, dan kemudian membuat UDF. Anda dapat memanggil Python 3 UDF setelah pembuatan UDF.
Mengacu Paket Pihak Ketiga yang Perlu Dikompilasi
Anda harus mengkompilasi skrip setup.py dalam paket pihak ketiga, menghasilkan paket wheel, dan kemudian mengubah ekstensi nama paket wheel dalam lingkungan yang kompatibel dengan MaxCompute. Kemudian, gunakan klien MaxCompute untuk mengunggah paket wheel dan membuat UDF. Anda dapat memanggil Python UDF setelah pembuatan UDF. Kami merekomendasikan penggunaan sistem operasi Linux. Jika Anda menggunakan sistem operasi Windows, kami merekomendasikan penggunaan Docker.
Mengacu Paket Pihak Ketiga yang Bergantung pada DLL
Anda harus mengkompilasi file pustaka .so berdasarkan kode sumber paket pihak ketiga, menghasilkan paket wheel, dan kemudian mengubah ekstensi nama paket wheel. Kemudian, gunakan klien MaxCompute untuk mengunggah paket wheel dan file pustaka .so serta membuat UDF. Anda dapat memanggil Python UDF setelah pembuatan UDF.
Prasyarat
Pastikan persyaratan berikut terpenuhi:
Python telah diinstal. Kami merekomendasikan instalasi Python 3.
Klien MaxCompute telah diinstal dan dikonfigurasi. Untuk informasi lebih lanjut, lihat Instal dan Konfigurasikan Klien MaxCompute.
pip, setuptools, dan wheel telah diinstal jika Anda ingin menggunakan Python UDF untuk mengacu paket pihak ketiga yang perlu dikompilasi. Anda dapat menjalankan perintah
pip install setuptoolsuntuk menginstal setuptools dan menjalankan perintahpip install wheeluntuk menginstal wheel.PROJ 6 diinstal jika Anda menggunakan paket pihak ketiga GDAL 3.0 atau yang lebih baru.
Docker diinstal jika Anda menggunakan Docker untuk mengkompilasi paket pihak ketiga. Untuk informasi lebih lanjut, lihat Dokumentasi Docker.
Mengacu paket NumPy dalam Python 3 UDF
Anda dapat menggunakan Python 3 di MaxCompute untuk mengacu paket NumPy. Secara default, pustaka NumPy diinstal di Python 2 di MaxCompute. Anda tidak perlu mengunggah paket NumPy secara manual di Python 2. Untuk mengacu paket NumPy dalam Python 3 UDF, lakukan langkah-langkah berikut:
Di bagian Download files halaman PyPI, klik paket yang namanya diakhiri dengan cp37-cp37m-manylinux1_x86_64.whl untuk mengunduh paket. Dalam contoh ini, NumPy 1.19.2 digunakan.
CatatanJika Anda mengunduh paket yang namanya diakhiri dengan karakter lain, operasi mungkin gagal. Jika Anda perlu memilih versi lain dari paket NumPy, klik Release history di bagian Navigation di pojok kiri atas halaman PyPI untuk melihat versi historis.
Ubah ekstensi nama paket NumPy yang diunduh menjadi .zip.
Contoh: numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zip.
Gunakan klien MaxCompute untuk mengunggah paket NumPy ke proyek MaxCompute Anda. Untuk informasi lebih lanjut tentang cara mengunggah paket, lihat Operasi Sumber Daya.
Perintah contoh:
ADD ARCHIVE D:\Downloads\numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zip -f;Tulis skrip Python UDF dan simpan skrip sebagai file PY.
Dalam contoh ini, file yang disimpan diberi nama import_numpy.py. Kode berikut menunjukkan skrip Python UDF:
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 mengubah nama paket setelah work/. def evaluate(self): import numpy return "import berhasil"Gunakan klien MaxCompute untuk mengunggah skrip import_numpy.py ke proyek MaxCompute Anda sebagai sumber daya.
Perintah contoh:
ADD PY D:\Desktop\import_numpy.py -f;Gunakan skrip import_numpy.py yang diunggah dan paket NumPy untuk membuat UDF di klien MaxCompute. Untuk informasi lebih lanjut tentang cara membuat UDF, lihat Operasi Fungsi.
Dalam contoh ini, UDF yang dibuat diberi nama numpy. Perintah contoh:
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';CatatanSaat Anda membuat UDF, Anda harus menambahkan paket NumPy, seperti numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zip, ke daftar sumber daya.
Setelah Anda membuat UDF, Anda dapat memanggil UDF dalam pernyataan SQL. Pastikan bahwa Python 3 diaktifkan untuk mengeksekusi pernyataan SQL. Untuk informasi lebih lanjut, lihat Python 3 UDF.
Mengacu paket pihak ketiga yang perlu dikompilasi
Jika paket pihak ketiga adalah paket TAR.GZ yang diunduh dari PyPI atau paket kode sumber yang diunduh dari GitHub, file setup.py mungkin disimpan di direktori root dari paket pihak ketiga yang telah diekstraksi. Untuk menggunakan jenis paket pihak ketiga ini, Anda harus mengkompilasi file setup.py dan menghasilkan paket wheel dalam lingkungan yang kompatibel dengan MaxCompute. Kemudian, unggah paket sebagai sumber daya dan buat UDF. Setelah UDF dibuat, Anda dapat memanggil paket pihak ketiga dalam Python UDF. Untuk informasi lebih lanjut tentang cara mengunggah sumber daya dan membuat UDF, lihat Mengacu Paket NumPy dalam Python 3 UDF.
Paket pihak ketiga berjalan di sistem operasi Linux. Kami merekomendasikan Anda mengkompilasi paket pihak ketiga di sistem operasi Linux. Jika Anda mengkompilasi paket pihak ketiga di sistem operasi Windows, masalah ketidaksesuaian mungkin terjadi.
Jika Anda menggunakan sistem operasi Windows, kami merekomendasikan Anda menggunakan Python versi yang diperlukan untuk mengkompilasi file setup.py dan menghasilkan paket wheel di kontainer Docker yang dibuat dari gambar quay.io/pypa/manylinux2010_x86_64. Python versi yang diperlukan disimpan di
/opt/python/cp27-cp27m/bin/pythonatau/opt/python/cp37-cp37m/bin/python3.
Jika Anda menggunakan sistem operasi Linux, pastikan persyaratan berikut terpenuhi:
Versi Python yang kompatibel dengan MaxCompute digunakan. Anda dapat menjalankan perintah berikut di antarmuka baris perintah (CLI) sistem Anda untuk memeriksa versi Python:
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. Dalam hal ini, Anda harus menjalankan perintah./configure --enable-unicode=ucs2untuk mengubah format penyandian Python menjadi UCS-2.
Jika kode dalam C atau C++ diperlukan, sistem operasi Linux Anda harus kompatibel dengan versi GNU Compiler Collection (GCC) yang digunakan.
CatatanKami merekomendasikan Anda menggunakan GCC 4.9.2 atau sebelumnya. Jika versi GCC lebih baru dari 4.9.2, file .so dalam paket wheel yang dihasilkan mungkin tidak kompatibel dengan MaxCompute.
Jika semua persyaratan terpenuhi, lakukan langkah-langkah berikut untuk mengkompilasi file setup.py dan menghasilkan paket wheel di sistem operasi Linux:
Ekstrak paket pihak ketiga ke mesin lokal Anda dan jalankan perintah yang diperlukan di CLI untuk pergi ke jalur tempat file setup.py disimpan.
Sebagai contoh, paket GDAL-3.2.0.zip diunduh. Setelah Anda mengekstrak paket, file setup.py disimpan di D:\Downloads\GDAL-3.2.0. Perintah contoh:
cd D:\Downloads\GDAL-3.2.0
Jalankan perintah berikut di CLI untuk memeriksa apakah bdist_wheel dikembalikan:
Perintah contoh:
python setup.py --help-commandJalankan perintah berikut di CLI untuk mengkompilasi file setup.py dan menghasilkan paket wheel:
python setup.py bdist_wheelCatatanPaket wheel disimpan di folder dist.
Mengacu paket pihak ketiga yang bergantung pada DLL
Beberapa paket pihak ketiga untuk Python bergantung pada pustaka Python dan DLL lainnya. Bagian ini menjelaskan cara menggunakan kontainer Docker untuk mengkompilasi file pustaka .so dan menghasilkan paket wheel yang dapat digunakan di MaxCompute. Kontainer dibuat dari gambar quay.io/pypa/manylinux2010_x86_64. GDAL 3.0.4 digunakan dalam contoh ini. Anda harus mengunggah file pustaka .so yang dihasilkan dan paket wheel atau paket NumPy sebagai sumber daya dan membuat UDF. Setelah UDF dibuat, Anda dapat memanggil paket pihak ketiga dalam Python UDF. Untuk informasi lebih lanjut tentang cara mengunggah sumber daya dan membuat UDF, lihat Mengacu Paket NumPy dalam Python 3 UDF.
Anda harus memastikan bahwa Docker telah diinstal sebelum Anda dapat mengacu paket pihak ketiga yang bergantung pada DLL dalam Python UDF. Untuk informasi lebih lanjut, lihat Dokumentasi Docker.
Untuk mengacu paket pihak ketiga yang bergantung pada DLL dalam Python UDF, lakukan langkah-langkah berikut:
Lihat dependensi di bagian Dependencies halaman PyPI.
Gambar berikut menunjukkan dependensi GDAL 3.0.4.
CatatanPada gambar sebelumnya, dependensi termasuk libgdal dan numpy. Untuk mendapatkan libgdal, kompilasi kode sumber GDAL dalam kontainer Docker. Untuk mendapatkan numpy, unduh paket NumPy di halaman PyPI atau dari kontainer Docker.
Dapatkan paket NumPy.
Anda dapat menggunakan salah satu metode berikut untuk mendapatkan paket NumPy:
Di bagian Download files halaman PyPI, klik paket yang namanya diakhiri dengan cp37-cp37m-manylinux1_x86_64.whl untuk mengunduh paket.
CatatanJika Python 2 digunakan, lakukan operasi berikut untuk mengunduh paket NumPy: Di bagian Navigation halaman PyPI, klik Release history, pilih 1.16.6 atau versi sebelumnya, dan kemudian klik paket yang namanya diakhiri dengan cp27-cp27m-manylinux1_x86_64.whl.
Jalankan perintah
/opt/python/cp37-cp37m/bin/pip download numpy -d ./di kontainer yang dibuat dari gambar quay.io/pypa/manylinux2010_x86_64 untuk mengunduh paket NumPy ke direktori saat ini.
Kompilasi file pustaka .so.
Unduh file kode sumber GDAL 3.0.4 dan ekstrak file ke mesin lokal Anda.
Unduh kontainer Docker yang dibuat dari gambar quay.io/pypa/manylinux2010_x86_64 dan masuk ke mode input klien Docker.
Perintah contoh:
docker pull quay.io/pypa/manylinux2010_x86_64 docker run -it quay.io/pypa/manylinux1_x86_64 /bin/bashUnggah kode sumber GDAL 3.0.4 ke kontainer Docker.
Perintah contoh:
docker cp ./gdal-3.0.4 <CONTAINER ID>:/opt/source/Untuk informasi lebih lanjut tentang cara mendapatkan CONTAINER ID, lihat docker ps.
Kompilasi kode sumber GDAL 3.0.4 dalam kontainer. Untuk informasi lebih lanjut, lihat BuildingOnUnix.
Perintah contoh:
# Tentukan direktori untuk menginstal PROJ 6 di bidang 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 # Tes gdalinfo --versionKesalahan berikut mungkin terjadi selama kompilasi:
configure: error: PROJ 6 symbols not found: Jika kesalahan ini terjadi, instal PROJ 6 untuk mendukung GDAL 3.0 atau yang lebih baru.fatal error: zlib.h: No such file or directory: Jika kesalahan ini terjadi, gunakan perintahyum install zlib-develuntuk mengkompilasi kode tersebut.
Jalankan perintah unduhan Docker untuk mengunduh dua file pustaka .so (bukan tautan simbolik) ke mesin lokal Anda. Dapatkan libgdal.so dari folder lib di direktori instalasi GDAL dan libproj.so dari folder lib di direktori instalasi PROJ 6.
Hasilkan paket wheel GDAL di kontainer Docker. Untuk informasi lebih lanjut, lihat BuildingOnUnix.
Perintah contoh:
# Jika NumPy diperlukan, instal NumPy terlebih dahulu. /opt/python/cp37-cp37m/bin/pip install numpy # Beralih ke direktori tempat kode sumber GDAL disimpan. cd swig/python # Hasilkan paket wheel dan simpan di folder dist. Contoh: GDAL-3.0.4-cp37-cp37m-linux_x86_64.whl /opt/python/cp37-cp37m/bin/python setup.py bdist_wheelUnggah file pustaka .so yang dihasilkan, paket wheel, atau paket NumPy sebagai sumber daya dan buat UDF. Setelah UDF dibuat, Anda dapat memanggil paket pihak ketiga dalam Python UDF. Untuk informasi lebih lanjut tentang cara mengunggah sumber daya dan membuat UDF, lihat Mengacu Paket NumPy dalam Python 3 UDF.
Perhatikan item berikut saat Anda mengunggah sumber daya dan membuat UDF:
Saat Anda mengunggah sumber daya, Anda harus mengunggah libgdal.so dan libproj.so sebagai sumber daya file dan numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zip dan GDAL-3.0.4-cp37-cp37m-linux_x86_64.zip sebagai sumber daya arsip.
Saat Anda membuat 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 sumber daya fungsi.
Kode contoh untuk Python UDF:
CatatanKode contoh berikut dijalankan di Python 3. Jika Anda ingin menjalankan kode di Python 2, perhatikan parameter
get_cache_file. Untuk informasi lebih lanjut, lihat Referensi Sumber Daya dalam topik "Mengembangkan UDF di Python 2".# 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 setelah kompilasi. Anda hanya perlu mengubah nama paket yang mengikuti work/. sys.path.insert(0, 'work/numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zip') # Paket NumPy. Anda hanya perlu mengubah 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 berhasil"CatatanJika terjadi kesalahan yang menunjukkan libgdal.so.26 atau libproj.so.15 tidak ditemukan, Anda harus mengubah libgdal.so menjadi libgdal.so.26 atau libproj.so menjadi libproj.so.15.