全部产品
Search
文档中心

MaxCompute:FAQ tentang MaxCompute MapReduce

更新时间:Jun 19, 2025

Topik ini menjawab beberapa pertanyaan umum terkait MaxCompute MapReduce.

KategoriFAQ
Fitur
Pengembangan program MapReduce
Kesalahan umum

Bisakah saya menggunakan tampilan sebagai sumber input pekerjaan MapReduce di MaxCompute?

Tidak, Anda hanya dapat menggunakan tabel sebagai sumber input pekerjaan MapReduce di MaxCompute.

Dalam mode apa hasil pekerjaan MapReduce ditulis ke tabel atau partisi?

Hasil pekerjaan MapReduce ditulis ke tabel atau partisi dalam mode penimpaan.

Bisakah saya menjalankan pekerjaan MapReduce dengan memanggil file shell?

Tidak, Anda tidak dapat menjalankan pekerjaan MapReduce dengan memanggil file shell karena batasan sandbox Java. Untuk informasi lebih lanjut tentang batasan sandbox Java, lihat Java sandbox.

Bisakah saya memanggil metode setup reducer untuk membaca data dari tabel input?

Tidak, Anda tidak dapat memanggil metode setup reducer untuk membaca data dari tabel input. Namun, Anda dapat memanggil metode setup reducer untuk membaca data dari tabel yang di-cache.

Apakah mapper mendukung data dari beberapa partisi tabel sebagai input?

Ya, mapper mendukung data dari beberapa partisi tabel sebagai input. Partisi tabel yang sama dianggap sebagai tabel terpisah.

Bisakah mapper membaca bidang partisi dari catatan data?

Mapper tidak dapat membaca bidang partisi dari catatan data. Anda dapat menggunakan kode berikut untuk mendapatkan bidang partisi. Dalam kode tersebut, PartitionSpec menentukan informasi partisi.
PartitionSpec ps = context.getInputTableInfo().getPartitionSpec();
String area = ps.get("area");        

Apa hubungan antara label dan partisi?

Label digunakan untuk mengidentifikasi partisi tempat data keluaran ditulis.

Apakah MaxCompute MapReduce mendukung pekerjaan map-only?

Ya, MaxCompute MapReduce mendukung pekerjaan map-only. Jika Anda ingin menjalankan pekerjaan map-only di MaxCompute MapReduce, Anda harus menyetel jumlah reducer menjadi 0 dengan menggunakan job.setNumReduceTasks(0).

Bisakah saya menggunakan mapper untuk membaca setiap catatan dari tabel input berdasarkan nama kolom?

Ya, Anda dapat menggunakan mapper untuk membaca setiap catatan dari tabel input berdasarkan nama kolom. Setiap catatan dalam tabel input dapat dibaca berdasarkan nomor urutan, seperti record.get(i), atau berdasarkan nama kolom, seperti record.get("size").

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

  • write(Record key, Record value) digunakan untuk menghasilkan hasil perantara, seperti key.set("id", v1), value.set("size", v2). Hasil perantara yang dihasilkan oleh mapper harus dikirim ke reducer melalui koneksi jaringan. Tidak ada tabel terkait yang disediakan untuk inferensi tipe data bidang. Oleh karena itu, tipe data bidang harus dinyatakan untuk serialisasi. Tipe data bidang harus merupakan tipe data yang didukung oleh MaxCompute.
    job.setMapOutputKeySchema(SchemaUtils.fromString("id:string"));  
    job.setMapOutputValueSchema(SchemaUtils.fromString("size:bigint"));               
  • write(Record record) digunakan untuk menulis hasil akhir ke tabel output. Tabel terkait disediakan untuk inferensi tipe data bidang. Oleh karena itu, tipe data bidang tidak perlu dinyatakan.

Mengapa saya perlu menggunakan parameter -libjars dan -classpath untuk menentukan paket JAR program MapReduce di MaxCompute MapReduce?

Klien lokal melakukan operasi yang melibatkan eksekusi jarak jauh, seperti konfigurasi pekerjaan. Oleh karena itu, dua executor digunakan: executor lokal dan executor jarak jauh.

Executor jarak jauh memuat paket yang ditentukan oleh parameter -libjars, seperti -libjars mapreduce-examples.jar. Executor lokal memuat paket yang ditentukan oleh parameter -classpath, seperti -classpath lib/mapreduce-examples.jar.

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

Tidak, Anda tidak dapat langsung menggunakan kode sumber Hadoop MapReduce di MaxCompute MapReduce. API yang disediakan oleh MaxCompute MapReduce berbeda dari API yang disediakan oleh Hadoop MapReduce, tetapi gaya keseluruhannya serupa. Jika Anda ingin menjalankan kode sumber Hadoop MapReduce di MaxCompute MapReduce, Anda harus memodifikasi kode sumber Hadoop MapReduce dan mengompilasi kode menggunakan SDK MaxCompute MapReduce.

Bagaimana cara menggunakan MaxCompute MapReduce untuk mengurutkan data?

Kode sampel berikut menunjukkan cara mengurutkan data menggunakan MaxCompute MapReduce.
// Tentukan bidang yang nilainya ingin Anda urutkan. Dalam contoh ini, bidangnya adalah i1 dan i2. 
job.setOutputKeySortColumns(new String[] { "i1", "i2" });
// Tentukan cara mengurutkan nilai kedua bidang. Dalam contoh ini, nilai bidang i1 diurutkan secara menaik, dan nilai bidang i2 diurutkan secara menurun. 
job.setOutputKeySortOrder(new SortOrder[] { SortOrder.ASC, SortOrder.DESC });        
Kode sampel berikut menunjukkan cara menggunakan metode setOutputKeySortOrder.
public void setOutputKeySortOrder(JobConf.SortOrder[] order)
Deskripsi: Metode setOutputKeySortOrder digunakan untuk menentukan urutan pengurutan nilai kolom kunci. 
Parameter: Parameter order menentukan urutan pengurutan nilai kolom kunci. Nilai valid: ASC dan DESC. ASC menunjukkan urutan menaik, dan DESC menunjukkan urutan menurun.        

Apa tujuan dari pencadangan untuk pekerjaan MapReduce?

Pencadangan digunakan untuk mempercepat pemrosesan data untuk pekerjaan MapReduce. MaxCompute mendeteksi status pekerjaan MapReduce Anda. Jika pekerjaan MapReduce perlu memproses sejumlah besar data, MaxCompute membuat pekerjaan cadangan untuk pekerjaan tersebut. Kedua pekerjaan tersebut dijalankan secara paralel untuk memproses data yang sama. Hasil pekerjaan yang pertama selesai digunakan. Jika pekerjaan perlu memproses jumlah data yang sangat besar, pencadangan mungkin tidak bekerja sesuai harapan karena pekerjaan asli dan pekerjaan cadangannya mungkin tidak selesai dalam periode waktu tertentu.

Bagaimana cara meneruskan beberapa sumber daya pada klien MaxCompute saat saya mengembangkan program MapReduce?

Anda dapat memisahkan beberapa sumber daya dengan koma (,), seperti jar -resource resource1,resource2,...

Bagaimana cara menggunakan metode utama untuk menentukan apakah sebuah tabel adalah tabel kosong?

Anda dapat menggunakan kode berikut untuk menentukan apakah sebuah tabel adalah tabel kosong.
Odps odps=SessionState.get().getOdps();
Table table=odps.tables().get('tableName');
RecordReader recordReader=table.read(1);
if(recordReader.read()==null){
//TO DO      

Bagaimana cara menghasilkan log pekerjaan MapReduce di MaxCompute?

Kami merekomendasikan agar Anda menggunakan salah satu metode berikut untuk menghasilkan log pekerjaan MapReduce di MaxCompute:
  • Gunakan System.out.println dalam kode untuk menghasilkan log pekerjaan MapReduce di MaxCompute. Log diekspor ke stdout Logview.
  • Jika terjadi kesalahan saat Anda menjalankan pekerjaan MapReduce, klien MaxCompute mengembalikan informasi kesalahan. Anda dapat melihat informasi kesalahan tanpa perlu menghasilkan log.
  • Jika Anda menggunakan logging umum, log diekspor ke stderr Logview. Anda dapat melihat log di stderr.

Apakah tabel hasil berisi data duplikat dari dua pekerjaan MapReduce?

Ya, tabel hasil berisi data duplikat dari dua pekerjaan MapReduce. Saat Anda mengambil data dari tabel hasil, dua catatan duplikat diperoleh.

Di Hadoop MapReduce, saya dapat memilih beberapa node untuk pemrosesan data terdistribusi. Satu node mewakili satu mesin. Bagaimana cara mengonfigurasi node saat saya melakukan pemrosesan data terdistribusi di MaxCompute MapReduce?

Dibandingkan dengan Hadoop MapReduce, Anda tidak perlu mengonfigurasi node di MaxCompute MapReduce.

Saat Anda menjalankan pekerjaan MapReduce di MaxCompute, komponen MaxCompute yang mendasarinya menentukan shard mana yang digunakan berdasarkan algoritma.

Jika saya tidak menggunakan combiner, keluaran data normal. Setelah saya menggunakan combiner, tidak ada data masukan yang diberikan untuk reducer. Mengapa?

Masalah ini terjadi karena setiap catatan yang dihasilkan oleh reducer tidak dapat dipetakan ke pasangan kunci-nilai yang dihasilkan oleh mapper.

Saya tidak dapat menentukan skema tabel output saat saya menjalankan pekerjaan map-only di MaxCompute. Mengapa?

Anda harus menentukan skema tabel output dalam pernyataan CREATE TABLE saat Anda membuat tabel. Oleh karena itu, saat Anda menjalankan pekerjaan map-only di MaxCompute, data langsung ditulis ke tabel output tanpa memerlukan Anda untuk menentukan skema tabel.

Bagaimana cara memanggil server MaxCompute lokal untuk menjalankan pekerjaan MapReduce?

Dalam kebanyakan kasus, Anda harus menjalankan perintah jar pada klien MaxCompute untuk menjalankan pekerjaan MapReduce. Untuk informasi lebih lanjut tentang sintaks perintah jar, lihat Kirim pekerjaan MapReduce.

Anda dapat melakukan langkah-langkah berikut untuk menjalankan pekerjaan MapReduce program MapReduce simulasi dengan memanggil server MaxCompute lokal.
  1. Konfigurasikan dependensi paket.

    Paket dependensi diperlukan selain paket SDK. Anda dapat menemukan paket dependensi di folder lib pada klien MaxCompute. Folder lib juga berisi paket JAR SDK. Saat Anda mengimpor paket JAR, kami merekomendasikan agar Anda mengimpor semua paket JAR di folder lib klien MaxCompute versi terbaru.

  2. Unggah paket JAR program MapReduce.

    Kemas program MapReduce yang melewati pengujian lokal ke dalam file JAR dan unggah paket tersebut. Dalam contoh ini, paket JAR bernama mr.jar. Untuk informasi lebih lanjut tentang cara mengunggah sumber daya, lihat Operasi sumber daya.

  3. Tentukan mode jalannya.
    Konfigurasikan JobConf. Kode sampel berikut menunjukkan cara mengonfigurasi JobConf.
    //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);  //Set LocalRun ke false. Nilai ini menunjukkan bahwa pekerjaan MapReduce berjalan di server. Jika debugging lokal diperlukan, set LocalRun ke true. 
    //Kode yang mencakup konfigurasi JobConf 
    Job job = new Job();
    String resource = "mr.jar";
    job.setResources(resource); **Langkah ini mirip dengan jar -resources mr.jar. 
    //Kode MapReduce umum 
    job.setMapperClass(XXXMapper.class);
    job.setReducerClass(XXXReducer.class);                            

    Setelah Anda mengonfigurasi JobConf, Anda dapat menjalankan pekerjaan MapReduce.

Apa yang harus saya lakukan jika pesan kesalahan "BufferOverflowException" muncul saat saya menjalankan pekerjaan MapReduce di MaxCompute?

  • Deskripsi masalah

    Saat pekerjaan MapReduce dijalankan di MaxCompute, pesan kesalahan berikut muncul:

    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

    Sejumlah besar data ditulis sekaligus. Akibatnya, terjadi luapan buffer.

  • Solusi

    Pastikan data yang ditulis di MaxCompute memenuhi batas berikut pada tipe data untuk satu bidang:

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

Apa yang harus saya lakukan jika pesan kesalahan "Resource not found" muncul saat saya menjalankan pekerjaan MapReduce di MaxCompute?

Saat Anda mengirimkan pekerjaan MapReduce, Anda harus mengonfigurasi parameter -resources untuk menentukan sumber daya yang diperlukan. Pisahkan beberapa sumber daya dengan koma (,).

Apa yang harus saya lakukan jika pesan kesalahan "Class Not Found" muncul saat saya menjalankan pekerjaan MapReduce di MaxCompute?

Saat MaxCompute MapReduce dijalankan, pesan kesalahan "Class Not Found" muncul karena salah satu penyebab berikut:
  • Nilai parameter -classpath tidak valid. Nama paket lengkap harus ditentukan dalam parameter -classpath.
  • Kode sumber yang tidak lengkap di folder src dikemas ke dalam file JAR.

Apa yang harus saya lakukan jika kesalahan ODPS-0010000 dikembalikan saat saya menjalankan pekerjaan MapReduce di MaxCompute?

  • Deskripsi masalah

    Saat pekerjaan MapReduce dijalankan di MaxCompute, pesan kesalahan berikut muncul:

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

    Partisi belum dibuat atau belum ada data yang dimasukkan ke partisi.

  • Solusi

    Buat partisi sebelum Anda menjalankan pekerjaan MapReduce.

Apa yang harus saya lakukan jika pesan kesalahan "Table not found" muncul saat saya menjalankan pekerjaan MapReduce di MaxCompute?

  • Deskripsi masalah

    Saat pekerjaan MapReduce dijalankan di MaxCompute, pesan kesalahan berikut muncul:

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

    Nama proyek tempat tabel keluaran disimpan tidak valid atau tabel keluaran tidak ada.

  • Solusi

    TableInfo.Builder dari MaxCompute MapReduce menyediakan dua parameter: ProjectName dan TableName. Anda dapat mengonfigurasi kedua parameter tersebut untuk menentukan nama proyek tempat tabel keluaran disimpan dan nama tabel keluaran.

Apa yang harus saya lakukan jika kesalahan ODPS-0123144 dikembalikan saat saya menjalankan pekerjaan MapReduce di MaxCompute?

  • Deskripsi masalah

    Saat pekerjaan MapReduce dijalankan di MaxCompute, pesan kesalahan berikut muncul:

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

    Penghitungan data pada node sekunder kluster habis waktu. Akibatnya, node utama menganggap bahwa node sekunder bermasalah. Periode timeout tetap selama 10 menit dan tidak dapat diubah.

  • Solusi

    Dalam kebanyakan kasus, masalah ini disebabkan oleh loop besar pada tahap Reduce. Misalnya, jika data ekor panjang atau Produk Kartesius dihasilkan, maka loop besar ada. Untuk mengatasi masalah ini, Anda harus mencegah loop besar.

Apa yang harus saya lakukan jika pesan kesalahan "java.security.AccessControlException" muncul saat saya menjalankan pekerjaan MapReduce di MaxCompute?

  • Deskripsi masalah

    Saat pekerjaan MapReduce dijalankan di MaxCompute, pesan kesalahan berikut muncul:

    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

    Kode Anda melanggar batasan sandbox. Untuk informasi lebih lanjut tentang batasan sandbox, lihat Java sandbox.

  • Solusi

    Anda harus mengakses sumber daya eksternal untuk mengatasi masalah ini. Namun, MaxCompute tidak mengizinkan Anda mengakses sumber daya eksternal. Untuk mengakses sumber daya eksternal, Anda harus menyimpan logika pemrosesan dan data sumber daya eksternal di MaxCompute. Dalam hal ini, Anda harus membaca file konfigurasi tertentu. Untuk informasi lebih lanjut, lihat Contoh penggunaan sumber daya.

Apa yang harus saya lakukan jika pesan kesalahan "java.io.IOException" muncul saat saya menjalankan pekerjaan MapReduce di MaxCompute?

  • Deskripsi masalah

    Saat pekerjaan MapReduce dijalankan di MaxCompute, pesan kesalahan berikut muncul:

    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 dan perlu disesuaikan.

  • Solusi

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

Apa yang harus saya lakukan jika pesan kesalahan "Exceed maximum read times per resource" muncul saat saya menjalankan pekerjaan MapReduce di MaxCompute?

  • Deskripsi masalah

    Saat pekerjaan MapReduce dijalankan di MaxCompute, pesan kesalahan berikut muncul:

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

    Jumlah kali file sumber daya dibaca terlalu besar.

  • Solusi

    Periksa logika kode yang menunjukkan cara sumber daya dibaca. Dalam kebanyakan kasus, sumber daya hanya dibaca sekali saat metode setup dipanggil. Modifikasi kode untuk memastikan bahwa sumber daya tidak dibaca beberapa kali pada tahap Map atau Reduce.

Apa yang harus saya lakukan jika kesalahan OOM terjadi sebelum tahap Reduce saat saya menjalankan pekerjaan MapReduce di MaxCompute?

  • Penyebab

    Sejumlah besar data diunduh ke memori.

  • Solusi

    Jangan gunakan combiner atau setel odps.mapred.map.min.split.size menjadi 512 untuk combiner yang Anda gunakan.

Apa yang harus saya lakukan jika kesalahan OOM terjadi saat saya menjalankan pekerjaan MapReduce di MaxCompute?

Masalah ini terjadi karena memori tidak mencukupi. Untuk mengatasi masalah ini, Anda dapat menyesuaikan nilai parameter berikut dari Java Virtual Machine (JVM): odps.stage.mapper.jvm.mem and odps.stage.reducer.jvm.mem. Sebagai contoh, Anda dapat menyetel odps.stage.mapper.jvm.mem menjadi 2048, yang menunjukkan 2 GB.

Apa yang harus saya lakukan jika pesan kesalahan "java.lang.OutOfMemoryError" muncul saat saya menggunakan 600 reducer untuk memuat file konfigurasi kecil untuk pekerjaan MapReduce di MaxCompute?

  • Deskripsi masalah

    Saat pekerjaan MapReduce dijalankan di MaxCompute, pesan kesalahan berikut muncul:

    java.lang.OutOfMemoryError: Java heap space
  • Penyebab

    Masalah ini terjadi karena batasan MaxCompute MapReduce. Untuk informasi lebih lanjut, lihat Batasan.

  • Solusi

    Konfigurasikan parameter terkait memori. Untuk informasi lebih lanjut, lihat Ikhtisar.

Apa yang harus saya lakukan jika kesalahan ODPS-0420095 dikembalikan saat saya menjalankan pekerjaan MapReduce di MaxCompute?

  • Deskripsi masalah

    Saat pekerjaan MapReduce dijalankan di MaxCompute, pesan kesalahan berikut muncul:

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

    Hanya pekerjaan PyODPS dan pekerjaan SQL MaxCompute yang mendukung fungsi yang ditentukan pengguna (UDF) yang didukung untuk proyek edisi pengembang MaxCompute. Pekerjaan lainnya, seperti pekerjaan MapReduce dan Spark, tidak didukung.

  • Solusi

    Tingkatkan spesifikasi proyek. Untuk informasi lebih lanjut, lihat Beralih antara metode penagihan.

Apa yang harus saya lakukan jika sejumlah besar kesalahan terjadi saat sumber daya MaxCompute dirujuk oleh pekerjaan MapReduce?

  • Deskripsi masalah

    Saat sumber daya MaxCompute dirujuk oleh pekerjaan MapReduce, pesan kesalahan berikut muncul:

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

    Jumlah sumber daya yang dirujuk oleh satu pekerjaan tidak boleh melebihi 256. Jika tidak, kesalahan akan dikembalikan. Setiap tabel atau file arsip dianggap sebagai satu sumber daya. Untuk informasi lebih lanjut tentang batasan jumlah sumber daya yang dirujuk oleh satu pekerjaan, lihat Batasan.

  • Solusi

    Atur ulang jumlah sumber daya yang dirujuk oleh satu pekerjaan.

Saya membuat paket JAR program MapReduce yang berisi kelas pihak ketiga menggunakan Maven Assembly. Saat saya menjalankan pekerjaan MapReduce, muncul pesan kesalahan yang menunjukkan bahwa kelas pihak ketiga tidak ditemukan. Apa yang harus saya lakukan?

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

Jika Anda ingin memproses hanya data JSON, kami merekomendasikan agar Anda menggunakan Gson. Dengan cara ini, Anda tidak perlu menyertakan kelas Gson dalam paket JAR. Komponen Java sumber terbuka menyediakan beberapa kelas yang digunakan untuk mengonversi string menjadi nilai tanggal, seperti SimpleDateFormat.

Saat saya menjalankan pekerjaan Hadoop MapReduce di MaxCompute, terjadi kesalahan indeks di luar batas. Apa yang harus saya lakukan?

Kami merekomendasikan agar Anda menggunakan MaxCompute MapReduce untuk menulis kode pekerjaan. Kami juga merekomendasikan agar Anda menggunakan Spark on MaxCompute alih-alih MaxCompute MapReduce untuk menulis kode pekerjaan.