MaxCompute tidak menyediakan plugin pengembangan Graph. Anda dapat mengembangkan program MaxCompute Graph berbasis Eclipse.
- Tulis kode Graph dan lakukan pengujian dasar menggunakan debugging lokal.
- 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.
- Buat proyek Java dengan nama proyek graph_examples.
- 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/. - 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.
- Kompilasi dan buat paket JAR.
Di lingkungan Eclipse, klik kanan pada direktori kode sumber (direktori src pada gambar), lalu pilih untuk menghasilkan file JAR, lalu tentukan lokasi penyimpanan file JAR tersebut, misalnya D:\\odps\\clt\\odps-graph-example-sssp.jar.
- 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.
- Unduh paket Maven odps-graph-local.
- Pilih proyek Eclipse, lalu klik kanan pada file program utama Graph (yang berisi fungsi
main), dan konfigurasikan parameter eksekusinya (). - Pada tab Arguments, atur parameter Program arguments menjadi 1 sssp_in sssp_out sebagai parameter input program utama.
- Pada tab Arguments, atur parameter VM arguments sebagai berikut.
Atur juga parameter program pada Program arguments, misalnya-Dodps.runner.mode=local -Dodps.project.name=<project.name> -Dodps.end.point=<end.point> -Dodps.access.id=<access.id> -Dodps.access.key=<access.key>1 sssp_in sssp_out, yang masing-masing merepresentasikan node awal, nama tabel input, dan nama tabel output. - 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.
- 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
-resourcespada 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 finishCatatan 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
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.- 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.
Debugging Kluster
Setelah menyelesaikan debugging lokal, Anda dapat mengirimkan pekerjaan ke kluster untuk pengujian lebih lanjut.
- Konfigurasikan klien MaxCompute.
- Gunakan perintah
add jar /path/work.jar -f;untuk memperbarui file JAR. - Jalankan pekerjaan menggunakan perintah Jar, lalu periksa log eksekusi dan data hasilnya.
Optimasi Performa
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 parametersplitSize.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.
- Pertimbangkan untuk meningkatkan jumlah Worker menggunakan metode
setNumWorkers. - Pertimbangkan untuk mengurangi ukuran pemisahan menggunakan metode
setSplitSizeguna 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.
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.
- 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
-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