全部产品
Search
文档中心

:FAQ tentang MaxCompute Java UDF

更新时间:Jul 02, 2025

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 ClassNotFoundException atau Beberapa dependensi tidak ditemukan muncul.

    • 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_file dari 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 perintah add <file_type> <file_name>; untuk menambahkan file yang diperlukan.

  • Masalah 2: Pesan kesalahan NoClassDefFoundError atau NoSuchMethodError muncul, atau kode kesalahan ODPS-0123055 muncul.

    • 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:

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 kInstanceMonitorTimeout muncul.

    • 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.claimAlive dalam 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) atau OutOfMemoryError muncul.

    • 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 fuxi atau runtime, 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's muncul 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 0 muncul.

    • Penyebab: Alias kolom keluaran tidak ditentukan dalam pernyataan SELECT tempat UDTF dipanggil.

    • Solusi: Anda dapat menggunakan klausa AS untuk menentukan alias kolom keluaran dalam pernyataan SELECT tempat Java UDTF dipanggil. Pernyataan sampel:

      select udtffunction_name(paramname) as (col1, col2);