Tüm Ürünler
Search
Belge Merkezi

MaxCompute:MapReduce SSS

Son Güncelleme:Oct 04, 2026

Bu konu, MapReduce kullanımına ilişkin sıkça sorulan soruları (SSS) açıklar.

Kategori

SSS

Özellik sorgulamaları

MapReduce Geliştirme

Yaygın hatalar

Bir görünüm MapReduce için giriş kaynağı olabilir mi?

Hayır. Giriş kaynağı bir tablo olmalıdır.

MapReduce sonuçları bir tabloya veya bölüme yazdığında verilerin üzerine yazar mı yoksa ekler mi?

Tablo veya bölümdeki mevcut verilerin üzerine yazar.

MapReduce içinde bir kabuk dosyasını çağırabilir miyim?

Hayır, çağıramazsınız. Bu eylem Java sanal alanı tarafından kısıtlanmıştır. Daha fazla bilgi için bkz. Java sandbox.

reduce.setup bir giriş tablosundan veri okuyabilir mi?

Önbellek tablosundan okuyabilirsiniz ancak giriş tablosundan okuyamazsınız.

Bir Mapper aynı tablodan çoklu bölüm girişini destekler mi?

Mapper'lar tek bir tablo içindeki birden fazla bölümden gelen girişi destekler. Her bölüm bağımsız bir tablo olarak değerlendirilebilir.

Bir Mapper bölüm alanı bilgilerini doğrudan bir Record'dan okuyabilir mi?

Bir Mapper bir Record'dan bölüm alanı bilgilerini alamaz. Ancak aşağıdaki kodu kullanabilirsiniz. PartitionSpec bölüm bilgisini sağlar.

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

Etiket ile bölüm arasındaki ilişki nedir?

Etiket, farklı çıktılara uygulanan bir etikettir. Bir çıktının kaynağını tanımlamaya yardımcı olur.

Bir MapReduce işi yalnızca bir Map işlevi içerebilir mi?

Evet, içerebilir. MapReduce Map-Only işlerini destekler. Map-Only bir iş için Reducer sayısını job.setNumReduceTasks(0) kullanarak açıkça 0 olarak ayarlamanız gerekir.

Bir Mapper'daki giriş tablosundaki her kayıt sütun adına göre okunabilir mi?

Evet, okunabilir. Giriş tablosundaki her kaydı ordinal numarasına göre record.get(i) gibi veya sütun adına göre record.get("size") gibi okuyabilirsiniz.

write(Record key, Record value) ve write(Record record) arasındaki fark nedir?

  • write(Record key, Record value): key.set("id", v1),value.set("size", v2) gibi ara sonuçları çıkarır. Map işlevi tarafından oluşturulan ara sonuçlar ağ üzerinden Reduce işlevine gönderilir. Tür çıkarımı için herhangi bir tablo ilişkilendirilmediğinden serileştirme için alan türlerini bildirmeniz gerekir. Çıkış alan türleri MaxCompute veri türleridir.

    job.setMapOutputKeySchema(SchemaUtils.fromString(“id:string”));  
    job.setMapOutputValueSchema(SchemaUtils.fromString(“size:bigint”));               
  • write(Record record): Sonuçları havuz tablosuna çıkarır. Tür çıkarımı için bir tablo ilişkilendirildiğinden alan türlerini bildirmenize gerek yoktur.

MaxCompute MapReduce'te neden Libjars ve Classpath olmak üzere iki JAR belirtmem gerekir?

Yerel istemci iş yapılandırması ve uzak yürütmeyi içeren diğer işlemleri gerçekleştirir. Bu nedenle, yerel istemcide bir yürütücü ve uzak sunucuda başka bir yürütücü çalışır.

Uzak yürütücü, -libjars mapreduce-examples.jar olan uzak Classpath'i yükler. Yerel yürütücü yerel Classpath'i yüklediğinden ayrıca -classpath lib/mapreduce-examples.jar belirtmeniz gerekir.

Hadoop MapReduce kaynak kodunu MaxCompute MapReduce'te doğrudan kullanabilir miyim?

Hayır, kullanamazsınız. MaxCompute MapReduce API'si Hadoop MapReduce API'sinden farklıdır ancak programlama stilleri benzerdir. Kodu MaxCompute üzerinde çalıştırmadan önce Hadoop kaynak kodunu değiştirmeniz ve MaxCompute MapReduce yazılım geliştirme seti (SDK) ile derlemeniz gerekir.

MapReduce'te sıralamayı nasıl uygularım?

Sıralama için aşağıdaki kodu kullanabilirsiniz.

// Set the sort columns. Here, the data is sorted by the i1 and i2 fields.
job.setOutputKeySortColumns(new String[] { "i1", "i2" });
// Set the sort order for the columns. Here, i1 is sorted in ascending order and i2 is sorted in descending order.
job.setOutputKeySortOrder(new SortOrder[] { SortOrder.ASC, SortOrder.DESC });        

Aşağıda setOutputKeySortOrder yönteminin nasıl kullanılacağı gösterilmektedir.

public void setOutputKeySortOrder(JobConf.SortOrder[] order)
Function: Sets the sort order of the key columns.
Parameter: Order specifies the sort order of the columns. Valid values: ASC (ascending) and DESC (descending).       

MapReduce'teki Yedeklemeler nelerdir?

Yedeklemeler bir performans ayarlama özelliğidir. MaxCompute görevlerinizi izler. Bir görevin iş yükü ağır olduğunda MaxCompute bunun için bir yedekleme işi başlatır. İki iş aynı verileri işler ve ilk biten işin sonucu kullanılır. Bu özellik Yedeklemeler olarak adlandırılır. Ancak görev çok büyükse Yedeklemeler etkili olmayabilir çünkü ne orijinal görev ne de yedekleme işi bitebilir.

Bir MapReduce işi geliştirirken komut satırında birden fazla kaynağı nasıl geçiririm?

Kaynakları virgülle (,) ayırabilirsiniz; örneğin jar -resource resource1,resource2,...

Ana yöntemde bir tablonun boş olup olmadığını nasıl belirlerim?

Bir tablonun boş olup olmadığını belirlemek için aşağıdaki kodu kullanabilirsiniz.

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

MaxCompute MapReduce'te günlük yazdırmak için Java kodunu nasıl ayarlarım?

Aşağıdaki yöntemlerden birini kullanabilirsiniz:

  • Günlükleri yazdırmak için kodunuzda System.out.println kullanın. Günlükler Logview'da stdout'a çıkarılır.

  • Bir özel durum oluştuğunda istemci bir özel durum iletisi döndürür. Günlük bilgilerini yazdırmanıza gerek yoktur.

  • Ortak günlüğe kaydetmeyi kullanın. Günlükler stderr'e çıkarılır ve bunu Logview'da görüntüleyebilirsiniz.

İki MapReduce işleminden sonra havuz tablosu yinelenen verileri korur mu?

Evet, korur. Verileri sorguladığınızda iki özdeş kayıt alırsınız.

Hadoop'da dağıtılmış işlem için birden fazla düğüm seçebilirim. MaxCompute MapReduce'te dağıtılmış işlem için düğümleri nasıl ayarlarım?

Düğümleri kendiniz oluşturmanız ve tahsis etmeniz gerekmez. Bu MaxCompute'in avantajlarından biridir.

Bir MapReduce işi çalıştırdığınızda MaxCompute'in temel sistemi algoritmasına göre kullanılacak veri bölümlerini belirler.

Combiner olmadan çıkış normaldir ancak Combiner kullanıldığında Reduce işlevi hiçbir giriş almaz. Neden?

Bu sorun Reduce işlevi tarafından çıkarılan tek kaydın Map işlevi tarafından çıkarılan anahtar-değer çiftiyle tutarsız olmasından kaynaklanır.

MapOnly işinde program neden çıkış tablosunun şema biçimini belirtmez?

Çıkış tablosunun şeması önceden oluşturulmalı ve create table ifadesini çalıştırırken belirtilmelidir. MapOnly programının şemayı belirtmesine gerek yoktur ve verileri doğrudan çıkarabilir.

Bir MapReduce işini çalıştırmak için yerel olarak bir MaxCompute sunucusunu nasıl çağırırım?

Genellikle bir MaxCompute JAR paketini komut satırı arabiriminde jar komutunu yürüterek çalıştırabilirsiniz. Daha fazla bilgi için bkz. Submit a MapReduce job.

Paketi benzetim modunda projenize de entegre edebilirsiniz. Prosedür şu şekildedir:

  1. Paket bağımlılıklarını ayarlayın.

    Temel SDK'ya ek olarak diğer bağımlılık paketleri gereklidir. Bunları istemci aracının lib klasöründe bulabilirsiniz. lib klasörü ayrıca SDK JAR paketini içerir. En son istemci aracının lib klasöründeki tüm JAR paketlerini içe aktarmanızı öneririz.

  2. JAR paketini yükleyin.

    Yerel testten geçen MapReduce programını bir JAR dosyasına paketleyin ve yükleyin. Örneğin JAR dosyasının adı mr.jar olsun. Daha fazla bilgi için bkz. Resource operations.

  3. Çalıştırma modunu ayarlayın.

    JobConf'u yapılandırın. Aşağıda bir yapılandırma örneği verilmiştir.

    // Configure the MaxCompute connection information.
    Account account = new AliyunAccount(accessid, accesskey);
    Odps odps = new Odps(account);
    odps.setEndpoint(endpoint);
    odps.setDefaultProject(project);
    // Get the session.
    SessionState ss = SessionState.get();
    ss.setOdps(odps);
    ss.setLocalRun(false);  // Set the value to false to run the job on the server. To debug the job locally, set the value to true.
    // The code for setting jobconf.
    Job job = new Job();
    String resource = “mr.jar”;
    job.setResources(resource); // This step is similar to the 'jar -resources mr.jar' command.
    // The following code follows the standard MapReduce rules.
    job.setMapperClass(XXXMapper.class);
    job.setReducerClass(XXXReducer.class);                            

    Yapılandırma tamamlandıktan sonra MapReduce işini doğrudan çalıştırabilirsiniz.

Bir MaxCompute MapReduce işi çalıştırırken oluşan BufferOverflowException hatasını nasıl çözerim?

  • Belirti:

    Bir MaxCompute MapReduce işi çalıştırdığınızda aşağıdaki hata döndürülür.

    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)   
  • Neden:

    Tek seferde yazılan veri miktarı çok büyüktür ve bu durum arabellek taşmasına neden olur.

  • Çözüm:

    MaxCompute'te tek bir alana yazılabilecek veri türleri için aşağıdaki sınırlar geçerlidir.

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

Bir MaxCompute MapReduce işi çalıştırırken oluşan "Kaynak bulunamadı" hatasını nasıl çözerim?

Bir iş gönderdiğinizde gerekli kaynakları belirtmek için -resources parametresini kullanın. Birden fazla kaynağı virgülle (,) ayırabilirsiniz.

Bir MaxCompute MapReduce işi çalıştırırken oluşan "Sınıf Bulunamadı" hatasını nasıl çözerim?

Bu hata bir MapReduce işi çalıştırırken aşağıdaki iki durumda oluşur:

  • classpath parametresi için sınıf adı yanlış. Tam paket adını belirtmelisiniz.

  • JAR paketleme sırasında bir hata oluştu. Paketleme sırasında SRC dizinindeki tüm kaynak kodunu seçtiğinizden emin olun.

Bir MaxCompute MapReduce işi çalıştırırken oluşan ODPS-0010000 hatasını nasıl çözerim?

  • Belirti:

    Bir MaxCompute MapReduce işi çalıştırdığınızda aşağıdaki hata döndürülür.

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

    Bu hata bir bölüm oluşturulmadan veya verileri hazır olmadan önce kullanmaya çalıştığınız için oluşur.

  • Çözüm:

    MapReduce işini çalıştırmadan önce bölümü oluşturmalısınız.

Bir MaxCompute MapReduce işi çalıştırırken oluşan "Tablo bulunamadı" hatasını nasıl çözerim?

  • Belirti:

    Bir MaxCompute MapReduce işi çalıştırdığınızda aşağıdaki hata döndürülür.

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

    Hedef proje yanlış veya hedef tablo mevcut değil.

  • Çözüm:

    MapReduce arabiriminin Table Info Builder'ı ProjectName ve TableName gerektirir. Bu iki parametreyi doğru proje adına ve tablo adına ayarlayın.

Bir MaxCompute MapReduce işi çalıştırırken oluşan ODPS-0123144 hatasını nasıl çözerim?

  • Belirti:

    Bir MaxCompute MapReduce işi çalıştırdığınızda aşağıdaki hata döndürülür.

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

    Bu hata kümedeki ikincil bir düğümün hesaplama sırasında zaman aşımına uğramasından kaynaklanır. Birincil düğüm daha sonra ikincil düğümü hatalı olarak kabul eder ve bir hata bildirir. Zaman aşımı süresi 10 dakikadır ve kullanıcılar tarafından yapılandırılamaz.

  • Çözüm:

    Bu hatanın yaygın bir nedeni Reduce işlevindeki büyük bir döngüdür; bu durum uzun kuyruklu verilerden veya Kartezyen çarpımdan kaynaklanabilir. Bu tür büyük döngüleri en aza indirmeyi deneyebilirsiniz.

Bir MaxCompute MapReduce işi çalıştırırken oluşan java.security.AccessControlException hatasını nasıl çözerim?

  • Belirti:

    Bir MaxCompute MapReduce işi çalıştırdığınızda aşağıdaki hata döndürülür.

    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)       
  • Neden:

    Bu hata kodunuzun sanal alan kısıtlamalarını ihlal etmesinden kaynaklanır. Daha fazla bilgi için bkz. Java sandbox.

  • Çözüm:

    Bu hatayı çözmek için harici kaynaklara erişmeniz gerekir. Ancak MaxCompute şu anda bu işlemi desteklememektedir. Harici işleme mantığını ve ilgili verileri bunlara erişmek için MaxCompute'te depolamanız gerekir. Yapılandırma dosyalarını okumak için bkz. Use resource files.

Bir MaxCompute MapReduce işi çalıştırırken oluşan java.io.IOException hatasını nasıl çözerim?

  • Belirti:

    Bir MaxCompute MapReduce işi çalıştırdığınızda aşağıdaki hata döndürülür.

    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‘)     
  • Neden:

    local-run maps varsayılan değeri 100'dür ve bu değerin ayarlanması gerekir.

  • Çözüm:

    -Dodps.mapred.local.map.max.tasks=200 yapılandırmasını ekleyebilirsiniz.

Bir MaxCompute MapReduce işi çalıştırırken oluşan "Maksimum okuma sayısı aşıldı" hatasını nasıl çözerim?

  • Belirti:

    Bir MaxCompute MapReduce işi çalıştırdığınızda aşağıdaki hata döndürülür.

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

    Kaynak dosyası çok fazla kez okundu.

  • Çözüm:

    Kaynağı okumaya yönelik kod mantığını kontrol edin. Genellikle bir kaynak yalnızca kurulum aşamasında bir kez okunmalıdır. Kaynağı Map veya Reduce aşamasında birden fazla kez okumayın.

Reduce işlevi başlamadan önce bellek yetersizliği hatası oluşuyor. Bu sorunu nasıl çözerim?

  • Neden:

    Bazı veriler çok büyüktür ve belleğe yüklendiğinde taşmaya neden olur.

  • Çözüm:

    Combiner'ı kaldırabilir veya set odps.mapred.map.min.split.size=512; kullanarak Combiner'daki boyutu sınırlayabilirsiniz.

Bir MaxCompute MapReduce işi çalıştırırken oluşan bellek yetersizliği hatasını nasıl çözerim?

Bellek yetersizliği hatası genellikle yetersiz bellekten kaynaklanır. Bu sorunu odps.stage.mapper.jvm.mem ve odps.stage.reducer.jvm.mem gibi JVM bellek parametrelerini ayarlayarak çözebilirsiniz. Örneğin belleği 2 GB olarak ayarlamak için set odps.stage.mapper.jvm.mem = 2048 komutunu çalıştırabilirsiniz.

Bir MaxCompute MapReduce işi çalıştırırken küçük bir yapılandırma dosyasını yüklemek için 600 Reducer başlatılıyor ancak java.lang.OutOfMemoryError hatası oluşuyor. Bunu nasıl çözerim?

  • Belirti:

    Bir MaxCompute MapReduce işi çalıştırdığınızda aşağıdaki hata döndürülür.

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

    Bu sorun MapReduce kullanım sınırlarından kaynaklanır. Daha fazla bilgi için bkz. Limits.

  • Çözüm:

    Native SDK overview bölümünde açıklandığı gibi ayarları yapılandırın.

Bir MaxCompute MapReduce işi çalıştırırken oluşan ODPS-0420095 hatasını nasıl çözerim?

  • Belirti:

    Bir MaxCompute MapReduce işi çalıştırdığınızda aşağıdaki hata döndürülür.

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

    Proje MaxCompute Developer Edition kaynaklarını kullanıyor. Bu sürüm yalnızca MaxCompute SQL'i (UDF'ler dahil) ve PyODPS işlerini destekler. MapReduce veya Spark gibi diğer görevleri desteklemez.

  • Çözüm:

    Proje teknik özelliklerini yükseltmek için bkz. Switch between billing methods.

MapReduce'te kaynakları kullanırken "Çok fazla açık dosya" hatası oluşuyor. Bunu nasıl çözerim?

  • Belirti:

    MapReduce'te kaynakları kullandığınızda aşağıdaki hata döndürülür.

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

    Tek bir iş 256'dan fazla kaynağa referans veremez. Aksi takdirde bir hata oluşur. Tablo kaynakları ve Arşiv kaynaklarının her biri bir birim olarak sayılır. Sınırlar hakkında daha fazla bilgi için bkz. Limits.

  • Çözüm:

    Referans verilen kaynakların sayısını ayarlamanız gerekir.

Bir MapReduce programında üçüncü taraf bir sınıf kullanıyorum ve bir Assembly JAR dosyası paketliyorum. Çalışma zamanında "sınıf bulunamadı" hatası oluşuyor. Bunu nasıl çözerim?

Bir MaxCompute MapReduce işi dağıtılmış ortamda çalıştırıldığında Java sanal alanı kısıtlamalarına tabidir. MapReduce işinin ana programı bu kısıtlamalara tabi değildir. Kısıtlamalar hakkında daha fazla bilgi için bkz. Java sandbox.

Yalnızca JSON'u işlemeye ihtiyacınız varsa Gson'ı doğrudan kullanın. Gson sınıfını paketlemenize gerek yoktur. Java açık kaynak bileşenleri dizeleri tarihlere dönüştürmek için SimpleDateFormat gibi birçok yöntem sağlar.

MaxCompute üzerinde açık kaynak uyumlu bir MapReduce işi çalıştırırken "dizin sınırların dışında" hatası oluşuyor. Bunu nasıl çözerim?

Kodunuzu yazmak için MaxCompute MapReduce arabirimini kullanmanızı öneririz. Gerekmeyen durumlarda MapReduce yerine Spark kullanmanızı da öneririz.