Bu konu, dış tablolarla ilgili sıkça sorulan soruları yanıtlar.
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:36gibi 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])kodundakijava.sql.Date.valueOf()işlevi yalnızca"yyyy-[m]m-[d]d"biçimindeki STRING parametrelerini destekler; DATETIME parametrelerini desteklemez. -
Çözüm
-
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; -
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:
-
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.jaryolu, oluşturulan JAR dosyasının yerel depolama yoludur. -
Üçü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.jaryolu, üçüncü taraf Joda-Time JAR dosyasının yerel yoludur. -
Test verilerini OSS'teki belirtilen dizine yükleyin.
video_play_log.txtadlı dosya için örnek veriler aşağıdadır.5c661071dba64d5080c91da085ff1073^Music-Click-Fast forward^26.12.XX.XX^2019-11-11 06:43:36 -
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 spaceAş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 sizehatası 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.
NotBu 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_endpointiç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_endpointfarklı bir bölgeye aittir.
-
Çözüm
-
Neden 1 için:
OSS dış tablosu için
CREATE TABLEifadesindekioss_locationparametresini kontrol etmeniz gerekir.oss_endpointgenel 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_locationparametresininoss_endpointdeğ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_endpointdahili bir uç nokta yerine genel bir uç nokta kullanır. -
Çözüm
OSS dış tablosu için
CREATE TABLEifadesini kontrol ederekoss_locationparametresinde belirtilenoss_endpointdeğ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ç noktaoss://oss-cn-beijing-internal.aliyuncs.com/<bucket>/....ile değiştirmelisiniz.