全部产品
Search
文档中心

MaxCompute:Pengembangan dan Debugging

更新时间:Jun 19, 2025

Topik ini menjelaskan cara menggunakan Eclipse untuk mengembangkan program MaxCompute Graph karena Plugin pengembangan Graph tidak tersedia di MaxCompute.

Proses pengembangan meliputi langkah-langkah berikut:
  1. Kompilasi kode Graph dan lakukan debugging lokal untuk menguji fungsi dasar.
  2. Lakukan debugging kluster untuk memverifikasi hasilnya.

Contoh Pengembangan

Topik ini menggunakan algoritma SSSP sebagai contoh untuk menjelaskan cara menggunakan Eclipse dalam mengembangkan dan men-debug program MaxCompute Graph.

Prosedur:
  1. Buat proyek Java bernama graph_examples.
  2. Tambahkan paket JAR dari direktori lib pada klien MaxCompute ke Java Build Path proyek Eclipse.
  3. Kembangkan program MaxCompute Graph.

    Dalam proses pengembangan sebenarnya, program contoh seperti SSSP pertama-tama disalin lalu dimodifikasi. Dalam contoh ini, jalur paket diubah menjadi package com.aliyun.odps.graph.example.

  4. Kompilasi dan kemas kode.

    Di lingkungan Eclipse, klik kanan direktori kode sumber, yaitu direktori src, dan pilih Export > Java > JAR file untuk menghasilkan paket JAR. Pilih jalur penyimpanan paket JAR, misalnya D:\\odps\\clt\\odps-graph-example-sssp.jar.

  5. Jalankan SSSP pada klien MaxCompute. Untuk informasi lebih lanjut, lihat (Opsional) Kirim Pekerjaan Graph.

Debugging Lokal

MaxCompute Graph mendukung mode debugging lokal. Anda dapat menggunakan Eclipse untuk melakukan debugging dengan breakpoint.

Prosedur:
  1. Unduh paket Maven bernama odps-graph-local.
  2. Pilih proyek Eclipse, klik kanan file program utama yang berisi fungsi main dari pekerjaan Graph, dan pilih Run As > Run Configurations untuk mengonfigurasi parameter.
  3. Pada tab Arguments, atur Program arguments ke 1 sssp_in sssp_out sebagai parameter input untuk program utama.
  4. Pada tab Arguments, atur VM arguments menjadi konten 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>
    Parameter configuration
  5. Dalam mode lokal di mana odps.end.point tidak ditentukan, buat tabel sssp_in dan sssp_out di direktori warehouse dan tambahkan data berikut ke tabel sssp_in:
    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 direktori warehouse, lihat Pekerjaan Berjalan dalam Mode Lokal.

  6. Klik Run untuk menjalankan SSSP pada klien lokal.
    null Konfigurasikan parameter berdasarkan pengaturan di conf/odps_config.ini pada klien MaxCompute. Parameter di atas sering digunakan. Deskripsi parameter lainnya:
    • odps.runner.mode: Nilainya adalah local. Parameter ini diperlukan untuk fitur debugging lokal.
    • odps.project.name: Menentukan proyek saat ini. Parameter ini diperlukan.
    • odps.end.point: Menentukan titik akhir MaxCompute. Parameter ini opsional. Jika parameter ini tidak ditentukan, metadata dan data tabel atau sumber daya hanya dibaca dari direktori warehouse. Pengecualian dilaporkan jika data tersebut tidak ada di direktori. Jika parameter ini ditentukan, metadata dan data dibaca dari direktori warehouse terlebih dahulu dan kemudian dari server MaxCompute jarak jauh jika data tersebut tidak ada di direktori.
    • odps.access.id: Menentukan ID AccessKey yang digunakan untuk mengakses MaxCompute. Parameter ini valid hanya jika odps.end.point ditentukan.
    • odps.access.key: Menentukan Rahasia AccessKey yang digunakan untuk mengakses MaxCompute. Parameter ini valid hanya jika odps.end.point ditentukan.
    • odps.cache.resources: Menentukan sumber daya yang ingin Anda gunakan. Parameter ini berfungsi sama dengan -resources dari perintah jar.
    • odps.local.warehouse: Menentukan jalur lokal ke warehouse. Nilai defaultnya adalah ./warehouse.
    Output debugging lokal SSSP di Eclipse:
    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
    null Dalam contoh ini, tabel sssp_in dan sssp_out harus ada di direktori warehouse lokal. Untuk informasi lebih lanjut tentang tabel sssp_in dan sssp_out, lihat Tulis Pekerjaan Graph.

Direktori Sementara Pekerjaan Lokal

Setiap kali debugging lokal dilakukan, direktori sementara dibuat di direktori proyek Eclipse.
Direktori sementara pekerjaan Graph lokal mencakup direktori dan file berikut:
  • counters: Menyimpan informasi counter yang dihasilkan selama pekerjaan berjalan.
  • inputs: Menyimpan data input pekerjaan. Data dibaca dari direktori warehouse lokal terlebih dahulu. Jika tidak ada data yang tersedia, SDK MaxCompute membaca data dari server jika odps.end.point ditentukan. Direktori input hanya membaca 10 rekaman data secara default. Ambang batas ini dapat diubah dengan menggunakan parameter -Dodps.mapred.local.record.limit, dengan nilai maksimum 10000.
  • outputs: Menyimpan data output pekerjaan. Jika tabel output ada di direktori warehouse lokal, hasil di outputs akan menimpa data di tabel itu setelah pekerjaan selesai.
  • resources: Menyimpan sumber daya yang digunakan oleh pekerjaan. Mirip dengan data input, data sumber daya dibaca dari direktori warehouse lokal terlebih dahulu. Jika tidak ada data yang tersedia, SDK MaxCompute membaca data dari server jika odps.end.point ditentukan.
  • job.xml: Menyimpan konfigurasi pekerjaan.
  • superstep: Menyimpan pesan persisten dari setiap iterasi.
null Jika log rinci harus dicatat selama debugging lokal, Anda harus membuat file konfigurasi log4j bernama log4j.properties_odps_graph_cluster_debug di direktori src.

Debugging Kluster

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

Prosedur:
  1. Konfigurasikan klien MaxCompute.
  2. Jalankan perintah add jar /path/work.jar -f; untuk memperbarui paket JAR.
  3. Jalankan perintah jar untuk mengeksekusi pekerjaan dan periksa log operasional serta keluaran perintah.
null Untuk informasi lebih lanjut tentang cara menjalankan pekerjaan Graph di kluster, lihat Tulis Pekerjaan Graph.

Optimasi Kinerja

Konfigurasi yang mempengaruhi kinerja Graph:
  • setSplitSize(long): Menentukan ukuran split tabel input. Satuannya adalah MB. Nilainya harus lebih besar dari 0. Nilai defaultnya adalah 64.
  • setNumWorkers(int): Menentukan jumlah pekerja untuk pekerjaan. Nilainya berkisar dari 1 hingga 1000. Nilai defaultnya adalah 1. Jumlah pekerja ditentukan oleh byte input pekerjaan dan splitSize.
  • setWorkerCPU(int): Menentukan sumber daya CPU dari Map. Nilainya berkisar dari 50 hingga 800. Nilai defaultnya adalah 200. Satu inti CPU berisi 100 sumber daya.
  • setWorkerMemory(int): Menentukan sumber daya memori dari Map. Satuannya adalah MB. Memori berkisar dari 256 hingga 12288. Nilai defaultnya adalah 4096.
  • setMaxIteration(int): Menentukan jumlah maksimum iterasi. Nilai defaultnya adalah -1. Jika nilainya kurang dari atau sama dengan 0, pekerjaan tidak berhenti ketika jumlah maksimum iterasi tercapai.
  • setJobPriority(int): Menentukan prioritas pekerjaan. Nilainya berkisar dari 0 hingga 9. Nilai defaultnya adalah 9. Semakin besar nilainya, semakin rendah prioritasnya.
Kami merekomendasikan agar Anda mengoptimalkan kinerja dengan menggunakan satu atau lebih metode berikut:
  • Gunakan setNumWorkers untuk meningkatkan jumlah pekerja.
  • Gunakan setSplitSize untuk mengurangi ukuran split dan meningkatkan kecepatan pemuatan data.
  • Tingkatkan sumber daya CPU atau memori untuk pekerja.
  • Tetapkan jumlah maksimum iterasi. Untuk aplikasi yang tidak memerlukan hasil yang tepat, Anda dapat mengurangi jumlah iterasi untuk mempercepat proses eksekusi.
setNumWorkers dan setSplitSize dapat digunakan bersama-sama untuk mempercepat pemuatan data. Anggaplah nilai setNumWorkers sama dengan nilai workerNum, nilai setSplitSize sama dengan nilai splitSize, dan total jumlah byte input adalah nilai inputSize. Jumlah rekaman data split dihitung dengan menggunakan rumus berikut: splitNum = inputSize/splitSize. Hubungan antara workerNum dan splitNum:
  • Jika nilai splitNum sama dengan nilai workerNum, setiap pekerja memuat satu rekaman data split.
  • Jika nilai splitNum lebih besar dari nilai workerNum, setiap pekerja memuat satu atau lebih rekaman data split.
  • Jika nilai splitNum lebih kecil dari nilai workerNum, setiap pekerja mengunggah satu atau tanpa rekaman data split.

Oleh karena itu, Anda dapat menyesuaikan workerNum dan splitSize untuk mendapatkan kecepatan pemuatan data yang sesuai. Dalam dua kasus pertama, data dimuat lebih cepat. Dalam fase iterasi, Anda hanya perlu menyesuaikan workerNum. Jika Anda mengatur runtime partitioning ke False, kami merekomendasikan agar Anda menggunakan setSplitSize untuk menyesuaikan jumlah pekerja atau memastikan bahwa kondisi dalam dua kasus pertama terpenuhi. Dalam kasus ketiga, beberapa pekerja tidak memuat rekaman data split. Oleh karena itu, Anda dapat menyisipkan set odps.graph.split.size=<m>; set odps.graph.worker.num=<n>; sebelum perintah jar untuk mencapai efek yang sama dengan setNumWorkers dan setSplitSize.

Masalah kinerja umum lainnya adalah skew data. Seperti yang ditunjukkan oleh counter, beberapa pekerja memproses rekaman data split atau tepi yang berlebihan dibandingkan yang lain. Skew data terjadi ketika jumlah rekaman data split, tepi, atau pesan yang sesuai dengan beberapa kunci jauh lebih besar daripada kunci lainnya. Kunci-kunci ini diproses oleh sejumlah kecil pekerja, yang menghasilkan waktu runtime yang lebih lama. Untuk mengatasi masalah ini, coba satu atau lebih metode berikut:
  • Gunakan combiner untuk mengumpulkan pesan dari rekaman data split yang sesuai dengan kunci untuk mengurangi jumlah pesan yang dihasilkan.

    Pengembang dapat mendefinisikan combiner untuk mengurangi memori dan lalu lintas jaringan yang dikonsumsi oleh penyimpanan pesan, yang mengurangi durasi eksekusi pekerjaan.

  • Tingkatkan logika bisnis.
    Jika volume data besar, membaca data di disk mungkin memakan waktu pemrosesan. Oleh karena itu, Anda dapat mengurangi byte data yang dibaca untuk meningkatkan throughput keseluruhan. Ini meningkatkan kinerja pekerjaan. Untuk mengurangi byte data, gunakan salah satu metode berikut:
    • Kurangi input data: Untuk beberapa aplikasi pengambilan keputusan, memproses data sampel hanya memengaruhi presisi hasil, bukan akurasi keseluruhan. Dalam hal ini, Anda dapat melakukan sampling data khusus dan mengimpor data ke tabel input untuk diproses.
    • Hindari membaca bidang yang tidak digunakan: Kelas TableInfo dari kerangka kerja MaxCompute Graph mendukung membaca kolom tertentu yang ditransfer dengan menggunakan array nama kolom, bukan membaca seluruh tabel atau partisi. Ini mengurangi volume data input dan meningkatkan kinerja pekerjaan.

Paket JAR Bawaan

Secara default, paket JAR berikut dimuat pada JVM yang menjalankan program Graph. Anda tidak perlu mengunggah sumber daya ini secara manual atau menggunakan -libjars untuk menentukannya dalam 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
null Dalam classpath JVM, paket JAR bawaan di atas ditempatkan sebelum paket JAR Anda, yang dapat mengakibatkan konflik versi. Misalnya, program Anda memanggil fungsi kelas tertentu di commons-codec-1.5.jar, tetapi fungsi tersebut tidak termasuk di commons-codec-1.3.jar. Dalam hal ini, Anda dapat memilih untuk memanggil fungsi serupa di commons-codec-1.3.jar atau menunggu hingga MaxCompute diperbarui ke versi yang diperlukan.