Tüm Ürünler
Search
Belge Merkezi

MaxCompute:Lakehouse ve dış tablolar hakkında SSS

Son Güncelleme:Oct 04, 2026

Bu konu, dış tablolarla ilgili sıkça sorulan soruları yanıtlar.

Kategori

SSS

Object Storage Service (OSS) dış tablosu

Hologres dış tablosu

MaxCompute üzerinden Hologres verilerini doğrudan okurken ODPS-0130071 hatasını nasıl çözerim?

Performans sorunları

Dış tablolarda yavaş çalışan SQL işlerini nasıl gideririm?

ODPS-0123131 hatası: Özel ayıklayıcılarla DATETIME türlerinin okunması

  • Sorun

    Yapılandırılmamış verileri okumak için özel bir ayıklayıcı kullandığınızda, veri alanı 2019-11-11 06:43:36 gibi DATETIME türündeyse aşağıdaki hata oluşur.

    FAILED: ODPS-0123131:User defined function exception - Traceback:
    java.lang.IllegalArgumentException
        at java.sql.Date.valueOf(Date.java:143)
        at com.aliyun.odps.udf.example.text.TextExtractor.textLineToRecord(TextExtractor.java:194)
        at com.aliyun.odps.udf.example.text.TextExtractor.extract(TextExtractor.java:153)
        at com.aliyun.odps.udf.ExtractorHandler.extract(ExtractorHandler.java:120)       
  • Neden

    Date.valueOf(parts[i]) kodundaki java.sql.Date.valueOf() işlevi yalnızca "yyyy-[m]m-[d]d" biçimindeki STRING parametrelerini destekler; DATETIME parametrelerini desteklemez.

  • Çözüm

    1. Projenize Joda-Time bağımlılığını ekleyin ve gerekli sınıfları kodunuza aktarın.

      -- Dependency.
      <dependency>
        <groupId>joda-time</groupId>
        <artifactId>joda-time</artifactId>
        <version>2.10</version>
      </dependency> 
      -- Import information.
      import org.joda.time.DateTime;
      import org.joda.time.format.DateTimeFormat;                           
    2. DATETIME türündeki bir değeri okumak üzere STRING türüne dönüştürmek için DateTimeFormat.forPattern() işlevini kullanın.

      record.setDate(index, new Date(DateTime.parse(parts[i], DateTimeFormat.forPattern("yyyy-MM-dd HH:mi:ss")).getMillis()));                           

    Örnek:

    1. Ayıklayıcı projeniz için JAR dosyasını yüklemek amacıyla MaxCompute istemcisini kullanın.

      add jar /Users/gary/big_data/odps/text_extractor/target/text_extractor-1.0-SNAPSHOT.jar      

      /Users/gary/big_data/odps/text_extractor/target/text_extractor-1.0-SNAPSHOT.jar yolu, oluşturulan JAR dosyasının yerel depolama yoludur.

    2. Üçüncü taraf Joda-Time JAR dosyasını yüklemek için MaxCompute istemcisini kullanın.

      add jar /Users/gary/.m2/repository/joda-time/joda-time/2.10/joda-time-2.10.jar                         

      /Users/gary/.m2/repository/joda-time/joda-time/2.10/joda-time-2.10.jar yolu, üçüncü taraf Joda-Time JAR dosyasının yerel yoludur.

    3. Test verilerini OSS'teki belirtilen dizine yükleyin. video_play_log.txt adlı dosya için örnek veriler aşağıdadır.

      5c661071dba64d5080c91da085ff1073^Music-Click-Fast forward^26.12.XX.XX^2019-11-11 06:43:36                           
    4. Verileri dış tablodan okuyun.

      select * from <project_name>.video_play_log;
      +------+-------+---+----------------+
      | uuid  | action  | ip  | time      |
      +------+-------+---+----------------+
      | 5c661071dba64d5080c91da085ff1073 | Music-Click-Fast forward | 26.12.XX.XX | 2019-11-11 06:43:36 |
      +------+-------+---+----------------+     

OSS dış tablolarında UDF'lerle bellek taşması

  • Sorun

    Bir UDF kullanarak bir OSS dış tablosuna eriştiğinizde, UDF yerel testleri geçmesine rağmen bellek taşması hatası oluşur.

    FAILED: ODPS-0123131:User defined function exception - Traceback:
    java.lang.OutOfMemoryError: Java heap space        

    Aşağıdaki parametreleri ayarladıktan sonra çalışma süresi artar ancak hata devam eder.

    set odps.stage.mapper.mem = 2048; 
    set odps.stage.mapper.jvm.mem = 4096;       
  • Neden

    Dış tabloda çok sayıda nesne dosyası bulunur ve bu dosyalar büyük miktarda bellek tüketir. Ayrıca bölümler yapılandırılmamıştır.

  • Çözüm

    • Daha az miktarda veri sorgulayın.

    • Her sorguda taranan veri miktarını azaltmak için bölümleri kullanın.

Hata: Satır içi veri izin verilen maksimum boyutu aşıyor

  • Sorun

    Object Storage Service (OSS) içindeki verileri işlerken Inline data exceeds the maximum allowed size hatası oluşur.

  • Neden

    MaxCompute, bir OSS dış tablosuna veri yazarken operasyonel boyut sınırını aşan tek bir dosya oluşturmaya çalışabilir.

  • Çözüm

    Aşağıdaki özellikleri ayarlayarak yürütme planını kontrol edin. Bu işlem, OSS dış tablosuna yazılan tekil dosyaların boyut sınırını aşmamasını sağlar.

    -- Adjust the amount of data read by each mapper. Unit: MB.
    SET odps.sql.mapper.split.size=256; 
    -- Adjust the number of workers in the reduce phase.
    SET odps.stage.reducer.num=100; 

OSS dış tablolarıyla küçük dosyaları birleştirme

SQL yürütme planındaki son operatörün Reducer mı yoksa Joiner mı olduğunu kontrol etmek için Logview günlüğünü kullanın. Operatör bir Reducer ise set odps.stage.reducer.num=1; ifadesini çalıştırın. Bir Joiner ise set odps.stage.joiner.num=1; ifadesini çalıştırın.

ODPS-0130071 hatası: MaxCompute üzerinden Hologres verilerinin okunması

  • Sorun

    Hologres'ten doğrudan veri okurken "ODPS-0130071 Failed to split to equal size...max count: 7777" hatası bildirilir. Örnek:

    ODPS-0130071:[0,0] Semantic analysis exception - physical plan generation failed: storage/table/src/input_splits_builder.cpp(195): StorageException: Failed to split to equal size, total size: 2143570729934, min size: 268435456, max size: 272629760, max count: 7777, split size: 275629513, split count: 7777
  • Neden

    Bu hata, MaxCompute'in varsayılan mapper bölme stratejisinin (giriş veri hacmi / split.size = 256 MB) eşzamanlı mapper sayısının 7.777 olan maksimum sınırı aşmasına neden olması nedeniyle oluşur.

    Not

    Bu sınır, kullanıcıların Hologres'in veya ağ bağlantısının kararlılığını etkileyebilecek çok sayıda mapper oluşturan işler göndermesini engeller.

  • Çözüm

    Hatayı çözmek için aşağıdaki parametreleri ayarlayabilirsiniz.

    -- Increase the mapper concurrency limit. The maximum value is 10,000.
    SET odps.external.holo.mapper.instances=10000; 
    -- Adjust task concurrency by increasing the split size. The maximum value is 512 MB.
    SET odps.sql.mapper.split.size=512; 

Dış tablolarda yavaş çalışan SQL işleri

Dış tablolardaki SQL işleri birkaç yaygın nedenden dolayı yavaş çalışabilir:

  • OSS dış tablosundan GZ sıkıştırılmış dosyaların yavaş okunması

    • Sorun

      OSS dış tablosundan büyük, sıkıştırılmış bir dosyanın (örneğin 200 GB'lık bir GZ dosyası) okunması yavaştır.

    • Neden

      GZ gibi sıkıştırılmış biçimler bölünemez olduğundan MaxCompute yalnızca tek bir mapper kullanmak zorunda kalır ve bu da işin yavaşlamasına neden olur.

    • Çözüm

      • Performansı artırmak için büyük sıkıştırılmış dosyayı OSS'te birden çok küçük dosyaya bölün. Bu işlem, MaxCompute'in paralel olarak birden çok mapper kullanmasını sağlayarak okuma aktarım hızını artırır.

        -- Sets the data split size for each mapper in MB.
        SET odps.sql.mapper.split.size=256;       
      • Yapılandırılmamış veriler için Object Storage Service (OSS) dış tablosunun yolunda yalnızca tek bir dosya olup olmadığını kontrol edin. Yalnızca tek bir dosya varsa, sıkıştırılmış yapılandırılmamış veriler bölünemediğinden yalnızca bir Mapper oluşturulur. Bu durum işlemeyi yavaşlatır. Büyük OSS dosyasını, OSS dış tablosunun yolundaki daha küçük dosyalara bölün. Bu işlem Mapper sayısını artırır ve okuma hızını iyileştirir.

  • SDK kullanarak MaxCompute dış tablosunda veri sorgulamanın yavaş olması

    • Sorun

      Bir SDK kullanarak MaxCompute dış tablosundan veri sorgulamak yavaştır.

    • Çözüm

      Dış tablolar yalnızca tam tablo taramalarını destekler ve bu işlem yavaş olabilir. Bunun yerine MaxCompute iç tablolarını kullanmanızı öneririz.

  • Tablestore dış tablosundan veri sorgulamanın yavaş olması

    • Sorun

      Tablestore dış tablosundaki bir sorgu, aynı verileri içeren bir MaxCompute iç tablosundaki eşdeğer bir sorgudan önemli ölçüde daha yavaştır.

    • Çözüm

      Bu performans farkı beklenen bir durumdur çünkü dış tabloyu sorgulamak uzaktan veri okumayı içerir. Daha iyi performans için önce verileri bir MaxCompute iç tablosuna aktarın ve ardından sorgularınızı çalıştırın.

OSS dış tablolarında "Couldn't connect to server" hatası

  • Sorun

    Bir OSS dış tablosundan veri okurken aşağıdaki hata bildirilir: ODPS-0123131:User defined function exception - common/io/oss/oss_client.cpp(95): OSSRequestException: req_id: , http status code: -998, error code: HttpIoError, message: Couldn't connect to server.

  • Nedenler

    • Neden 1: Bir OSS dış tablosu oluşturduğunuzda, oss_location içindeki oss_endpoint için dahili bir uç nokta yerine genel bir uç nokta kullanılır.

    • Neden 2: Bir OSS dış tablosu oluşturduğunuzda, oss_location yolunda belirtilen oss_endpoint farklı bir bölgeye aittir.

  • Çözüm

    • Neden 1 için:

      OSS dış tablosu için CREATE TABLE ifadesindeki oss_location parametresini kontrol etmeniz gerekir. oss_endpoint genel bir uç noktaysa bunu dahili bir uç nokta ile değiştirin. Parametreler hakkında daha fazla bilgi için bkz. Parametre açıklaması.

      Örneğin, Endonezya (Cakarta) bölgesindeyseniz ve bir dış tablo oluşturmak için oss://oss-ap-southeast-5.aliyuncs.com/<bucket>/.... uç noktasını kullanıyorsanız, bunu karşılık gelen dahili uç nokta ile değiştirmelisiniz: oss://oss-ap-southeast-5-internal.aliyuncs.com/<bucket>/.....

    • Neden 2 için:

      OSS dış tablosu için CREATE TABLE ifadesindeki oss_location parametresinin oss_endpoint değerinin, erişmek istediğiniz bölgenin uç noktası olduğunu doğrulamanız gerekir. OSS klasik ağ alan adları hakkında daha fazla bilgi için bkz. Bölgeler ve Uç Noktalar.

Tablo oluşturma sırasında "Network is unreachable (connect failed)" hatası

  • Sorun

    Object Storage Service (OSS) için bir dış tablo oluşturduğunuzda aşağıdaki hata bildirilir:ODPS-0130071:[1,1] Semantic analysis exception - external table checking failure, error message: Cannot connect to the endpoint 'oss-cn-beijing.aliyuncs.com': Connect to bucket.oss-cn-beijing.aliyuncs.com:80 [bucket.oss-cn-beijing.aliyuncs.com] failed: Network is unreachable (connect failed).

  • Neden

    Bir OSS dış tablosu oluştururken, oss_location adresindeki oss_endpoint dahili bir uç nokta yerine genel bir uç nokta kullanır.

  • Çözüm

    OSS dış tablosu için CREATE TABLE ifadesini kontrol ederek oss_location parametresinde belirtilen oss_endpoint değerinin dahili bir uç nokta olduğunu doğrulamanız gerekir. Genel bir uç noktaysa bunu dahili bir uç nokta ile değiştirmeniz gerekir. Parametreler hakkında daha fazla bilgi için bkz. Parametre açıklaması.

    Örneğin, Çin (Pekin) bölgesinde bir dış tablo oluşturmak için oss://oss-cn-beijing.aliyuncs.com/<bucket>/.... uç noktasını kullanıyorsanız, bunu karşılık gelen dahili uç nokta oss://oss-cn-beijing-internal.aliyuncs.com/<bucket>/.... ile değiştirmelisiniz.