Topik ini menjelaskan pertanyaan umum (FAQ) mengenai fungsi yang didefinisikan pengguna (UDF) MaxCompute yang ditulis dalam Python.
Masalah kelas atau resource
Bagian ini menjelaskan masalah umum terkait kelas dan resource yang terjadi saat Anda memanggil UDF MaxCompute.
-
Gejala 1: Pesan error
function 'xxx' cannot be resolvedditampilkan.-
Penyebab:
-
Penyebab 1: Anda memanggil UDF MaxCompute dari proyek yang salah. UDF tersebut tidak berada di proyek MaxCompute saat ini. Misalnya, UDF tersebut didaftarkan di proyek pengembangan, tetapi Anda memanggilnya dari proyek produksi.
-
Penyebab 2: Kelas atau resource UDF MaxCompute salah.
-
Penyebab 3: Jenis resource yang digunakan oleh UDF MaxCompute salah. Misalnya, file PY memiliki jenis resource PY, tetapi metode
get_cache_filedalam kode UDF memerlukan jenis FILE. -
Penyebab 4: Resource yang digunakan oleh UDF MaxCompute sudah usang. Terjadi penundaan saat Anda mengunggah resource dari DataWorks ke MaxCompute, sehingga resource tersebut mungkin bukan versi terbaru.
-
Penyebab 5: Versi lingkungan Python salah. Secara default, MaxCompute menjalankan pekerjaan di lingkungan Python 2. Error terjadi jika kode Python berisi karakter non-ASCII.
-
-
Solusi:
-
Solusi untuk Penyebab 1: Di proyek tempat error terjadi, Anda dapat menjalankan perintah
list functions;dari MaxCompute client untuk memverifikasi bahwa Fungsi yang Didefinisikan Pengguna (UDF) MaxCompute tersebut ada. -
Solusi untuk Penyebab 2: Di MaxCompute client, jalankan perintah
desc function <function_name>;dan verifikasi bahwa Class dan Resources dalam output benar.Jika salah, jalankan perintah
create function <function_name> as <'package_to_class'> using <'resource_list'>;untuk mendaftarkan fungsi tersebut lagi. Dalam perintah ini, package_to_class adalah Python_script_name.class_name dan resource_list mencakup semua resource file, tabel, arsip, atau paket pihak ketiga yang perlu Anda referensikan di MaxCompute.Untuk informasi lebih lanjut, lihat Daftarkan fungsi.
-
Solusi untuk Penyebab 3: Di MaxCompute client, jalankan perintah
desc resource <resource_name>;dan periksa apakah Type dalam output benar. Jika jenis resource salah, jalankan perintahadd <file_type> <file_name>;untuk menambahkan resource tersebut lagi.-
Jika resource direferensikan menggunakan
get_cache_filedalam kode UDF, resource tersebut merupakan resource file. Jenis resource harus FILE. -
Jika resource direferensikan menggunakan
get_cache_tabledalam kode UDF, resource tersebut merupakan resource tabel. Jenis resource harus TABLE. -
Jika resource direferensikan menggunakan
get_cache_archivedalam kode UDF, resource tersebut merupakan resource arsip. Jenis resource harus ARCHIVE.
Untuk informasi lebih lanjut, lihat Tambahkan resource.
-
-
Solusi untuk Penyebab 4: Anda dapat menjalankan perintah
desc resource <resource_name>;di MaxCompute client dan memeriksa LastModifiedTime dalam output untuk memverifikasi waktu modifikasi terakhir. -
Solusi untuk Penyebab 5: Tambahkan deklarasi encoding
#coding:utf-8atau# -*- coding: utf-8 -*-di awal kode Python. Atau, tambahkan pernyataanset odps.sql.python.version=cp37;sebelum pernyataan SQL yang memanggil UDF. Kemudian, kirimkan bersama-sama untuk menjalankan pekerjaan di lingkungan Python 3.
-
-
-
Gejala 2: Saat Anda menggunakan
get_cache_archive('xxx.zip')dalam UDF MaxCompute, salah satu pesan error berikut ditampilkan:IOError: Download resource: xxx.zip failed,odps.distcache.DistributedCacheError, ataufuxi job failed: Download resource failed: xxx.zip.-
Penyebab:
-
Penyebab 1: Resource arsip tidak ada. Resource arsip tidak ditentukan saat Anda mendaftarkan UDF MaxCompute.
-
Penyebab 2: Jenis resource arsip salah. Bukan ARCHIVE.
-
Penyebab 3: Nama atau ekstensi resource arsip tidak sesuai dengan file aktual. Misalnya, resource arsip bernama xxx.zip, tetapi file yang diunggah adalah xxx.tar.gz. Sistem mencoba mengekstrak file dalam format ZIP, yang menyebabkan kegagalan ekstraksi.
-
Penyebab 4: Dua UDF dalam pekerjaan yang sama bergantung pada resource yang memiliki nama sama tetapi berada di proyek berbeda.
-
-
Solusi:
-
Solusi untuk Penyebab 1: Jalankan perintah
desc function <function_name>;di MaxCompute client untuk memeriksa apakah bidang Resources dalam output berisi paket resource terkompresi yang disebutkan dalam pesan error.Jika tidak termasuk, jalankan perintah
create function <function_name> as <'package_to_class'> using <'resource_list'>;untuk mendaftarkan fungsi tersebut lagi. Tambahkan resource arsip yang hilang ke resource_list.Untuk informasi lebih lanjut, lihat Daftarkan fungsi.
-
Solusi untuk Penyebab 2: Jalankan perintah
desc resource <resource_name>;di MaxCompute client untuk memeriksa apakah Type dalam output adalah ARCHIVE.Jika jenisnya bukan ARCHIVE, jalankan perintah
add archive <file_name>;untuk mengunggah resource tersebut lagi.Untuk informasi lebih lanjut, lihat Tambahkan resource.
-
Solusi untuk Penyebab 3: Di MaxCompute client, jalankan perintah
desc function <function_name>;untuk memeriksa apakah nama dan ekstensi paket terkompresi dalam bagian Resources pada output sesuai dengan nama file dan ekstensi aktual.Jika tidak sesuai, jalankan perintah
add archive <file_name>;untuk mengunggah resource tersebut lagi. file_name harus sama dengan nama dan ekstensi resource arsip aktual. -
Solusi untuk Penyebab 4: Periksa semua UDF yang digunakan oleh pekerjaan tersebut, termasuk UDF dalam view. Periksa proyek dan nama setiap UDF serta resource yang sesuai. Jika resource dengan nama sama ada di proyek berbeda, ubah nama UDF atau resource yang bergantung tersebut.
-
-
-
Gejala 3: Saat Anda menggunakan
get_cache_table(table_name)dalam UDF MaxCompute, pesan errorodps.distcache.DistributedCacheError: Table resource "xxx_table_name" not foundditampilkan.-
Penyebab:
-
Penyebab 1: Resource tabel tidak ada. Resource tabel tidak ditentukan saat Anda mendaftarkan UDF MaxCompute.
-
Penyebab 2: Jenis resource tabel salah. Bukan TABLE.
-
-
Solusi:
-
Solusi untuk Penyebab 1: Di MaxCompute client, jalankan perintah
desc function <function_name>;dan periksa apakah Resources dalam output berisi resource tabel dari pesan error.Jika tidak termasuk, jalankan perintah
create function <function_name> as <'package_to_class'> using <'resource_list'>;untuk mendaftarkan fungsi tersebut lagi. Tambahkan resource tabel yang hilang ke resource_list.Untuk informasi lebih lanjut, lihat Daftarkan fungsi.
-
Solusi untuk Penyebab 2: Di MaxCompute client, jalankan perintah
desc resource <resource_name>;dan periksa apakah Type dalam output adalah TABLE.Jika jenisnya bukan TABLE, jalankan perintah
add table <table_name>;untuk mengunggah resource tabel tersebut lagi.Untuk informasi lebih lanjut, lihat Tambahkan resource.
-
-
-
Gejala 4: Saat UDF MaxCompute mereferensikan paket pihak ketiga, pesan error
ImportError: No module named 'xxx'ditampilkan.-
Penyebab
-
Penyebab 1: Jenis resource dari paket pihak ketiga salah. Jenis resource harus ARCHIVE.
-
Penyebab 2: Paket pihak ketiga tidak ditentukan saat UDF MaxCompute didaftarkan.
-
Penyebab 3: Path ke paket pihak ketiga tidak ditambahkan ke kode UDF MaxCompute.
-
Penyebab 4: Paket pihak ketiga merupakan paket WHEEL, tetapi file memiliki ekstensi salah atau tidak sesuai dengan versi lingkungan Python.
-
Penyebab 5: Paket pihak ketiga bukan paket WHEEL atau paket Python murni, tetapi berisi file setup.py.
-
Penyebab 6: Nama file Python untuk UDF MaxCompute bertabrakan dengan nama modul pihak ketiga yang ingin Anda referensikan. Misalnya, jika file Python untuk UDF adalah A.py, sistem secara default mengimpor A.py alih-alih modul dari paket pihak ketiga saat Anda menjalankan import A.
-
-
Solusi:
-
Solusi untuk Penyebab 1: Dari MaxCompute client, jalankan perintah
desc resource <resource_name>;dan periksa apakah parameter Type dalam output adalah ARCHIVE.Jika jenisnya bukan ARCHIVE, jalankan perintah
add archive <file_name>;untuk mengunggah resource tersebut lagi.Untuk informasi lebih lanjut, lihat Tambahkan resource.
-
Solusi untuk Penyebab 2: Gunakan MaxCompute client untuk menjalankan perintah
desc function <function_name>;, dan periksa apakah parameter Resources dalam output mencakup paket pihak ketiga.Jika tidak termasuk, jalankan perintah
create function <function_name> as <'package_to_class'> using <'resource_list'>;untuk mendaftarkan fungsi tersebut lagi. Tambahkan paket pihak ketiga ke resource_list.Untuk informasi lebih lanjut, lihat Daftarkan fungsi.
-
Solusi untuk Penyebab 3: Periksa apakah path ke paket pihak ketiga ditambahkan ke kode fungsi yang didefinisikan pengguna (UDF). Secara khusus, pastikan kode mencakup
sys.path.insert(0, 'work/path_to_third_party_package'). Misalnya, asumsikan nama modul adalah A dan file Python yang sesuai adalah A.py. Contoh berikut menjelaskan cara menentukan path paket resource dan menambahkan path tersebut ke kode Anda:-
Jika file Python berada di folder resource_dir dan Anda langsung mengompresi folder resource_dir menjadi resource-of-A.zip, path dalam
sys.path.insertadalahwork/resource-of-A.zip/resource_dir/. -
Jika file Python berada di folder resource_dir dan Anda mengompresi semua file dalam folder resource_dir menjadi resource-of-A.zip, path dalam
sys.path.insertadalahwork/resource-of-A.zip/. -
Jika file Python berada di folder resource_dir/path1/path2 dan Anda mengompresi semua file dalam folder resource_dir menjadi resource-of-A.zip, path dalam
sys.path.insertadalahwork/resource-of-A.zip/path1/path2/.
CatatanSecara default, resource ARCHIVE ditempatkan di direktori
./work/, yang relatif terhadap path eksekusi UDF. -
-
Solusi untuk Penyebab 4: File WHEEL berbeda untuk lingkungan Python 2 dan Python 3. Untuk Python 2, nama file WHEEL harus mengandung
cp27-cp27m-manylinux1_x86_64. Untuk Python 3, nama file WHEEL harus mengandungcp37-cp37m-manylinux1_x86_64. Unduh file WHEEL yang sesuai. Anda dapat langsung mengubah ekstensi file WHEEL yang diunduh menjadi .zip. Anda tidak perlu mengompresi file WHEEL ke dalam file ZIP lain. -
Solusi untuk Penyebab 5: Anda harus terlebih dahulu mengompilasi file setup.py untuk menghasilkan paket WHEEL di lingkungan yang kompatibel dengan MaxCompute. Kemudian, unggah resource dan daftarkan fungsi tersebut. Untuk informasi lebih lanjut tentang cara mengompilasi paket pihak ketiga, lihat Gunakan paket pihak ketiga yang memerlukan kompilasi.
-
Solusi untuk Penyebab 6: Ubah nama file Python untuk UDF MaxCompute.
-
-
-
Gejala 5: Saat UDF MaxCompute mereferensikan pustaka standar Python 3, pesan error
ImportError: No module named enumdilaporkan.-
Penyebab: Python 3 tidak diaktifkan untuk proyek MaxCompute. Secara default, UDF MaxCompute berjalan di lingkungan Python 2, yang tidak dapat mengenali pustaka standar Python 3.
-
Solusi: Tambahkan pernyataan
set odps.sql.python.version=cp37;sebelum pernyataan SQL yang memanggil UDF dan kirimkan bersama-sama.
-
-
Gejala 6: Pesan error
ModuleNotFoundError: No module named 'six'ditampilkan.-
Penyebab: Path ke paket pihak ketiga tidak ditambahkan ke
sys.path. Hal ini mencegah UDF Python mengimpor paket tersebut. -
Solusi: Untuk informasi lebih lanjut, lihat Jalankan Scipy dalam UDF MaxCompute. Ubah
include_package_path('six.zip')menjadisys.path.insert(0, 'work/six.zip').
-
-
Gejala 7: Pesan error
failed to get Udf info from xxx.pydilaporkan.-
Penyebab: Kelas dasar diimpor dengan sintaksis salah dalam fungsi nilai-tabel yang didefinisikan pengguna (UDTF) atau fungsi agregat yang didefinisikan pengguna (UDAF). Misalnya,
import odps.udf.BaseUDTFatauimport odps.udf.BaseUDAF. -
Solusi: Ubah pernyataan impor menjadi
from odps.udf import BaseUDTFataufrom odps.udf import BaseUDAF.
-
Masalah performa
-
Gejala: Pesan error
kInstanceMonitorTimeoutditampilkan. -
Penyebab: Waktu pemrosesan UDF melebihi batas timeout. Secara default, satu batch catatan (biasanya 1.024) harus diproses dalam waktu 1.800 detik. Batas ini berlaku untuk pemrosesan satu batch, bukan total waktu proses worker. SQL biasanya memproses data lebih dari 10.000 catatan per detik. Batas ini mencegah loop tak hingga dalam UDF yang menyebabkan penggunaan CPU berkepanjangan.
-
Solusi:
-
Tambahkan log ke kode UDF MaxCompute untuk memeriksa adanya loop tak hingga. Anda juga dapat mencetak informasi waktu di log untuk memeriksa apakah waktu pemrosesan untuk satu catatan sesuai harapan. Tambahkan informasi pencetakan log berikut ke kode Anda. Setelah pekerjaan berhasil dijalankan, Anda dapat melihat informasi log di StdOut di Logview.
-
Lingkungan Python 2
sys.stdout.write('your log') sys.stdout.flush() -
Lingkungan Python 3
print('your log', flush=True)
-
-
Jika komputasi aktual besar dan UDF diperkirakan berjalan lama, Anda dapat menyesuaikan parameter berikut untuk mencegah error timeout.
Parameter
Deskripsi
set odps.function.timeout=xxx;Menyesuaikan periode timeout waktu proses UDF. Nilai default adalah 1800 detik. Anda dapat menambah nilai ini sesuai kebutuhan. Nilai harus dalam rentang 1 detik hingga 3600 detik.
set odps.sql.executionengine.batch.rowcount=xxx;Menyesuaikan jumlah baris data yang diproses MaxCompute sekaligus. Nilai default adalah 1024. Anda dapat mengurangi nilai ini sesuai kebutuhan.
-
Masalah jaringan
-
Gejala: Terjadi error saat Anda memanggil UDF MaxCompute untuk mengakses internet.
-
Penyebab: UDF MaxCompute tidak mendukung akses internet.
-
Solusi: Isi dan kirimkan formulir Permintaan Koneksi Jaringan sesuai kebutuhan bisnis Anda. Tim dukungan teknis MaxCompute akan segera menghubungi Anda untuk mengaktifkan akses jaringan. Untuk petunjuk cara mengisi formulir, lihat Proses akses jaringan.
Masalah sandbox
-
Gejala: Pesan error
RuntimeError: xxx has been blocked by sandboxditampilkan. -
Penyebab: Beberapa pemanggilan fungsi dalam UDF Python diblokir oleh sandbox.
-
Solusi:
-
Sebelum pernyataan SQL yang memanggil UDF Python, tambahkan pengaturan
set odps.isolation.session.enable=true;. Kemudian, kirimkan bersama-sama. -
Jika Anda menggunakan UDF Python 3, pengaturan
set odps.isolation.session.enable=true;diaktifkan secara default.
-
Masalah encoding
Bagian ini menjelaskan masalah encoding umum yang terjadi saat memanggil UDF MaxCompute.
-
Gejala 1: Pesan error
SyntaxError: Non-ASCII character '\xe8' in file xxx. on line yyyditampilkan.-
Penyebab: File Python untuk UDF MaxCompute berisi karakter non-ASCII dan berjalan di lingkungan Python 2.
-
Solusi:
-
Tambahkan pernyataan
set odps.sql.python.version=cp37;sebelum pernyataan SQL yang memanggil UDF. Kemudian, kirimkan bersama-sama untuk menjalankan pekerjaan di lingkungan Python 3. -
Ubah encoding default interpreter Python 2 menjadi UTF-8. Untuk melakukannya, tambahkan pernyataan berikut di awal file Python.
import sys reload(sys) sys.setdefaultencoding('utf-8')
-
-
-
Gejala 2: Saat Anda memanggil UDF Python 2, pesan error
UnicodeEncodeError: 'ascii' code can't encode characters in position x-y: ordinal not in range(128)ditampilkan.-
Penyebab: Jenis tipe nilai kembali dalam signature fungsi adalah STRING, tetapi UDF MaxCompute mengembalikan objek Python bertipe UNICODE. Asumsikan objek tersebut bernama ret. Secara default, MaxCompute mencoba mengonversi nilai kembali ret ke tipe STR menggunakan format encoding ASCII dan mengembalikan
str(ret). Jika ret hanya berisi karakter ASCII, konversi ke tipe STR berhasil. Namun, jika ret berisi karakter non-ASCII, konversi gagal dan error ditampilkan. -
Solusi: Tambahkan pernyataan berikut ke metode
evaluatedalam kode Python.return ret.encode('utf-8')
-
-
Gejala 3: Saat Anda memanggil UDF Python 3, pesan error
UnicodeDecodeError: 'utf-8' codec can't decode byte xxx in position xxx: invalid continuation byteditampilkan.-
Penyebab: Jenis parameter input dalam signature fungsi adalah STRING. Namun, string input tidak dapat didekode menjadi objek Python bertipe STR menggunakan UTF-8 saat Anda memanggil UDF Python 3.
-
Solusi:
-
Hindari menulis string yang tidak diencode UTF-8 ke tabel MaxCompute.
Misalnya, UDF Python 2 mengembalikan objek Python bertipe STR yang diencode dalam GBK. Objek ini dapat ditulis ke tabel MaxCompute, tetapi tidak dapat dibaca oleh UDF Python 3. Konversi data ke encoding UTF-8 sebelum UDF Python 2 mengembalikannya. Misalnya, kembalikan
ret.decode('gbk').encode('utf-8'). -
Dalam pernyataan SQL, gunakan fungsi bawaan
is_encodinguntuk memfilter data yang tidak diencode UTF-8 terlebih dahulu. Kode berikut memberikan contoh.select py_udf(input_col) from example_table where is_encoding(input_col, 'utf-8', 'utf-8') = true; -
Ubah jenis parameter input dalam signature fungsi dalam kode Python menjadi BINARY. Dalam pernyataan SQL, konversi kolom bertipe STRING ke tipe BINARY dan gunakan sebagai parameter input untuk UDF Python 3. Kode berikut memberikan contoh.
select py_udf(cast(input_col as binary)) from example_table;
-
-
Masalah signature fungsi
Bagian ini menjelaskan masalah signature fungsi umum yang terjadi saat memanggil UDF MaxCompute.
-
Gejala 1: Pesan error
resolve annotation of class xxx for UDTF/UDF/UDAF yyy contains invalid content '<EOF>'ditampilkan.-
Penyebab: Parameter input atau output UDF MaxCompute merupakan tipe data kompleks, tetapi signature fungsinya tidak valid.
-
Solusi: Ubah tipe data kompleks dalam signature fungsi untuk memastikan signature tersebut valid. Untuk informasi lebih lanjut tentang signature fungsi, lihat Signature fungsi dan tipe data.
-
-
Gejala 2: Pesan error
TypeError: expected <class 'xxx'> but <class 'yyy'> found, value:zzzditampilkan.-
Penyebab: Jenis tipe nilai kembali yang ditentukan dalam signature fungsi tidak sesuai dengan tipe data yang sebenarnya dikembalikan oleh kode UDF MaxCompute.
-
Solusi: Konfirmasi hasil kembali yang diharapkan. Ubah signature fungsi atau kode UDF MaxCompute untuk memastikan tipe datanya konsisten.
-
-
Gejala 3: Pesan error
Semantic analysis exception - evaluate function in class xxx.yyy for user defined function zz does not match annotation ***->***ditampilkan.-
Penyebab: Jumlah parameter input yang ditentukan dalam signature fungsi tidak sesuai dengan jumlah parameter input dalam metode yang sesuai dalam kode UDF MaxCompute.
-
Solusi: Konfirmasi jumlah parameter input aktual. Ubah signature fungsi atau kode UDF MaxCompute untuk memastikan jumlah parameter input konsisten.
-
Masalah paket pihak ketiga
-
Gejala: Pesan error
GLIBCXX_x.x.x not foundditampilkan. -
Penyebab: Versi GLIBCXX yang digunakan oleh file library terhubung (.so) lebih baru daripada versi yang didukung oleh MaxCompute. Hal yang sama berlaku untuk GLIBC dan CXXABI.
-
Solusi: Gunakan paket WHEEL yang kompatibel atau kompilasi ulang file library terhubung (.so) di lingkungan yang kompatibel. Daftar berikut menunjukkan versi terbaru dependensi yang didukung untuk file executable biner atau file library terhubung (.so) di MaxCompute.
GLIBC <= 2.17 CXXABI <= 1.3.8 GLIBCXX <= 3.4.19 GCC <= 4.2.0
Masalah terkait UDTF
-
Gejala: Pesan error
Semantic analysis exception - expect 2 aliases but have 0ditampilkan. -
Penyebab: Nama kolom output tidak ditentukan dalam kode UDTF Python.
-
Solusi: Tentukan nama kolom dalam klausa
asdari pernyataan SELECT yang memanggil UDTF Python. Perintah berikut memberikan contoh.select my_udtf(col0, col1) as (ret_col0, ret_col1, ret_col2) from tmp1;
Masalah terkait UDAF
-
Gejala 1: Pesan error
Script exception - ValueError: unmarshallable objectditampilkan.-
Penyebab:
bufferdalam kode UDAF Python bukan objek Marshal. -
Solusi: Saat memberikan nilai ke
buffer, pastikan nilainya merupakan objek Marshal. Misalnya, jika Anda ingin menggunakan duabufferbertipe LIST dan DICT dalam Fungsi Agregat yang Didefinisikan Pengguna (UDAF) Python, metodenew_bufferharus didefinisikan sebagaireturn [list(), dict()]. Saat menggunakanbuffer/pbufferdalam metodeiterate/merge/terminate,bufferbertipe LIST sesuai denganbuffer[0]/pbuffer[0], danbufferbertipe DICT sesuai denganbuffer[1]/pbuffer[1]. Jika elemenbufferbertipe LIST atau DICT, elemen tersebut juga harus merupakan objek Marshal.
-
-
Gejala 2: Pesan error
Python UDAF buffer size overflowed: 2821486749ditampilkan.-
Penyebab: Ukuran
bufferdalam UDAF Python melebihi 2 GB setelah diproses olehMarshal.bufferdigunakan secara salah. Ukuranbufferseharusnya tidak meningkat seiring volume data. -
Solusi: Rancang ulang logika UDAF Python. Ukuran
bufferseharusnya tidak meningkat seiring volume data. Misalnya, jika Anda mendeklarasikanbuffersebagailist, Anda tidak boleh terus-menerus menambahkan data kebufferselama faseiteratedanmerge. Untuk informasi lebih lanjut tentang UDAF Python, lihat Ikhtisar UDAF.
-