Masalah umum dan solusi terkait fungsi user-defined (UDF) MaxCompute yang ditulis dalam Java, mencakup error pemuatan kelas, pembatasan sandbox, timeout performa, serta penggunaan UDTF.
Masalah kelas atau dependensi
Berikut adalah masalah umum terkait kelas atau dependensi saat memanggil UDF MaxCompute:
-
Gejala 1: Terjadi error waktu proses dengan pesan
ClassNotFoundExceptionatauSome dependencies are missing.-
Penyebab:
-
Paket resource JAR yang ditentukan saat membuat UDF salah.
-
Paket resource JAR tempat UDF bergantung belum diunggah ke MaxCompute. Misalnya, paket pihak ketiga yang diperlukan belum diunggah.
-
Proyek yang digunakan saat memanggil UDF salah. UDF tidak berada di proyek MaxCompute saat ini. Misalnya, UDF didaftarkan di proyek pengembangan tetapi dipanggil di proyek produksi.
-
Resource file tidak ada atau jenis resource salah. Misalnya, untuk file PY, jenis resourcenya adalah PY, tetapi jenis yang dibutuhkan oleh
get_cache_filedalam kode UDF adalah FILE.
-
-
Solusi:
-
Periksa paket JAR untuk memastikan bahwa paket tersebut benar dan berisi kelas yang diperlukan. Kemas ulang file tersebut dan unggah ke proyek MaxCompute. Untuk informasi lebih lanjut tentang pengemasan, pengunggahan, dan pendaftaran, lihat Package, upload, and register a UDF.
-
Unggah paket pihak ketiga tempat UDF bergantung ke proyek MaxCompute sebagai resource. Lalu, tambahkan paket ini ke daftar resource dependensi saat mendaftarkan fungsi. Untuk informasi lebih lanjut tentang penambahan resource dan pendaftaran fungsi, lihat Add a resource dan Register a function.
-
Untuk mengatasi masalah yang dijelaskan pada Penyebab 3, jalankan perintah
list functions;di proyek tempat error terjadi menggunakan MaxCompute client. Hal ini memastikan bahwa UDF MaxCompute tersedia dan kelas serta resource dependensinya benar. -
Untuk mengatasi masalah yang dijelaskan pada Penyebab 4, gunakan MaxCompute client untuk menjalankan perintah
desc function <function_name>;guna memastikan bahwa daftar Resources mencakup semua resource file yang diperlukan. Jika jenis resource tidak sesuai, Anda dapat menjalankan perintahadd <file_type> <file_name>;untuk menambahkan kembali resource tersebut.
-
-
-
Gejala 2: Tampil pesan error waktu proses, seperti
NoClassDefFoundErroratauNoSuchMethodError, atau kode error-nya adalahODPS-0123055.-
Penyebab:
-
Versi library pihak ketiga dalam paket JAR yang diunggah tidak konsisten dengan versi library pihak ketiga bawaan MaxCompute.
-
Pembatasan sandbox Java. Jika Stderr dari instans pekerjaan berisi pesan
java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "createClassLoader"), hal ini menunjukkan adanya pembatasan sandbox. UDF MaxCompute tunduk pada pembatasan sandbox Java saat dijalankan di lingkungan terdistribusi. Untuk informasi lebih lanjut tentang pembatasan sandbox Java, lihat Java sandbox.
-
-
Solusi:
-
Anda dapat menggunakan
maven-shade-pluginuntuk mengatasi inkonsistensi versi dan memodifikasi path impor. Kemas ulang file menjadi paket JAR dan unggah ke proyek MaxCompute. Untuk informasi lebih lanjut tentang pengemasan, pengunggahan, dan pendaftaran, lihat Package, upload, and register a UDF.
-
-
Masalah pembatasan sandbox Java
-
Gejala: Terjadi error saat memanggil UDF MaxCompute untuk mengakses file lokal, jaringan publik, sistem file terdistribusi, atau membuat thread Java.
-
Penyebab: Pembatasan jaringan. Secara default, UDF MaxCompute tidak dapat mengakses jaringan.
-
Solusi: Isi dan kirimkan formulir permintaan konektivitas jaringan sesuai kebutuhan bisnis Anda. Tim dukungan teknis MaxCompute akan menghubungi Anda untuk mengaktifkan akses jaringan. Untuk petunjuk cara mengisi formulir, lihat Network access procedure.
Masalah performa
Berikut adalah masalah performa umum saat memanggil UDF MaxCompute:
-
Gejala 1: Error waktu proses adalah
kInstanceMonitorTimeout.-
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:
-
Jika volume data aktual untuk komputasi besar, Anda dapat memanggil
ExecutionContext.claimAlivedalam metode kelas implementasi UDF untuk mengatur ulang timer. -
Optimalkan logika kode UDF. Anda juga dapat mengonfigurasi parameter tingkat sesi berikut untuk menyesuaikan waktu proses UDF dan meningkatkan kecepatan pemrosesan.
Parameter
Deskripsi
set odps.function.timeout=xxx;Menyesuaikan timeout waktu proses UDF. Nilai default adalah 1800 detik. Anda dapat menaikkan nilai ini sesuai kebutuhan. Rentang nilainya antara 1 detik hingga 3600 detik.
set odps.stage.mapper.split.size=xxx;Menyesuaikan volume data masukan untuk worker Map. Nilai default adalah 256 MB. Anda dapat menurunkan nilai ini sesuai kebutuhan.
set odps.sql.executionengine.batch.rowcount=xxx;Menyesuaikan jumlah baris data yang diproses MaxCompute sekaligus. Nilai default adalah 1024. Anda dapat menurunkan nilai ini sesuai kebutuhan.
-
-
-
Gejala 2: Waktu proses mengembalikan pesan error
errMsg:SigKill(OOM)atauOutOfMemoryError.-
Penyebab: Pekerjaan MaxCompute berjalan dalam tiga tahap utama: Map, Reduce, dan Join. Jika volume data besar, setiap instans dalam tahap-tahap tersebut mungkin memerlukan waktu pemrosesan yang lama.
-
Solusi:
-
Jika error terkait dengan kode
fuxiatauruntime, Anda dapat mengatur parameter resource berikut untuk meningkatkan kecepatan pemrosesan.Parameter
Deskripsi
set odps.stage.mapper.mem=xxx;Menyesuaikan ukuran memori worker Map. Nilai default adalah 1024 MB. Anda dapat menaikkan nilai ini sesuai kebutuhan.
set odps.stage.reducer.mem=xxx;Menyesuaikan ukuran memori worker Reduce. Nilai default adalah 1024 MB. Anda dapat menaikkan nilai ini sesuai kebutuhan.
set odps.stage.joiner.mem=xxx;Menyesuaikan ukuran memori worker Join. Nilai default adalah 1024 MB. Anda dapat menaikkan nilai ini sesuai kebutuhan.
set odps.stage.mapper.split.size=xxx;Menyesuaikan volume data masukan untuk worker Map. Nilai default adalah 256 MB. Anda dapat menaikkan nilai ini sesuai kebutuhan.
set odps.stage.reducer.num=xxx;Menyesuaikan jumlah worker pada tahap Reduce. Anda dapat menaikkan nilai ini sesuai kebutuhan.
set odps.stage.joiner.num=xxx;Menyesuaikan jumlah worker pada tahap Join. Anda dapat menaikkan nilai ini sesuai kebutuhan.
-
Jika error terjadi di kode Java, Anda juga dapat menaikkan memori JVM dengan mengatur
set odps.sql.udf.jvm.memory=xxx;selain parameter di atas.
-
-
Untuk informasi lebih lanjut tentang parameter, lihat SET operations.
Masalah terkait UDTF
Berikut adalah masalah umum saat memanggil fungsi user-defined table-valued (UDTF) Java:
-
Gejala 1: Error waktu proses:
Semantic analysis exception: only a single expression in the SELECT clause is supported with UDTFs.-
Penyebab: Saat memanggil UDTF Java dalam pernyataan SELECT, UDTF dicampur dengan kolom atau ekspresi lain. Hal ini tidak didukung. Contoh berikut menunjukkan penggunaan yang salah.
select b.*, 'x', udtffunction_name(v) from table lateral view udtffunction_name(v) b as f1, f2; -
Solusi: Gunakan UDTF Java dengan LATERAL VIEW. Contoh:
select b.*, 'x' from table lateral view udtffunction_name(v) b as f1, f2;
-
-
Gejala 2: Error waktu proses:
Semantic analysis exception - expect 2 aliases but have 0.-
Penyebab: Nama kolom output tidak ditentukan dalam kode UDTF Java.
-
Solusi: Tentukan nama kolom dalam klausa
aspernyataan SELECT. Contoh:select udtffunction_name(paramname) as (col1, col2);
-