MaxCompute, NumPy paketi gibi derleme gerektiren veya dinamik bağlantı kütüphanesine bağımlı olan paketleri Python kullanıcı tanımlı işlevlerinde (UDF) kullanmanıza olanak tanır. Bu konu, bu paketlerin nasıl kullanılacağını gösterir.
Arka plan bilgileri
Python UDF'lerde üçüncü taraf paketlerini aşağıdaki senaryolarda kullanabilirsiniz:
-
NumPy paketini kullanma (Python 3 UDF'leri)
NumPy paketinin dosya adı uzantısını değiştirmeniz, paketi MaxCompute istemcisini kullanarak yüklemeniz ve ardından işlevi kaydetmeniz gerekir. Daha sonra bu işlevi Python 3 UDF'inizden çağırabilirsiniz.
-
Derleme gerektiren bir üçüncü taraf paketini kullanma
MaxCompute ile uyumlu bir ortamda, üçüncü taraf paketindeki setup.py betiğini derleyerek bir wheel paketi oluşturmanız ve paketin dosya adı uzantısını değiştirmeniz gerekir. Ardından, MaxCompute istemcisini kullanarak paketi yükleyin ve işlevi kaydedin. Daha sonra bu işlevi Python UDF'inizden çağırabilirsiniz.
-
Dinamik bağlantı kütüphanesine bağımlı olan bir üçüncü taraf paketini kullanma
Üçüncü taraf paketinin kaynak kodundan bir .so kütüphane dosyası derlemeniz, bir wheel paketi oluşturmanız ve ardından paketin dosya adı uzantısını değiştirmeniz gerekir. Daha sonra, MaxCompute istemcisini kullanarak paketi ve .so kütüphane dosyasını yükleyin ve işlevi kaydedin. Daha sonra bu işlevi Python UDF'inizden çağırabilirsiniz.
Ön koşullar
Başlamadan önce aşağıdaki gereksinimlerin karşılandığından emin olun:
Python yüklüdür. Python 3 önerilir.
MaxCompute istemcisi yüklü ve yapılandırılmıştır. Daha fazla bilgi için bkz. MaxCompute istemcisini yükleme ve yapılandırma.
Derleme gerektiren paketler için pip, setuptools ve wheel'in yüklü olduğundan emin olun. setuptools'i yüklemek için
pip install setuptoolskomutunu ve wheel'i yüklemek içinpip install wheelkomutunu çalıştırabilirsiniz.GDAL 3.0 veya sonraki bir sürümünü kullanıyorsanız PROJ 6'nın yüklü olduğundan emin olun.
Bir üçüncü taraf paketini derlemek için Docker kullanıyorsanız Docker yüklü olmalıdır. Daha fazla bilgi için bkz. Docker kurulum belgeleri.
NumPy paketini kullanma (Python 3 UDF'leri)
MaxCompute'un Python 2 ortamında NumPy varsayılan olarak bulunur. NumPy paketini bir Python 3 UDF'de kullanmak için paketi aşağıdaki adımları izleyerek manuel olarak yüklemeniz gerekir:
-
Örnek olarak 1.19.2 sürümünü ele alalım, PyPI sayfasına gidin. Download files bölümünde, dosya adı cp37-cp37m-manylinux1_x86_64.whl ile biten NumPy paketini indirin.
NotFarklı bir dosya adı uzantısına sahip bir paket kullanırsanız yükleme başarısız olabilir. Farklı bir sürüm kullanmak istiyorsanız PyPI sayfasının sol üst köşesindeki Navigation bölümüne gidin ve geçmiş sürümleri görüntülemek için Release history seçeneğine tıklayın.
-
İndirilen NumPy paketinin dosya adı uzantısını .zip olarak değiştirin.
Örnek: numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zip.
-
NumPy paketini bir MaxCompute projesine yüklemek için MaxCompute istemcisini kullanın. Bir kaynağın nasıl yükleneceği hakkında daha fazla bilgi için bkz. Kaynak işlemleri.
Örnek komut:
ADD ARCHIVE D:\Downloads\numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zip -f; -
Bir Python UDF betiği yazın ve bunu .py dosyası olarak kaydedin.
Aşağıda, import_numpy.py olarak kaydedilen örnek bir Python UDF betiği verilmiştir:
from odps.udf import annotate @annotate("->string") class TryImport(object): # The class name is TryImport. def __init__(self): import sys sys.path.insert(0, 'work/numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zip') # The NumPy package. You only need to replace the package name that follows work/. def evaluate(self): import numpy return "import succeed" -
import_numpy.py betiğini MaxCompute projenize bir kaynak olarak yüklemek için MaxCompute istemcisini kullanın.
Örnek komut:
ADD PY D:\Desktop\import_numpy.py -f; -
Yüklenen import_numpy.py betiğini ve NumPy paketini kullanarak MaxCompute istemcisi aracılığıyla bir kullanıcı tanımlı işlevi kaydedin. Bir işlevin nasıl kaydedileceği hakkında daha fazla bilgi için bkz. İşlev işlemleri.
Kaydedilen kullanıcı tanımlı işlevinin adının numpy olduğunu ve işlev kaynağının test_project projesinde bulunduğunu varsayalım. Örnek komut:
CREATE FUNCTION numpy AS 'import_numpy.TryImport' USING 'test_project/resources/import_numpy.py,numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zip';Notİşlevi kaydederken numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zip gibi NumPy paketini kaynak listesine eklemeniz gerekir.
İşlevi kaydettikten sonra SQL deyimlerinizden çağırın. Çalıştırma için Python 3'ü etkinleştirdiğinizden emin olun. Daha fazla bilgi için bkz. Python 3 UDF geliştirme teknik özellikleri ve iş akışı.
Derleme gerektiren paketleri kullanma
Bir üçüncü taraf paket PyPI üzerinden alınan bir TAR.GZ arşivi veya GitHub'dan alınan bir kaynak kod paketi ise, açılan paketin kök dizininde bir setup.py dosyası bulunabilir. Bu tür bir paketi kullanabilmeniz için önce MaxCompute ile uyumlu bir ortamda setup.py dosyasını derleyerek bir wheel paketi oluşturmanız gerekir. Ardından kaynağı yükleyin ve işlevi kaydedin. Daha sonra üçüncü taraf paketi bir Python UDF kullanarak çağırabilirsiniz. Bir kaynağın nasıl yükleneceği ve işlevin nasıl kaydedileceği hakkında daha fazla bilgi için bkz. NumPy paketini kullanma (Python 3 UDF'leri).
Üçüncü taraf paketler MaxCompute üzerinde bir Linux ortamında çalışır. Uyumluluk sorunlarını önlemek için bunları Windows yerine bir Linux ortamında derleyin.
Windows ortamı kullanıyorsanız
quay.io/pypa/manylinux2010_x86_64Docker kapsayıcısında bir wheel paketi oluşturmak için ilgili Python sürümünü (/opt/python/cp27-cp27m/bin/pythonveya/opt/python/cp37-cp37m/bin/python3) kullanmanızı öneririz.
Linux ortamı kullanıyorsanız uyumluluğu sağlamak için aşağıdaki noktaları kontrol edin:
-
Uyumlu bir Python sürümü kullanmalısınız. Sisteminizin komut satırı arabiriminde (CLI) Python sürümünüzün uyumluluğunu kontrol etmek için aşağıdaki komutu çalıştırın:
python -c "import wheel.pep425tags; print(wheel.pep425tags.get_abi_tag())"cp27mveyacp37mdöndürülürse Python sürümü uyumluluk gereksinimlerini karşılar.cp27muveyacp37mudöndürülürse Python sürümü uyumluluk gereksinimlerini karşılamaz. Python kodlamasını UCS-2 olarak ayarlamak için CLI'da./configure --enable-unicode=ucs2komutunu çalıştırmanız gerekir.
-
C veya C++ koduna bağımlılıklar varsa uyumlu bir GNU Compiler Collection (GCC) sürümü kullanmalısınız.
NotGCC 4.9.2 veya önceki bir sürümü kullanmanızı öneririz. 4.9.2'den sonraki bir GCC sürümü kullanırsanız oluşturulan wheel paketindeki .so dosyaları MaxCompute ortamıyla uyumsuz olabilir.
Ortamınız uyumluluk gereksinimlerini karşıladığında, setup.py dosyasından bir wheel paketi oluşturmak için şu adımları izleyin:
-
Üçüncü taraf paketi yerel bir dizine çıkarın. Sisteminizin CLI'sında setup.py dosyasının bulunduğu klasöre geçin.
Örneğin, GDAL-3.2.0.zip paketini indirip çıkardıysanız setup.py dosyası D:\Downloads\GDAL-3.2.0 dizinindedir. Örnek komut:
cd D:\Downloads\GDAL-3.2.0 -
CLI'da çıktı içinde bdist_wheel olup olmadığını kontrol etmek için aşağıdaki komutu çalıştırın.
Örnek komut:
python setup.py --help-command -
CLI'da bir wheel paketi derlemek ve oluşturmak için aşağıdaki komutu çalıştırın.
python setup.py bdist_wheelNotWheel paketi dist dizinindedir.
Dinamik bağlantı kütüphaneleri içeren paketleri kullanma
Bazı üçüncü taraf Python paketleri, Python kütüphanelerine ek olarak diğer dinamik bağlantı kütüphanelerine de bağımlı olabilir. Bu bölümde, ilgili .so kütüphane dosyalarını derlemek ve MaxCompute'ta kullanılabilecek bir wheel paketi oluşturmak için quay.io/pypa/manylinux2010_x86_64 Docker kapsayıcısının nasıl kullanılacağı GDAL 3.0.4 örneği üzerinden açıklanmaktadır. Daha sonra bu oluşturulan dosyaları kaynak olarak yükleyecek ve işlevi kaydedeceksiniz; bu sayede paketi bir Python UDF'den çağırabilirsiniz. Bir kaynağın nasıl yükleneceği ve işlevin nasıl kaydedileceği hakkında daha fazla bilgi için bkz. NumPy paketini kullanma (Python 3 UDF'leri).
Devam etmeden önce Docker'ın yüklü olduğundan emin olun. Docker işlemleri hakkında daha fazla bilgi için bkz. Docker belgeleri.
Bir Python UDF'de .so kütüphane dosyasına bağımlı olan bir üçüncü taraf paketi kullanmak için şu adımları izleyin:
-
Bağımlılıkları görüntüleyin. Bağımlılıkları PyPI sayfasının Dependencies bölümünde görüntüleyebilirsiniz.
Örneğin, GDAL 3.0.4'ün bağımlılıkları aşağıdaki gibidir.
Dependencies - libgdal (3.0.4 or greater) and header files (gdal-devel) - numpy (1.0.0 or greater) and header files (numpy-devel) (not explicitly required, but many examples and utilities will not work without it)NotYukarıda gösterildiği gibi bağımlılıklar arasında libgdal ve numpy bulunmaktadır. libgdal bir kapsayıcıda GDAL kaynak kodu derlenerek elde edilir ve numpy ise NumPy paketinin PyPI sayfasından veya bir Docker kapsayıcısından indirilmesiyle elde edilir.
-
NumPy paketini indirin.
NumPy paketini aşağıdaki yöntemlerden birini kullanarak indirebilirsiniz:
-
PyPI sayfasında Download files bölümüne gidin ve dosya adı cp37-cp37m-manylinux1_x86_64.whl ile biten NumPy paketini indirin.
NotPython 2 ortamı kullanıyorsanız uyumlu bir NumPy paketi indirmelisiniz. PyPI sayfasının sol tarafındaki Navigation alanında Release history seçeneğine tıklayın, 1.16.6 veya önceki bir sürümü seçin ve dosya adı cp27-cp27m-manylinux1_x86_64.whl ile biten paketi indirin.
quay.io/pypa/manylinux2010_x86_64 Docker kapsayıcısında NumPy paketini geçerli dizine indirmek için
/opt/python/cp37-cp37m/bin/pip download numpy -d ./komutunu çalıştırın.
-
-
.so kütüphane dosyasını derleyin.
GDAL 3.0.4 kaynak kodunu indirin ve yerel bir dizine çıkarın.
-
quay.io/pypa/manylinux2010_x86_64 kapsayıcı görüntüsünü çekmek ve etkileşimli terminal moduna girmek için Docker'ı kullanın.
Örnek komutlar:
docker pull quay.io/pypa/manylinux2010_x86_64 docker run -it quay.io/pypa/manylinux2010_x86_64 /bin/bash -
GDAL 3.0.4 kaynak kodunu kapsayıcıya kopyalayın.
Örnek komut:
docker cp ./gdal-3.0.4 <CONTAINER ID>:/opt/source/CONTAINER ID değerini almak için bkz. docker ps.
-
Kapsayıcı içinde GDAL 3.0.4'ü derleyin. Daha fazla bilgi için bkz. BuildingOnUnix.
Örnek komutlar:
# You must specify the installation directory of PROJ 6 in the configure option. ./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 --versionDerleme sırasında aşağıdaki hatalar oluşabilir:
configure: error: PROJ 6 symbols not found: GDAL 3.0 ve sonraki sürümler PROJ 6'ya bağımlıdır. PROJ 6'yı indirmeniz ve yüklemeniz gerekir.fatal error: zlib.h: No such file or directory:yum install zlib-develkomutunu çalıştırın ve tekrar derleyin.
docker cp komutunu kullanarak libgdal.so ve libproj.so dosyalarını kapsayıcıdan yerel makinenize kopyalayın. Bu dosyalar kendi kurulum dizinlerinin lib klasöründe bulunur. Sembolik bağlantıları değil, gerçek dosyaları kopyaladığınızdan emin olun.
-
Kapsayıcı içinde bir GDAL wheel paketi oluşturun. Daha fazla bilgi için bkz. BuildingOnUnix.
Örnek komutlar:
# If NumPy is required, you must install NumPy first. /opt/python/cp37-cp37m/bin/pip install numpy # Switch to the directory of the GDAL source code. cd swig/python # A wheel package is generated in the dist directory. Example: GDAL-3.0.4-cp37-cp37m-linux_x86_64.whl /opt/python/cp37-cp37m/bin/python setup.py bdist_wheel -
Oluşturulan .so kütüphane dosyalarına, wheel paketlerine veya NumPy paketlerine dayanarak kaynakları yükleyin ve üçüncü taraf paketi bir Python UDF'de kullanmak üzere işlevi kaydedin. Kaynakların nasıl yükleneceği ve işlevin nasıl kaydedileceği hakkında daha fazla bilgi için bkz. NumPy paketini kullanma (Python 3 UDF'leri).
Aşağıdaki noktalara dikkat edin:
Kaynakları yüklerken libgdal.so ve libproj.so dosyalarını FILE kaynağı olarak, numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zip ve GDAL-3.0.4-cp37-cp37m-linux_x86_64.zip dosyalarını ise ARCHIVE kaynağı olarak yüklemelisiniz.
İşlevi kaydederken libgdal.so, libproj.so, numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zip ve GDAL-3.0.4-cp37-cp37m-linux_x86_64.zip dosyalarını işlevin kaynak listesine eklemelisiniz.
Aşağıda Python UDF için örnek kod verilmiştir:
NotBu örnek Python 3 kodunu kullanır ve bir Python 3 ortamında çalıştırılmalıdır. Bir Python 2 ortamında çalıştırmanız gerekiyorsa
get_cache_fileparametresinin kullanımına dikkat edin. Daha fazla bilgi için bkz. Kaynaklara referans verme.# 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') # The compiled GDAL package. You only need to replace the package name that follows work/. sys.path.insert(0, 'work/numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zip') # The NumPy package. You only need to replace the package name that follows 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"Notlibgdal.so.26 veya libproj.so.15 bulunamadığına dair bir çalışma zamanı hatasıyla karşılaşırsanız yüklenen libgdal.so ve libproj.so dosyalarının adlarını sırasıyla libgdal.so.26 ve libproj.so.15 olarak yeniden adlandırın.