All Products
Search
Document Center

MaxCompute:Pengembangan dan Debugging

Last Updated:Jun 21, 2026

MaxCompute tidak menyediakan plugin pengembangan Graph. Anda dapat mengembangkan program MaxCompute Graph berbasis Eclipse.

Alur pengembangan adalah sebagai berikut:
  1. Tulis kode Graph dan lakukan pengujian dasar menggunakan debugging lokal.
  2. Lakukan debugging di kluster untuk memverifikasi hasilnya.

Contoh Pengembangan

Bagian ini menggunakan algoritma SSSP sebagai contoh untuk menjelaskan cara mengembangkan dan mendebug program Graph menggunakan Eclipse.

Langkah-langkah operasional:
  1. Buat proyek Java dengan nama proyek graph_examples.
  2. Tambahkan file JAR dari direktori lib klien MaxCompute ke Java Build Path proyek Eclipse. Pada tab Libraries di Java Build Path, pilih mapreduce-api.jar, lalu klik dua kali pada Javadoc location, pilih Javadoc URL, dan masukkan http://odps.alibaba-inc.com/doc/prdoc/odps_graph/api/.
  3. Kembangkan program MaxCompute Graph.

    Dalam praktik pengembangan, biasanya Anda akan menyalin contoh yang sudah ada (misalnya Single Source Shortest Path), lalu memodifikasinya. Pada contoh ini, hanya path Package yang diubah menjadi package com.aliyun.odps.graph.example.

  4. Kompilasi dan buat paket JAR.

    Di lingkungan Eclipse, klik kanan pada direktori kode sumber (direktori src pada gambar), lalu pilih Export > Java > JAR file untuk menghasilkan file JAR, lalu tentukan lokasi penyimpanan file JAR tersebut, misalnya D:\\odps\\clt\\odps-graph-example-sssp.jar.

  5. Jalankan SSSP menggunakan klien MaxCompute. Untuk detailnya, lihat Menjalankan Graph.

Debugging Lokal

MaxCompute Graph mendukung mode debugging lokal, sehingga Anda dapat melakukan debugging breakpoint menggunakan Eclipse.

Langkah-langkah operasional:
  1. Unduh paket Maven odps-graph-local.
  2. Pilih proyek Eclipse, lalu klik kanan pada file program utama Graph (yang berisi fungsi main), dan konfigurasikan parameter eksekusinya (Run As > Run Configurations).
  3. Pada tab Arguments, atur parameter Program arguments menjadi 1 sssp_in sssp_out sebagai parameter input program utama.
  4. Pada tab Arguments, atur parameter VM arguments sebagai berikut.
    -Dodps.runner.mode=local
    -Dodps.project.name=<project.name>
    -Dodps.end.point=<end.point>
    -Dodps.access.id=<access.id> 
    -Dodps.access.key=<access.key>
    Atur juga parameter program pada Program arguments, misalnya 1 sssp_in sssp_out, yang masing-masing merepresentasikan node awal, nama tabel input, dan nama tabel output.
  5. Untuk mode lokal (yaitu tanpa menentukan parameter odps.end.point), Anda perlu membuat tabel sssp_in dan sssp_out di warehouse, lalu tambahkan data ke tabel input sssp_in. Data inputnya sebagai berikut.
    1,"2:2,3:1,4:4"
    2,"1:2,3:2,4:1"
    3,"1:1,2:2,5:1"
    4,"1:4,2:1,5:1"
    5,"3:1,4:1"

    Untuk informasi lebih lanjut tentang warehouse, lihat Menjalankan Secara Lokal.

  6. Klik Run untuk menjalankan SSSP secara lokal.
    Catatan Parameter yang digunakan dapat merujuk pada pengaturan di file conf/odps_config.ini klien MaxCompute. Parameter di atas merupakan beberapa parameter umum. Penjelasan parameter lainnya sebagai berikut:
    • odps.runner.mode: Nilainya harus local. Parameter ini wajib ditentukan untuk fitur debugging lokal.
    • odps.project.name: Menentukan Proyek saat ini. Parameter ini wajib ditentukan.
    • odps.end.point: Menentukan alamat layanan MaxCompute saat ini. Parameter ini bersifat opsional. Jika tidak ditentukan, sistem hanya membaca metadata dan data tabel atau resource dari warehouse lokal. Jika tidak ditemukan, sistem akan melemparkan exception. Jika ditentukan, sistem akan terlebih dahulu mencoba membaca dari warehouse lokal, dan jika tidak ditemukan, akan terhubung ke MaxCompute secara remote untuk membaca data.
    • odps.access.id: ID AccessKey untuk menghubungkan ke layanan MaxCompute. Parameter ini hanya berlaku jika odps.end.point ditentukan.
    • odps.access.key: Secret AccessKey untuk menghubungkan ke layanan MaxCompute. Parameter ini hanya berlaku jika odps.end.point ditentukan.
    • odps.cache.resources: Menentukan daftar resource yang digunakan. Efeknya sama dengan opsi -resources pada perintah Jar.
    • odps.local.warehouse: Path warehouse lokal. Jika tidak ditentukan, nilai default-nya adalah ./warehouse.
    Informasi output debugging SSSP saat dijalankan secara lokal di Eclipse sebagai berikut.
    Counters: 3
             com.aliyun.odps.graph.local.COUNTER
                     TASK_INPUT_BYTE=211
                     TASK_INPUT_RECORD=5
                     TASK_OUTPUT_BYTE=161
                     TASK_OUTPUT_RECORD=5
     graph task finish
    Catatan Pada contoh di atas, tabel sssp_in dan sssp_out harus tersedia di warehouse lokal. Informasi detail tentang sssp_in dan sssp_out dapat dilihat di Menulis Graph.

Direktori Sementara Lokal untuk Pekerjaan

Setiap kali menjalankan debugging lokal, sistem akan membuat direktori sementara baru di direktori proyek Eclipse. Contoh nama direktori sementara adalah graph_20130816154834_240_5772, yang strukturnya mencakup subdirektori dan file berikut: counters (informasi counter), inputs (data input, seperti zhemin_test1.sssp_in), outputs (hasil output, termasuk subdirektori _default_), resources (file resource, termasuk subdirektori centers), superSteps (informasi superlangkah), serta file konfigurasi pekerjaan job.xml.
Pekerjaan Graph yang dijalankan secara lokal memiliki direktori sementara yang mencakup direktori dan file berikut:
  • counters: Menyimpan informasi counter selama eksekusi pekerjaan.
  • inputs: Menyimpan data input pekerjaan. Sistem akan mengambil data terlebih dahulu dari warehouse lokal. Jika tidak tersedia secara lokal, sistem akan membaca melalui MaxCompute SDK dari server (jika parameter odps.end.point telah ditentukan). Secara default, satu input hanya membaca 10 record. Anda dapat mengubah batas ini melalui parameter -Dodps.mapred.local.record.limit, tetapi jumlahnya tidak boleh melebihi 10.000 record.
  • outputs: Menyimpan data output pekerjaan. Jika tabel output sudah ada di warehouse lokal, data hasil di dalam outputs akan menimpa tabel yang sesuai di warehouse lokal setelah pekerjaan selesai.
  • resources: Menyimpan resource yang digunakan oleh pekerjaan. Seperti halnya input, sistem akan mengambil resource terlebih dahulu dari warehouse lokal. Jika tidak tersedia secara lokal, sistem akan membaca melalui MaxCompute SDK dari server (jika parameter odps.end.point telah ditentukan).
  • job.xml: Konfigurasi pekerjaan.
  • superstep: Menyimpan informasi persistensi setiap iterasi.
Catatan Jika Anda memerlukan log detail selama debugging lokal, letakkan file konfigurasi log4j bernama log4j.properties_odps_graph_cluster_debug di direktori src.

Debugging Kluster

Setelah menyelesaikan debugging lokal, Anda dapat mengirimkan pekerjaan ke kluster untuk pengujian lebih lanjut.

Langkah-langkah operasional sebagai berikut:
  1. Konfigurasikan klien MaxCompute.
  2. Gunakan perintah add jar /path/work.jar -f; untuk memperbarui file JAR.
  3. Jalankan pekerjaan menggunakan perintah Jar, lalu periksa log eksekusi dan data hasilnya.
Catatan Untuk penjelasan lengkap tentang menjalankan Graph di kluster, lihat Menulis Graph.

Optimasi Performa

Item konfigurasi Graph Job yang memengaruhi performa sebagai berikut:
  • setSplitSize(long): Ukuran pemisahan tabel input, dalam satuan MB. Nilainya harus lebih besar dari 0, dengan nilai default 64.
  • setNumWorkers(int): Menentukan jumlah Worker untuk pekerjaan. Rentang nilainya [1, 1000], dengan nilai default 1. Jumlah Worker ditentukan berdasarkan ukuran byte input pekerjaan dan parameter splitSize.
  • setWorkerCPU(int): Resource CPU Map. Nilai 100 setara dengan 1 core CPU. Rentang nilainya [50, 800], dengan nilai default 200.
  • setWorkerMemory(int): Resource memori Map, dalam satuan MB. Rentang nilainya [256, 12288], dengan nilai default 4096.
  • setMaxIteration(int): Menentukan jumlah maksimum iterasi. Nilai default-nya -1. Jika nilainya kurang dari atau sama dengan 0, jumlah iterasi maksimum tidak digunakan sebagai kondisi penghentian pekerjaan.
  • setJobPriority(int): Menentukan prioritas pekerjaan. Rentang nilainya [0, 9], dengan nilai default 9. Semakin besar nilainya, semakin rendah prioritasnya.
Saran optimasi umum:
  • Pertimbangkan untuk meningkatkan jumlah Worker menggunakan metode setNumWorkers.
  • Pertimbangkan untuk mengurangi ukuran pemisahan menggunakan metode setSplitSize guna mempercepat proses pemuatan data.
  • Tingkatkan CPU atau memori Worker.
  • Tentukan jumlah iterasi maksimum. Jika aplikasi tertentu tidak memerlukan presisi hasil yang tinggi, pertimbangkan untuk mengurangi jumlah iterasi agar pekerjaan segera selesai.
Metode setNumWorkers dan setSplitSize dapat digunakan secara bersamaan untuk mempercepat pemuatan data. Misalkan nilai setNumWorkers adalah workerNum, nilai setSplitSize adalah splitSize, dan total ukuran byte input adalah inputSize. Maka jumlah blok setelah pemisahan adalah splitNum=inputSize/splitSize. Hubungan antara workerNum dan splitNum sebagai berikut:
  • Kasus 1: splitNum = workerNum, setiap Worker memuat 1 Split.
  • Kasus 2: splitNum > workerNum, setiap Worker memuat 1 atau beberapa Split.
  • Kasus 3: splitNum < workerNum, setiap Worker memuat 0 atau 1 Split.

Oleh karena itu, aturlah workerNum dan splitSize sedemikian rupa sehingga memenuhi Kasus 1 atau 2 agar pemuatan data lebih cepat. Pada tahap iterasi, cukup atur workerNum. Jika Anda menonaktifkan runtime partitioning (mengatur nilainya ke False), disarankan untuk langsung menggunakan setSplitSize untuk mengontrol jumlah Worker atau memastikan kondisi memenuhi Kasus 1 atau 2. Jika terjadi Kasus 3, beberapa Worker tidak akan memiliki split. Dalam situasi ini, Anda dapat menggunakan perintah set odps.graph.split.size=<m>; set odps.graph.worker.num=<n>; sebelum perintah Jar, yang efeknya setara dengan setNumWorkers dan setSplitSize.

Masalah performa umum lainnya adalah skew data (data skew), yang tercermin pada Counters berupa jumlah vertex atau edge yang diproses oleh beberapa Worker jauh melebihi Worker lainnya. Penyebab skew data biasanya karena jumlah vertex, edge, atau pesan yang terkait dengan beberapa kunci (key) jauh lebih besar dibandingkan kunci lainnya. Kunci-kunci tersebut dialokasikan ke sejumlah kecil Worker, sehingga menyebabkan waktu eksekusi Worker tersebut lebih lama. Solusinya:
  • Coba gunakan Combiner untuk mengagregasi pesan yang terkait dengan kunci tersebut secara lokal, sehingga mengurangi jumlah pesan yang dikirim.

    Pengembang dapat mendefinisikan Combiner untuk mengurangi penggunaan memori untuk menyimpan pesan dan volume lalu lintas jaringan, sehingga memperpendek waktu eksekusi pekerjaan.

  • Perbaiki logika bisnis.
    Saat volume data besar, membaca data dari disk dapat memakan sebagian waktu pemrosesan. Mengurangi jumlah byte data yang perlu dibaca dapat meningkatkan throughput keseluruhan dan performa pekerjaan. Anda dapat menerapkan pendekatan berikut:
    • Kurangi volume data input: Untuk aplikasi yang bersifat pengambilan keputusan, hasil yang diperoleh dari subset data yang telah di-sampling biasanya hanya memengaruhi presisi hasil, bukan akurasinya secara keseluruhan. Oleh karena itu, pertimbangkan untuk melakukan sampling data tertentu terlebih dahulu sebelum mengimpornya ke tabel input untuk diproses.
    • Hindari membaca field yang tidak digunakan: Kelas TableInfo pada framework MaxCompute Graph mendukung pembacaan kolom tertentu (dengan meneruskan array nama kolom), bukan seluruh tabel atau partisi tabel. Pendekatan ini juga dapat mengurangi volume data input dan meningkatkan performa pekerjaan.

Paket JAR Bawaan

Paket JAR berikut akan dimuat secara default ke JVM yang menjalankan program Graph. Anda tidak perlu mengunggah resource ini atau menyertakannya dalam opsi -libjars pada baris perintah.
  • commons-codec-1.3.jar
  • commons-io-2.0.1.jar
  • commons-lang-2.5.jar
  • commons-logging-1.0.4.jar
  • commons-logging-api-1.0.4.jar
  • guava-14.0.jar
  • json.jar
  • log4j-1.2.15.jar
  • slf4j-api-1.4.3.jar
  • slf4j-log4j12-1.4.3.jar
  • xmlenc-0.52.jar
Catatan Pada Classpath JVM, paket JAR bawaan di atas akan ditempatkan sebelum paket JAR Anda, sehingga berpotensi menimbulkan konflik versi. Sebagai contoh, jika program Anda menggunakan fungsi tertentu dari kelas dalam commons-codec-1.5.jar yang tidak tersedia dalam commons-codec-1.3.jar, dan versi 1.3 tidak memenuhi kebutuhan Anda, maka Anda harus menunggu MaxCompute memperbarui ke versi yang lebih baru.