All Products
Search
Document Center

MaxCompute:FAQ MapReduce

Last Updated:Aug 22, 2026

Topik ini menjelaskan pertanyaan yang sering diajukan (FAQ) mengenai penggunaan MapReduce.

Kategori

FAQ

Pertanyaan fitur

Mengembangkan MapReduce

Galat umum

Dapatkah view menjadi sumber input untuk MapReduce?

Tidak. Input harus berupa tabel.

Ketika MapReduce menulis hasil ke tabel atau partisi, apakah data ditimpa atau ditambahkan?

Data yang ada di tabel atau partisi tersebut akan ditimpa.

Dapatkah saya memanggil file shell di MapReduce?

Tidak, Anda tidak dapat melakukannya. Aksi ini dibatasi oleh sandbox Java. Untuk informasi lebih lanjut, lihat sandbox Java.

Dapatkah reduce.setup membaca data dari tabel input?

Anda dapat membaca dari tabel cache, tetapi tidak dari tabel input.

Apakah Mapper mendukung input multi-partisi dari tabel yang sama?

Mapper mendukung input dari beberapa partisi dalam satu tabel. Setiap partisi dapat diperlakukan sebagai tabel independen.

Dapatkah Mapper langsung membaca informasi field partisi dari Record?

Mapper tidak dapat mengambil informasi field partisi dari Record. Namun, Anda dapat menggunakan kode berikut. PartitionSpec menyediakan informasi partisi.

PartitionSpec ps = context.getInputTableInfo().getPartitionSpec();
String area = ps.get(“area”);        

Apa hubungan antara label dan partisi?

Label adalah tag yang diterapkan pada output yang berbeda dan membantu mengidentifikasi sumber output.

Dapatkah pekerjaan MapReduce hanya berisi fungsi Map?

Ya, bisa. MapReduce mendukung pekerjaan Map-Only. Untuk pekerjaan Map-Only, Anda harus secara eksplisit mengatur jumlah Reducer menjadi 0 menggunakan job.setNumReduceTasks(0).

Dapatkah setiap record dari tabel input di Mapper dibaca berdasarkan nama kolom?

Ya, bisa. Anda dapat membaca setiap record dari tabel input berdasarkan nomor ordinalnya, seperti record.get(i), atau berdasarkan nama kolomnya, seperti record.get("size").

Apa perbedaan antara write(Record key, Record value) dan write(Record record)?

  • write(Record key, Record value): Menghasilkan output berupa hasil antara, seperti key.set("id", v1),value.set("size", v2). Hasil antara yang dihasilkan oleh fungsi Map dikirim ke fungsi Reduce melalui jaringan. Karena tidak ada tabel yang terkait untuk inferensi tipe, Anda harus mendeklarasikan tipe field untuk serialisasi. Tipe field output adalah tipe data MaxCompute.

    job.setMapOutputKeySchema(SchemaUtils.fromString(“id:string”));  
    job.setMapOutputValueSchema(SchemaUtils.fromString(“size:bigint”));               
  • write(Record record): Menghasilkan output ke tabel sink. Karena tabel terkait tersedia untuk inferensi tipe, Anda tidak perlu mendeklarasikan tipe field.

Di MaxCompute MapReduce, mengapa saya perlu menentukan dua JAR: Libjars dan Classpath?

Klien lokal melakukan konfigurasi pekerjaan dan operasi lain yang melibatkan eksekusi jarak jauh. Oleh karena itu, pelaksana (executor) berjalan di klien lokal dan pelaksana lain berjalan di server jarak jauh.

Pelaksana jarak jauh memuat Classpath jarak jauh, yaitu -libjars mapreduce-examples.jar. Pelaksana lokal memuat Classpath lokal, sehingga Anda juga harus menentukan -classpath lib/mapreduce-examples.jar.

Dapatkah saya langsung menggunakan kode sumber Hadoop MapReduce di MaxCompute MapReduce?

Tidak, Anda tidak dapat melakukannya. API MaxCompute MapReduce berbeda dari API Hadoop MapReduce, tetapi gaya pemrogramannya serupa. Anda harus memodifikasi kode sumber Hadoop dan mengompilasinya dengan kit pengembangan perangkat lunak (SDK) MaxCompute MapReduce sebelum dapat menjalankan kode tersebut di MaxCompute.

Bagaimana cara menerapkan sorting di MapReduce?

Anda dapat menggunakan kode berikut untuk sorting.

// Tetapkan kolom pengurutan. Di sini, data diurutkan berdasarkan field i1 dan i2.
job.setOutputKeySortColumns(new String[] { "i1", "i2" });
// Tetapkan urutan pengurutan untuk kolom-kolom tersebut. Di sini, i1 diurutkan secara ascending dan i2 secara descending.
job.setOutputKeySortOrder(new SortOrder[] { SortOrder.ASC, SortOrder.DESC });        

Berikut ini cara menggunakan metode setOutputKeySortOrder.

public void setOutputKeySortOrder(JobConf.SortOrder[] order)
Fungsi: Menetapkan urutan pengurutan kolom kunci.
Parameter: Order menentukan urutan pengurutan kolom. Nilai yang valid: ASC (ascending) dan DESC (descending).       

Apa itu Backups di MapReduce?

Backups adalah fitur penyetelan performa. MaxCompute memantau tugas Anda. Jika suatu tugas memiliki beban kerja yang berat, MaxCompute akan memulai pekerjaan cadangan untuk tugas tersebut. Kedua pekerjaan memproses data yang sama, dan hasil dari pekerjaan yang selesai lebih dulu yang digunakan. Fitur ini disebut Backups. Namun, jika tugas tersebut sangat besar, Backups mungkin tidak efektif karena baik tugas asli maupun pekerjaan cadangan tidak dapat diselesaikan.

Saat mengembangkan pekerjaan MapReduce, bagaimana cara mengirimkan beberapa resource melalui command line?

Anda dapat memisahkan resource dengan koma (,), misalnya, jar -resource resource1,resource2,...

Bagaimana cara menentukan apakah sebuah tabel kosong di metode main?

Anda dapat menggunakan kode berikut untuk menentukan apakah sebuah tabel kosong.

Odps odps=SessionState.get().getOdps();
Table table=odps.tables().get('tableName');
RecordReader recordReader=table.read(1);
if(recordReader.read()==null){
//TO DO      

Di MaxCompute MapReduce, bagaimana cara mengatur kode Java untuk pencetakan log?

Anda dapat menggunakan salah satu metode berikut:

  • Gunakan System.out.println dalam kode Anda untuk mencetak log. Log tersebut akan ditampilkan di stdout di Logview.

  • Saat terjadi exception, klien akan mengembalikan pesan exception. Anda tidak perlu mencetak informasi log.

  • Gunakan logging umum. Log tersebut akan ditampilkan di stderr, yang dapat Anda lihat di Logview.

Apakah tabel sink akan menyimpan data duplikat setelah dua komputasi MapReduce?

Ya, akan. Saat Anda mengkueri data tersebut, Anda akan mendapatkan dua record identik.

Di Hadoop, saya dapat memilih beberapa node untuk pemrosesan terdistribusi. Bagaimana cara mengatur node untuk pemrosesan terdistribusi di MaxCompute MapReduce?

Anda tidak perlu membangun dan mengalokasikan node sendiri. Ini merupakan salah satu keunggulan MaxCompute.

Saat Anda menjalankan pekerjaan MapReduce, sistem dasar MaxCompute menentukan partisi data yang akan digunakan berdasarkan algoritmanya.

Output normal tanpa Combiner, tetapi fungsi Reduce tidak menerima input saat Combiner digunakan. Mengapa?

Masalah ini terjadi karena record tunggal yang dihasilkan oleh fungsi Reduce tidak konsisten dengan pasangan kunci-nilai yang dihasilkan oleh fungsi Map.

Pada pekerjaan MapOnly, mengapa program tidak menentukan format skema tabel output?

Skema tabel output harus dibuat terlebih dahulu dan ditentukan saat Anda menjalankan pernyataan create table. Program MapOnly tidak perlu menentukan skema dan dapat langsung menghasilkan data.

Bagaimana cara memanggil server MaxCompute secara lokal untuk menjalankan pekerjaan MapReduce?

Umumnya, Anda dapat menjalankan paket JAR MaxCompute dengan mengeksekusi perintah jar di antarmuka baris perintah. Untuk informasi lebih lanjut, lihat Kirim pekerjaan MapReduce.

Anda juga dapat mengintegrasikan paket tersebut ke dalam proyek Anda dalam mode analog. Prosedurnya sebagai berikut:

  1. Tetapkan dependensi paket.

    Selain SDK dasar, diperlukan paket dependensi lainnya. Anda dapat menemukannya di folder lib tool klien. Folder lib juga berisi paket JAR SDK. Kami menyarankan agar Anda mengimpor semua paket JAR dari folder lib tool klien versi terbaru.

  2. Unggah paket JAR.

    Kemas program MapReduce yang telah lulus pengujian lokal ke dalam file JAR dan unggah. Misalnya, asumsikan file JAR tersebut bernama mr.jar. Untuk informasi lebih lanjut, lihat Operasi resource.

  3. Tetapkan mode eksekusi.

    Konfigurasikan JobConf. Berikut contoh konfigurasinya.

    // Konfigurasikan informasi koneksi MaxCompute.
    Account account = new AliyunAccount(accessid, accesskey);
    Odps odps = new Odps(account);
    odps.setEndpoint(endpoint);
    odps.setDefaultProject(project);
    // Dapatkan sesi.
    SessionState ss = SessionState.get();
    ss.setOdps(odps);
    ss.setLocalRun(false);  // Atur nilai menjadi false untuk menjalankan pekerjaan di server. Untuk debugging lokal, atur nilai menjadi true.
    // Kode untuk mengatur jobconf.
    Job job = new Job();
    String resource = “mr.jar”;
    job.setResources(resource); // Langkah ini mirip dengan perintah 'jar -resources mr.jar'.
    // Kode berikut mengikuti aturan standar MapReduce.
    job.setMapperClass(XXXMapper.class);
    job.setReducerClass(XXXReducer.class);                            

    Setelah konfigurasi selesai, Anda dapat langsung menjalankan pekerjaan MapReduce.

Bagaimana cara mengatasi galat BufferOverflowException yang terjadi saat menjalankan pekerjaan MaxCompute MapReduce?

  • Gejala:

    Saat menjalankan pekerjaan MaxCompute MapReduce, galat berikut dikembalikan.

    FAILED: ODPS-0123131:User defined function exception - Traceback:
         java.nio.BufferOverflowException
         at java.nio.DirectByteBuffer.put(Unknown Source)
         at com.aliyun.odps.udf.impl.batch.TextBinary.put(TextBinary.java:35)   
  • Penyebab:

    Jumlah data yang ditulis sekaligus terlalu besar, menyebabkan luapan buffer.

  • Solusi:

    Batas berikut berlaku untuk tipe data yang dapat ditulis ke satu field di MaxCompute.

    String      8 MB
    Bigint      -9223372036854775807 hingga 9223372036854775807
    Boolean     True/False
    Double      -1.0 10308 hingga 1.0 10308
    Date        0001-01-01 00:00:00 hingga 9999-12-31 23:59:59                  

Bagaimana cara mengatasi galat "Resource not found" yang terjadi saat menjalankan pekerjaan MaxCompute MapReduce?

Saat mengirimkan pekerjaan, gunakan parameter -resources untuk menentukan resource yang diperlukan. Anda dapat memisahkan beberapa resource dengan koma (,).

Bagaimana cara mengatasi galat "Class Not Found" yang terjadi saat menjalankan pekerjaan MaxCompute MapReduce?

Galat ini terjadi dalam dua situasi berikut saat menjalankan pekerjaan MapReduce:

  • Nama kelas untuk parameter classpath salah. Anda harus menentukan nama paket lengkap.

  • Terjadi galat saat pengemasan JAR. Pastikan Anda memilih seluruh kode sumber di direktori SRC saat pengemasan.

Bagaimana cara mengatasi galat ODPS-0010000 yang terjadi saat menjalankan pekerjaan MaxCompute MapReduce?

  • Gejala:

    Saat menjalankan pekerjaan MaxCompute MapReduce, galat berikut dikembalikan.

    ODPS-0010000: System internal error - get input pangu dir meta fail.
  • Penyebab:

    Galat ini terjadi karena Anda mencoba menggunakan partisi sebelum partisi tersebut dibuat atau sebelum datanya siap.

  • Solusi:

    Anda harus membuat partisi sebelum menjalankan pekerjaan MapReduce.

Bagaimana cara mengatasi galat "Table not found" yang terjadi saat menjalankan pekerjaan MaxCompute MapReduce?

  • Gejala:

    Saat menjalankan pekerjaan MaxCompute MapReduce, galat berikut dikembalikan.

    Exception in thread "main" com.aliyun.odps.OdpsException: Table not found: project_name.table_name.
  • Penyebab:

    Proyek tujuan salah atau tabel tujuan tidak ada.

  • Solusi:

    Table Info Builder dari antarmuka MapReduce memerlukan ProjectName dan TableName. Tetapkan kedua parameter ini ke nama proyek dan nama tabel yang benar.

Bagaimana cara mengatasi galat ODPS-0123144 yang terjadi saat menjalankan pekerjaan MaxCompute MapReduce?

  • Gejala:

    Saat menjalankan pekerjaan MaxCompute MapReduce, galat berikut dikembalikan.

    FAILED: ODPS-0123144: Fuxi job failed - WorkerRestar
  • Penyebab:

    Galat ini terjadi karena node sekunder di kluster mengalami timeout selama komputasi. Node primer kemudian menganggap node sekunder mengalami kegagalan dan melaporkan galat. Periode timeout adalah 10 menit dan tidak dapat dikonfigurasi oleh pengguna.

  • Solusi:

    Penyebab umum galat ini adalah loop besar di fungsi Reduce, yang dapat disebabkan oleh data long-tail atau Produk Kartesius. Anda dapat mencoba meminimalkan loop besar semacam itu.

Bagaimana cara mengatasi galat java.security.AccessControlException yang terjadi saat menjalankan pekerjaan MaxCompute MapReduce?

  • Gejala:

    Saat menjalankan pekerjaan MaxCompute MapReduce, galat berikut dikembalikan.

    FAILED: ODPS-0123131:User defined function exception - Traceback:
    java.lang.ExceptionInInitializerError
     ...
    Caused by: java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "getProtectionDomain")
      at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472)       
  • Penyebab:

    Galat ini terjadi karena kode Anda melanggar batasan sandbox. Untuk informasi lebih lanjut, lihat sandbox Java.

  • Solusi:

    Untuk mengatasi galat ini, Anda perlu mengakses resource eksternal. Namun, MaxCompute saat ini tidak mendukung operasi ini. Anda harus menyimpan logika pemrosesan eksternal dan data terkait di MaxCompute agar dapat mengaksesnya. Untuk membaca file konfigurasi, lihat Gunakan file resource.

Bagaimana cara mengatasi galat java.io.IOException yang terjadi saat menjalankan pekerjaan MaxCompute MapReduce?

  • Gejala:

    Saat menjalankan pekerjaan MaxCompute MapReduce, galat berikut dikembalikan.

    Exception in thread “main“ java.io.IOException: ODPS-0740001: Too many local-run maps: 101, must be <= 100(specified by local-run parameter ‘odps.mapred.local.map.max.tasks‘)     
  • Penyebab:

    Nilai default local-run maps adalah 100, yang perlu disesuaikan.

  • Solusi:

    Anda dapat menambahkan konfigurasi -Dodps.mapred.local.map.max.tasks=200.

Bagaimana cara mengatasi galat "Exceed maximum read times" yang terjadi saat menjalankan pekerjaan MaxCompute MapReduce?

  • Gejala:

    Saat menjalankan pekerjaan MaxCompute MapReduce, galat berikut dikembalikan.

    ODPS-0730001: Exceed maximum read times per resource       
  • Penyebab:

    File resource telah dibaca terlalu banyak kali.

  • Solusi:

    Periksa logika kode untuk membaca resource. Biasanya, resource harus dibaca hanya sekali di fase setup. Jangan membaca resource berulang kali di fase Map atau Reduce.

Terjadi galat out of memory sebelum fungsi Reduce dimulai. Bagaimana cara mengatasi masalah ini?

  • Penyebab:

    Beberapa data terlalu besar dan menyebabkan overflow saat dimuat ke memori.

  • Solusi:

    Anda dapat menghapus Combiner atau membatasi ukuran di Combiner menggunakan set odps.mapred.map.min.split.size=512;.

Bagaimana cara mengatasi galat out of memory yang terjadi saat menjalankan pekerjaan MaxCompute MapReduce?

Galat out of memory biasanya disebabkan oleh memori yang tidak mencukupi. Anda dapat mengatasi masalah ini dengan menyesuaikan parameter memori JVM, seperti odps.stage.mapper.jvm.mem dan odps.stage.reducer.jvm.mem. Misalnya, Anda dapat menjalankan perintah set odps.stage.mapper.jvm.mem = 2048 untuk mengatur memori menjadi 2 GB.

Saat menjalankan pekerjaan MaxCompute MapReduce, 600 Reducer dimulai untuk memuat file konfigurasi kecil, tetapi terjadi galat java.lang.OutOfMemoryError. Bagaimana cara mengatasinya?

  • Gejala:

    Saat menjalankan pekerjaan MaxCompute MapReduce, galat berikut dikembalikan.

    java.lang.OutOfMemoryError: Java heap space
  • Penyebab:

    Masalah ini disebabkan oleh batasan penggunaan MapReduce. Untuk informasi lebih lanjut, lihat Batasan.

  • Solusi:

    Konfigurasikan pengaturan seperti yang dijelaskan di Ikhtisar Native SDK.

Bagaimana cara mengatasi galat ODPS-0420095 yang terjadi saat menjalankan pekerjaan MaxCompute MapReduce?

  • Gejala:

    Saat menjalankan pekerjaan MaxCompute MapReduce, galat berikut dikembalikan.

    Exception in thread "main" java.io.IOException: com.aliyun.odps.OdpsException: ODPS-0420095: Access Denied - The task is not in release range: LOT
  • Penyebab:

    Proyek menggunakan resource Edisi Pengembang MaxCompute. Edisi ini hanya mendukung MaxCompute SQL (termasuk UDF) dan pekerjaan PyODPS. Edisi ini tidak mendukung tugas lain seperti MapReduce atau Spark.

  • Solusi:

    Untuk meningkatkan spesifikasi proyek, lihat Beralih antar metode penagihan.

Terjadi galat "Too many open files" saat menggunakan resource di MapReduce. Bagaimana cara mengatasinya?

  • Gejala:

    Saat menggunakan resource di MapReduce, galat berikut dikembalikan.

     Caused by: com.aliyun.odps.OdpsException: java.io.FileNotFoundException: temp/mr_XXXXXX/resource/meta.user.group.config (Too many open files)
  • Penyebab:

    Satu pekerjaan tidak dapat mereferensikan lebih dari 256 resource. Jika tidak, galat akan terjadi. Resource tabel dan resource Archive masing-masing dihitung sebagai satu unit. Untuk informasi lebih lanjut mengenai batasan, lihat Batasan.

  • Solusi:

    Anda harus menyesuaikan jumlah resource yang direferensikan.

Saya menggunakan kelas pihak ketiga dalam program MapReduce dan mengemas file Assembly JAR. Terjadi galat "class not found" saat runtime. Bagaimana cara mengatasinya?

Saat pekerjaan MaxCompute MapReduce berjalan di lingkungan terdistribusi, pekerjaan tersebut tunduk pada batasan sandbox Java. Program utama pekerjaan MapReduce tidak tunduk pada batasan ini. Untuk informasi lebih lanjut mengenai batasan tersebut, lihat sandbox Java.

Jika Anda hanya perlu memproses JSON, gunakan Gson secara langsung. Anda tidak perlu mengemas kelas Gson. Komponen open source Java menyediakan banyak metode untuk mengonversi string ke tanggal, seperti SimpleDateFormat.

Terjadi galat "index out of bounds" saat menjalankan pekerjaan MapReduce yang kompatibel dengan open source di MaxCompute. Bagaimana cara mengatasinya?

Kami menyarankan agar Anda menggunakan antarmuka MaxCompute MapReduce untuk menulis kode Anda. Kami juga menyarankan agar Anda menggunakan Spark alih-alih MapReduce kecuali benar-benar diperlukan.