Topik ini menjawab beberapa pertanyaan umum terkait fungsi yang ditentukan pengguna (UDF) MaxCompute yang ditulis dalam Java.
Masalah terkait kelas atau dependensi
Saat memanggil MaxCompute UDF, masalah berikut terkait dengan kelas atau dependensi dapat terjadi:
Masalah 1: Pesan kesalahan
ClassNotFoundExceptionatauBeberapa dependensi tidak ditemukanmuncul.Penyebab:
Penyebab 1: File JAR yang ditentukan saat membuat UDF tidak valid.
Penyebab 2: Satu atau lebih file JAR yang menjadi dependensi UDF belum diunggah ke MaxCompute. Contohnya, paket pihak ketiga yang diperlukan belum diunggah.
Penyebab 3: UDF dipanggil di proyek MaxCompute yang berbeda dari tempat UDF dibuat. Misalnya, sebuah MaxCompute UDF dibuat di proyek pengembangan tetapi dipanggil di proyek produksi.
Penyebab 4: File yang diperlukan tidak ada atau tipe sumber daya tidak valid. Contohnya, tipe file yang diunggah adalah PY, tetapi tipe file yang ditentukan dalam
get_cache_filedari kode UDF adalah FILE.
Solusi:
Solusi untuk Penyebab 1: Periksa isi file JAR dan pastikan file tersebut mencakup semua kelas yang diperlukan. Kemudian, kemas ulang sumber daya ke dalam file JAR dan unggah file tersebut ke proyek MaxCompute Anda. Untuk informasi lebih lanjut tentang cara mengemas sumber daya ke dalam file dan mengunggah file ke proyek MaxCompute Anda, lihat Kemas program Java, unggah paket, dan buat MaxCompute UDF.
Solusi untuk Penyebab 2: Unggah paket pihak ketiga yang diperlukan sebagai sumber daya ke proyek MaxCompute. Kemudian, tambahkan paket ini ke daftar sumber daya saat membuat UDF. Untuk informasi lebih lanjut tentang cara mengunggah sumber daya dan membuat UDF, lihat Tambahkan sumber daya dan Buat UDF.
Solusi untuk Penyebab 3: Pada klien MaxCompute, jalankan perintah
list functions;untuk proyek tempat MaxCompute UDF dipanggil. Pastikan bahwa MaxCompute UDF muncul dalam output perintah dan kelas serta sumber daya yang diperlukan dari MaxCompute UDF valid.Solusi untuk Penyebab 4: Pada klien MaxCompute, jalankan perintah
desc function <function_name>;. Pastikan semua file yang diperlukan terdaftar di daftar sumber daya dalam output perintah. Jika tipe file yang diunggah tidak sesuai dengan tipe file yang ditentukan dalam get_cache_file, Anda dapat menjalankan perintahadd <file_type> <file_name>;untuk menambahkan file yang diperlukan.
Masalah 2: Pesan kesalahan
NoClassDefFoundErroratauNoSuchMethodErrormuncul, atau kode kesalahanODPS-0123055muncul.Penyebab:
Penyebab 1: Versi pustaka pihak ketiga yang termasuk dalam paket JAR yang diunggah berbeda dengan versi pustaka pihak ketiga bawaan di MaxCompute.
Penyebab 2: Penggunaan sandbox Java dibatasi. Informasi rinci
java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "createClassLoader")muncul di Stderr dari instans pekerjaan. Masalah ini disebabkan oleh batasan sandbox Java. MaxCompute UDF yang berjalan dalam mode terdistribusi dibatasi oleh sandbox Java. Untuk informasi lebih lanjut tentang batasan sandbox Java, lihat Sandbox Java.
Solusi:
Solusi untuk Penyebab 1: Gunakan
maven-shade-pluginuntuk menyelesaikan ketidaksesuaian versi dan modifikasi jalur impor. Kemudian, kemas ulang file JAR dan unggah paket ke proyek MaxCompute. Untuk informasi lebih lanjut tentang cara mengemas file JAR dan mengunggah paket, lihat Kemas program Java, unggah paket, dan buat MaxCompute UDF.Solusi untuk Penyebab 2: Untuk informasi lebih lanjut, lihat Masalah terkait batasan sandbox Java.
Masalah terkait batasan sandbox Java
Masalah 1: Kesalahan terjadi saat MaxCompute UDF dipanggil untuk mengakses file lokal, mengakses Internet, mengakses sistem file terdistribusi, atau membuat thread Java.
Penyebab: Secara default, MaxCompute tidak mengizinkan akses ke sumber daya jaringan menggunakan UDF.
Solusi: Isi dan kirimkan formulir aplikasi koneksi jaringan sesuai kebutuhan bisnis Anda. Tim dukungan teknis MaxCompute kemudian akan menghubungi Anda untuk menetapkan koneksi jaringan. Untuk informasi lebih lanjut tentang cara mengisi formulir aplikasi, lihat Proses koneksi jaringan.
Masalah terkait performa
Saat memanggil MaxCompute UDF, masalah performa berikut dapat terjadi:
Masalah 1: Pesan kesalahan
kInstanceMonitorTimeoutmuncul.Penyebab: Pemrosesan data MaxCompute UDF habis waktu. Secara default, durasi pemrosesan data oleh UDF dibatasi. Dalam sebagian besar kasus, UDF harus memproses 1024 baris data sekaligus dalam 1800 detik. Durasi ini bukan total durasi waktu kerja berjalan, melainkan durasi pemrosesan batch kecil data rekaman sekaligus. Dalam banyak kasus, MaxCompute SQL dapat memproses lebih dari 10.000 baris data per detik. Batasan ini bertujuan hanya untuk mencegah loop tak terbatas dalam MaxCompute UDF. Jika loop tak terbatas terjadi, sumber daya CPU akan digunakan dalam waktu lama.
Solusi:
Jika MaxCompute perlu memproses sejumlah besar data, Anda dapat memanggil
ExecutionContext.claimAlivedalam metode kelas Java dari MaxCompute UDF untuk mereset timer.Optimalkan logika kode MaxCompute UDF. Setelah dioptimalkan, Anda dapat mengonfigurasi parameter berikut pada tingkat sesi untuk menyesuaikan operasi MaxCompute UDF sebelum memanggil MaxCompute UDF. Dengan cara ini, pemrosesan data dipercepat.
Parameter
Deskripsi
set odps.function.timeout=xxx;Durasi timeout untuk menjalankan UDF. Nilai default: 1800. Unit: detik. Anda dapat meningkatkan nilai parameter ini berdasarkan kebutuhan bisnis Anda. Nilai valid: 1 hingga 3600.
set odps.stage.mapper.split.size=xxx;Jumlah data input pekerja Map. Nilai default: 256. Unit: MB. Anda dapat menurunkan nilai parameter ini berdasarkan kebutuhan bisnis Anda.
set odps.sql.executionengine.batch.rowcount=xxx;Jumlah baris yang dapat diproses MaxCompute sekaligus. Nilai default: 1024. Anda dapat menurunkan nilai parameter ini berdasarkan kebutuhan bisnis Anda.
Masalah 2: Pesan kesalahan
errMsg:SigKill(OOM)atauOutOfMemoryErrormuncul.Penyebab: MaxCompute menjalankan pekerjaan dalam tiga tahap: Map, Reduce, dan Join. Jika MaxCompute memproses sejumlah besar data, pemrosesan data setiap instans pada setiap tahap memakan waktu lama.
Solusi:
Jika kesalahan dilaporkan untuk kode
fuxiatauruntime, Anda dapat mengonfigurasi parameter sumber daya berikut untuk mempercepat pemrosesan data.Parameter
Deskripsi
set odps.stage.mapper.mem=xxx;Ukuran memori pekerja Map. Nilai default: 1024. Unit: MB. Anda dapat meningkatkan nilai parameter ini berdasarkan kebutuhan bisnis Anda.
set odps.stage.reducer.mem=xxx;Ukuran memori pekerja Reduce. Nilai default: 1024. Unit: MB. Anda dapat meningkatkan nilai parameter ini berdasarkan kebutuhan bisnis Anda.
set odps.stage.joiner.mem=xxx;Ukuran memori pekerja Join. Nilai default: 1024. Unit: MB. Anda dapat meningkatkan nilai parameter ini berdasarkan kebutuhan bisnis Anda.
set odps.stage.mapper.split.size=xxx;Jumlah data input pekerja Map. Nilai default: 256. Unit: MB. Anda dapat meningkatkan nilai parameter ini berdasarkan kebutuhan bisnis Anda.
set odps.stage.reducer.num=xxx;Jumlah pekerja Reduce. Anda dapat meningkatkan nilai parameter ini berdasarkan kebutuhan bisnis Anda.
set odps.stage.joiner.num=xxx;Jumlah pekerja Join. Anda dapat meningkatkan nilai parameter ini berdasarkan kebutuhan bisnis Anda.
Jika kesalahan ini dilaporkan untuk kode Java, Anda dapat menyesuaikan parameter di atas dan menjalankan perintah
set odps.sql.udf.jvm.memory=xxx;untuk meningkatkan ukuran memori Java Virtual Machine (JVM).
Untuk informasi lebih lanjut tentang parameter, lihat Operasi SET.
Masalah terkait UDTF
Saat memanggil Java UDTF, masalah berikut dapat terjadi:
Masalah 1: Pesan kesalahan
Semantic analysis exception - only a single expression in the SELECT clause is supported with UDTF'smuncul saat memanggil UDTF.Penyebab: Kolom atau ekspresi ditentukan dalam pernyataan SELECT tempat UDTF dipanggil. Kode sampel berikut menunjukkan pernyataan SQL yang salah:
select b.*, 'x', udtffunction_name(v) from table lateral view udtffunction_name(v) b as f1, f2;Solusi: Anda dapat menggunakan Java UDTF dengan Lateral View dalam pernyataan SELECT. Pernyataan sampel:
select b.*, 'x' from table lateral view udtffunction_name(v) b as f1, f2;
Masalah 2: Pesan kesalahan
Semantic analysis exception - expect 2 aliases but have 0muncul.Penyebab: Alias kolom keluaran tidak ditentukan dalam pernyataan SELECT tempat UDTF dipanggil.
Solusi: Anda dapat menggunakan klausa
ASuntuk menentukan alias kolom keluaran dalam pernyataan SELECT tempat Java UDTF dipanggil. Pernyataan sampel:select udtffunction_name(paramname) as (col1, col2);