Topik ini menjawab pertanyaan umum mengenai tabel eksternal.
Kategori | FAQ |
Tabel eksternal Object Storage Service (OSS) | |
Tabel eksternal Hologres | Bagaimana cara mengatasi error ODPS-0130071 saat langsung membaca data Hologres dari MaxCompute? |
Masalah performa | Bagaimana cara menangani job SQL yang lambat pada tabel eksternal? |
Error ODPS-0123131: Membaca tipe DATETIME dengan extractor kustom
Masalah
Saat menggunakan extractor kustom untuk membaca data tidak terstruktur, error berikut muncul jika bidang data bertipe DATETIME, seperti
2019-11-11 06:43:36.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)Penyebab
Pada kode
Date.valueOf(parts), fungsijava.sql.Date.valueOf()hanya mendukung parameter STRING dalam format"yyyy-[m]m-[d]d"dan tidak mendukung parameter DATETIME.Resolusi
Tambahkan dependensi Joda-Time ke proyek Anda dan impor kelas yang diperlukan ke dalam kode.
-- Dependency. <dependency> <groupId>joda-time</groupId> <artifactId>joda-time</artifactId> <version>2.10</version> </dependency> -- Informasi impor. import org.joda.time.DateTime; import org.joda.time.format.DateTimeFormat;Gunakan fungsi
DateTimeFormat.forPattern()untuk mengonversi nilai tipe DATETIME ke tipe STRING agar dapat dibaca.record.setDate(index, new Date(DateTime.parse(parts[i], DateTimeFormat.forPattern("yyyy-MM-dd HH:mi:ss")).getMillis()));
Contoh:
Unggah file JAR proyek extractor Anda menggunakan client MaxCompute.
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.jaradalah jalur penyimpanan lokal untuk file JAR yang dihasilkan.Unggah file JAR pihak ketiga Joda-Time menggunakan client MaxCompute.
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.jaradalah jalur lokal file JAR pihak ketiga Joda-Time.Unggah data uji ke direktori yang ditentukan di OSS. Untuk file bernama
video_play_log.txt, data sampelnya sebagai berikut.5c661071dba64d5080c91da085ff1073^Music-Click-Fast forward^26.12.XX.XX^2019-11-11 06:43:36Baca data dari tabel eksternal.
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 | +------+-------+---+----------------+
Kehabisan memori pada UDF yang mengakses tabel eksternal OSS
Masalah
Saat menggunakan UDF untuk mengakses tabel eksternal OSS, terjadi error kehabisan memori meskipun UDF tersebut lolos pengujian lokal.
FAILED: ODPS-0123131:User defined function exception - Traceback: java.lang.OutOfMemoryError: Java heap spaceSetelah mengatur parameter berikut, waktu proses meningkat, tetapi error tetap muncul.
set odps.stage.mapper.mem = 2048; set odps.stage.mapper.jvm.mem = 4096;Penyebab
Tabel eksternal berisi terlalu banyak file objek, yang mengonsumsi memori dalam jumlah besar. Selain itu, tidak ada partisi yang dikonfigurasi.
Resolusi
Kueri jumlah data yang lebih kecil.
Gunakan partisi untuk mengurangi jumlah data yang dipindai dalam setiap kueri.
Error: Inline data exceeds maximum allowed size
Masalah
Error
Inline data exceeds the maximum allowed sizeterjadi saat memproses data di Object Storage Service (OSS).Penyebab
Saat MaxCompute menulis data ke tabel eksternal OSS, sistem mungkin mencoba membuat satu file tunggal yang melebihi batas ukuran operasional.
Penyelesaian
Atur properti berikut untuk mengontrol rencana eksekusi. Hal ini memastikan bahwa file individual yang ditulis ke tabel eksternal OSS tidak melebihi batas ukuran.
-- Atur jumlah data yang dibaca oleh setiap mapper. Satuan: MB. SET odps.sql.mapper.split.size=256; -- Atur jumlah worker pada fase reduce. SET odps.stage.reducer.num=100;
Membaca data JSON menggunakan tabel eksternal OSS
Untuk petunjuknya, lihat Membaca data JSON menggunakan tabel eksternal OSS.
Menggabungkan file kecil dengan tabel eksternal OSS
Gunakan log Logview untuk memeriksa apakah operator terakhir dalam rencana eksekusi SQL adalah Reducer atau Joiner. Jika operator tersebut adalah Reducer, eksekusi pernyataan set odps.stage.reducer.num=1;. Jika operator tersebut adalah Joiner, eksekusi pernyataan set odps.stage.joiner.num=1;.
Error ODPS-0130071: Membaca data Hologres dari MaxCompute
Masalah
Saat langsung membaca data dari Hologres, error "ODPS-0130071 Failed to split to equal size...max count: 7777" dilaporkan. Contoh:
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: 7777Penyebab
Error ini terjadi karena strategi pemisahan mapper default MaxCompute (volume data masukan / split.size = 256 MB) menyebabkan jumlah mapper konkuren melebihi batas maksimum 7.777.
CatatanBatas ini mencegah pengguna mengirimkan job yang menghasilkan jumlah mapper sangat besar, yang dapat memengaruhi stabilitas Hologres atau koneksi jaringan.
Penyelesaian
Anda dapat mengatur parameter berikut untuk mengatasi error tersebut.
-- Tingkatkan batas konkurensi mapper. Nilai maksimum adalah 10.000. SET odps.external.holo.mapper.instances=10000; -- Atur konkurensi task dengan meningkatkan ukuran split. Nilai maksimum adalah 512 MB. SET odps.sql.mapper.split.size=512;
Job SQL lambat pada tabel eksternal
Job SQL pada tabel eksternal bisa lambat karena beberapa alasan umum:
Pembacaan lambat file terkompresi GZ dari tabel eksternal OSS
Masalah
Membaca file terkompresi besar (misalnya file GZ 200 GB) dari tabel eksternal OSS berjalan lambat.
Penyebab
Job berjalan lambat karena format terkompresi seperti GZ tidak dapat dipisah (non-splittable), sehingga memaksa MaxCompute hanya menggunakan satu mapper.
Penyelesaian
Untuk meningkatkan performa, pisahkan file terkompresi besar tersebut menjadi beberapa file kecil di OSS. Hal ini memungkinkan MaxCompute menggunakan beberapa mapper secara paralel, yang meningkatkan throughput baca.
-- Mengatur ukuran split data untuk setiap mapper dalam satuan MB. SET odps.sql.mapper.split.size=256;Untuk data tidak terstruktur, periksa apakah jalur tabel eksternal Object Storage Service (OSS) hanya berisi satu file. Jika hanya ada satu file, hanya satu Mapper yang dihasilkan karena data tidak terstruktur yang terkompresi tidak dapat dipisah. Hal ini memperlambat pemrosesan. Pisahkan file OSS besar tersebut menjadi file-file kecil di jalur tabel eksternal OSS. Langkah ini meningkatkan jumlah Mapper dan mempercepat kecepatan baca.
Kueri data lambat pada tabel eksternal MaxCompute menggunakan SDK
Masalah
Kueri data dari tabel eksternal MaxCompute menggunakan SDK berjalan lambat.
Resolusi
Tabel eksternal hanya mendukung pemindaian tabel penuh (full table scan), yang bisa lambat. Kami menyarankan Anda menggunakan tabel internal MaxCompute sebagai gantinya.
Kueri data lambat dari tabel eksternal Tablestore
Masalah
Kueri pada tabel eksternal Tablestore jauh lebih lambat dibandingkan kueri ekuivalen pada tabel internal MaxCompute yang berisi data yang sama.
Penyelesaian
Perbedaan performa ini bersifat ekspektasi karena kueri tabel eksternal melibatkan pembacaan data jarak jauh (remote). Untuk performa yang lebih baik, impor data tersebut ke tabel internal MaxCompute terlebih dahulu, lalu jalankan kueri Anda.
Error "Couldn't connect to server" pada tabel eksternal OSS
Masalah
Saat membaca data dari tabel eksternal OSS, error berikut dilaporkan:
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.Penyebab
Alasan 1: Saat membuat tabel eksternal OSS, titik akhir publik digunakan untuk
oss_endpointdi oss_location, bukan titik akhir internal.Penyebab 2: Saat membuat tabel eksternal OSS,
oss_endpointyang ditentukan dalam jalur oss_location termasuk wilayah yang berbeda.
Penyelesaian
Untuk Penyebab 1:
Periksa parameter
oss_locationdalam pernyataanCREATE TABLEuntuk tabel eksternal OSS. Jikaoss_endpointmerupakan titik akhir publik, ubah menjadi titik akhir internal. Untuk informasi lebih lanjut mengenai parameter, lihat Deskripsi parameter.Sebagai contoh, jika Anda berada di wilayah Indonesia (Jakarta) dan menggunakan endpoint
oss://oss-ap-southeast-5.aliyuncs.com/<bucket>/....untuk membuat tabel eksternal, ubahlah ke titik akhir internal yang sesuai:oss://oss-ap-southeast-5-internal.aliyuncs.com/<bucket>/.....Untuk Penyebab 2:
Verifikasi bahwa
oss_endpointdalam parameteross_locationpernyataan CREATE TABLE untuk tabel eksternal OSS adalah endpoint wilayah yang ingin Anda akses. Untuk informasi lebih lanjut mengenai nama domain jaringan klasik OSS, lihat Wilayah dan Titik Akhir.
Error "Network is unreachable (connect failed)" saat pembuatan tabel
Masalah
Saat membuat tabel eksternal untuk Object Storage Service (OSS), error berikut dilaporkan:
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).Penyebab
Saat membuat tabel eksternal OSS,
oss_endpointdalam alamat oss_location menggunakan titik akhir publik, bukan titik akhir internal.Penyelesaian
Periksa pernyataan
CREATE TABLEuntuk tabel eksternal OSS guna memverifikasi bahwaoss_endpointyang ditentukan dalam parameteross_locationadalah titik akhir internal. Jika berupa titik akhir publik, ubahlah menjadi titik akhir internal. Untuk informasi lebih lanjut mengenai parameter, lihat Deskripsi parameter.Sebagai contoh, di wilayah Tiongkok (Beijing), jika Anda menggunakan endpoint
oss://oss-cn-beijing.aliyuncs.com/<bucket>/....untuk membuat tabel eksternal, ubahlah ke titik akhir internal yang sesuaioss://oss-cn-beijing-internal.aliyuncs.com/<bucket>/.....