MaxCompute mendukung tabel eksternal OSS yang memetakan ke direktori Object Storage Service (OSS). Tabel ini digunakan untuk membaca data tidak terstruktur dari OSS atau menulis data ke OSS.
Catatan penggunaan
-
Tabel eksternal OSS tidak mendukung properti cluster.
-
Ukuran satu file tidak boleh melebihi 2 GB. File yang lebih besar harus dibagi.
-
MaxCompute dan OSS harus berada di wilayah yang sama.
Metode akses
Platform berikut mendukung pembuatan dan penggunaan tabel eksternal OSS.
|
Metode |
Platform |
|
MaxCompute SQL |
|
|
Visualisasi |
Prasyarat
-
Anda telah membuat proyek MaxCompute.
-
Siapkan bucket dan direktori OSS. Buat bucket dan Kelola direktori.
MaxCompute dapat membuat direktori OSS secara otomatis. Jika pernyataan SQL mencakup tabel eksternal dan UDF, satu pernyataan SQL dapat membaca dari atau menulis ke tabel eksternal sekaligus menjalankan UDF. Pembuatan direktori secara manual juga didukung.
Karena MaxCompute hanya dideploy di beberapa wilayah, konektivitas jaringan lintas wilayah bisa menjadi masalah. Simpan bucket Anda di wilayah yang sama dengan proyek MaxCompute Anda.
-
Otorisasi
-
Dapatkan izin untuk mengakses OSS. Akun Alibaba Cloud, Pengguna RAM, atau Peran RAM dapat mengakses tabel eksternal OSS. Otorisasi STS untuk OSS.
-
Dapatkan izin CreateTable di proyek MaxCompute Anda. Izin MaxCompute.
-
Membuat tabel eksternal OSS
-
Tabel partisi dan non-partisi:
-
Pilih berdasarkan cara penyimpanan file data Anda di OSS. Gunakan tabel partisi jika file berada di path berpartisi; jika tidak, gunakan tabel non-partisi.
-
Tabel eksternal OSS mendukung Operasi partisi.
-
-
Nama domain jaringan: Gunakan nama domain jaringan klasik untuk OSS. MaxCompute tidak menjamin konektivitas jaringan untuk nama domain jaringan publik.
-
Tabel eksternal OSS hanya mencatat pemetaan ke direktori OSS. Menghapus tabel eksternal OSS tidak akan menghapus file data di direktori OSS yang dipetakan.
-
Jika file data OSS adalah objek arsip, Anda harus terlebih dahulu memulihkan objek.
Sintaks CREATE EXTERNAL TABLE bervariasi berdasarkan format file data. Sesuaikan sintaks dan parameter dengan format data Anda. Pengaturan yang salah menyebabkan kegagalan membaca dan menulis.
Sintaks
Buat tabel eksternal menggunakan parser data teks bawaan
|
Sintaks |
Format file data |
Contoh |
|
Format file data yang didukung untuk membaca dari atau menulis ke OSS:
|
Buat tabel eksternal menggunakan parser data open source bawaan
|
Sintaks |
Format file data |
Contoh |
|
Format file data yang didukung untuk membaca dari atau menulis ke OSS:
|
Buat tabel eksternal menggunakan parser kustom
|
Sintaks |
Format file data |
Contoh |
|
Format file data yang didukung untuk membaca dari atau menulis ke OSS: File data dalam format selain yang tercantum di atas. |
Parameter
Parameter berikut umum digunakan di semua format tabel eksternal. Untuk parameter spesifik format, lihat dokumentasi masing-masing format.
-
Parameter sintaks dasar
Parameter
Wajib
Deskripsi
mc_oss_extable_name
Ya
Nama tabel eksternal OSS yang akan dibuat.
Nama tabel tidak peka huruf besar/kecil dan tidak dapat dipaksa dikonversi ke bentuk tertentu.
col_name
Ya
Nama kolom dalam tabel eksternal OSS.
Skema tabel eksternal harus sesuai dengan skema file data OSS. Jika tidak, data tidak dapat dibaca.
data_type
Ya
Tipe data kolom dalam tabel eksternal OSS.
Tipe data setiap kolom harus sesuai dengan kolom yang sesuai dalam file data OSS. Jika tidak, data tidak dapat dibaca.
table_comment
Tidak
Komentar untuk tabel. Komentar harus berupa string valid dengan panjang maksimal 1.024 byte. Jika tidak, kesalahan akan dilaporkan.
partitioned by (col_name data_type, ...)
Tidak
Jika file data di OSS disimpan dalam path berpartisi, sertakan parameter ini untuk membuat tabel partisi.
-
col_name: Nama kolom kunci partisi.
-
data_type: Tipe data kolom kunci partisi.
'<(tb)property_name>'='<(tb)property_value>'
Ya
Properti tambahan tabel eksternal. Lihat dokumentasi spesifik format untuk detailnya.
oss_location
Ya
Path OSS tempat file data berada. Secara default, semua file data di path ini akan dibaca.
Formatnya adalah
oss://<oss_endpoint>/<Bucket name>/<OSS directory name>/.-
oss_endpoint:
-
Nama domain OSS. Anda harus menggunakan titik akhir jaringan klasik yang disediakan oleh OSS, yang mengandung
-internal.Contoh:
oss://oss-cn-beijing-internal.aliyuncs.com/xxx.Nama domain jaringan klasik OSS tercantum di Wilayah dan titik akhir.
Simpan wilayah OSS tempat file data disimpan agar sama dengan wilayah proyek MaxCompute Anda. Jika berbeda wilayah, masalah konektivitas jaringan dapat terjadi.
-
Jika Anda tidak menentukan titik akhir, sistem akan menggunakan titik akhir wilayah tempat proyek saat ini berada.
Metode ini tidak disarankan karena penyimpanan file lintas wilayah dapat menyebabkan masalah konektivitas jaringan.
-
-
Bucket name: Nama bucket OSS. Nama bucket harus mengikuti
oss_endpoint.Contoh:
oss://oss-cn-beijing-internal.aliyuncs.com/your_bucket/path/.Lihat nama bucket di Daftar bucket.
-
Directory name: Nama direktori OSS. Jangan tentukan nama file setelah direktori.
Contoh:
oss://oss-cn-beijing-internal.aliyuncs.com/oss-mc-test/Demo1/.Contoh yang salah:
-- Koneksi HTTP tidak didukung. http://oss-cn-shanghai-internal.aliyuncs.com/oss-mc-test/Demo1/ -- Koneksi HTTPS tidak didukung. https://oss-cn-shanghai-internal.aliyuncs.com/oss-mc-test/Demo1/ -- Alamat koneksi salah. oss://oss-cn-shanghai-internal.aliyuncs.com/Demo1 -- Jangan tentukan nama file. oss://oss-cn-shanghai-internal.aliyuncs.com/oss-mc-test/Demo1/vehicle.csv -
Spesifikasi izin (RamRole):
-
Tentukan secara eksplisit (Disarankan): Buat role kustom, lampirkan kebijakan akses, dan gunakan ARN-nya. Otorisasi STS.
-
Gunakan Default (Tidak disarankan): Gunakan ARN dari role
aliyunodpsdefaultrole.
-
-
-
Dengan atribut serdeproperties
property_name
Skenario
property_value
Nilai default
odps.properties.rolearn
Tambahkan properti ini saat menggunakan otorisasi STS.
Tentukan ARN dari role RAM yang memiliki izin untuk mengakses OSS.
Dapatkan ARN dari detail role di Konsol RAM. Contoh:
acs:ram::xxxxxx:role/aliyunodpsdefaultrole.-
Jika pemilik MaxCompute dan OSS adalah akun yang sama:
-
Jika Anda tidak menentukan
odps.properties.rolearndalam pernyataan pembuatan tabel, ARN dari rolealiyunodpsdefaultroleakan digunakan secara default. Anda harus terlebih dahulu membuat rolealiyunodpsdefaultrolemenggunakan Otorisasi STS. -
Untuk menggunakan ARN role kustom, pertama-tama buat role kustom tersebut. Otorisasi STS untuk OSS (otorisasi kustom).
-
-
Jika pemilik MaxCompute dan OSS adalah akun yang berbeda, Anda harus menentukan ARN dari role kustom. Untuk informasi lebih lanjut, lihat Otorisasi STS untuk OSS (otorisasi kustom).
-
Daftar putih dan blacklist
Tabel eksternal OSS MaxCompute mendukung penyaringan daftar putih dan blacklist. Dengan mengatur parameter daftar putih dan blacklist di tblproperties, Anda dapat menyaring file mana yang akan dibaca dari direktori.
-
Parameter tblproperties
-
Aturan efektif
-
Blacklist memiliki prioritas lebih tinggi daripada daftar putih: jika file cocok dengan kondisi blacklist apa pun, file tersebut dikecualikan.
-
Flag sesi dan parameter blacklist tblproperties memiliki hubungan "ATAU". Jika keduanya dikonfigurasi, keduanya berlaku — file yang cocok dengan kondisi blacklist mana pun dikecualikan. Konfigurasi tblProperties disarankan.
Metode konfigurasi
Jenis path
Parameter
flag sesi
Path absolut
odps.sql.unstructured.file.pattern.black.list
tblproperties
Path relatif
odps.external.data.file.blacklist.regex
-
-
Catatan Regex
-
Anchor awal baris
^dan akhir baris$bersifat opsional. Misalnya, untuk mencocokkan file.json,.*\.jsonsudah cukup. -
Hanya satu pola regex yang didukung. Untuk mengecualikan beberapa jenis file, gunakan |:
-- Mengecualikan file csv, txt, dan parquet "odps.external.data.file.blacklist.regex": ".*\\.(txt|csv|parquet)$"
-
-
Perbarui parameter daftar putih dan blacklist
ALTER TABLE {table_name} SET tblproperties('odps.external.data.file.whitelist.regex'='new_regex') ALTER TABLE {table_name} SET tblproperties('odps.external.data.file.blacklist.regex'='new_regex') -
Contoh
-
Data sampel
-- Asumsikan direktori OSS berisi file berikut: oss://xxx/bucket/level1/data1.txt oss://xxx/bucket/level1/data2.json oss://xxx/bucket/level1/data3.csv oss://xxx/bucket/level1/level2/data4.txt oss://xxx/bucket/level1/level2/data5.json oss://xxx/bucket/level1/level2/data6.parquet -
Daftar putih: hanya baca file JSON
CREATE EXTERNAL TABLE test_whitelist_table ( id INT, name STRING ) row format serde 'org.apache.hive.hcatalog.data.JsonSerDe' STORED AS textfile LOCATION 'oss://xxx/bucket/level1' TBLPROPERTIES ( 'odps.external.data.enable.extension'='true', -- Aktifkan dukungan ekstensi file 'odps.external.data.file.whitelist.regex'='.*\\.json'); -- Daftar putih: hanya file JSON -- Dengan menjalankan SELECT * FROM test_whitelist_table, semua file JSON dipilih. -- Kueri mengembalikan data dari data2.json dan level2/data5.json -
Blacklist: kecualikan file txt, csv, dan parquet
CREATE EXTERNAL TABLE test_blacklist_table ( id INT, name STRING ) row format serde 'org.apache.hive.hcatalog.data.JsonSerDe' STORED as textfile LOCATION 'oss://xxx/bucket/level1' TBLPROPERTIES ( 'odps.external.data.enable.extension'='true', -- Aktifkan dukungan ekstensi file 'odps.external.data.file.blacklist.regex'='.*\\.(txt|csv|parquet)$'); -- Blacklist: kecualikan txt, csv, parquet -- Dengan menjalankan SELECT * FROM test_blacklist_table, semua file TXT, CSV, dan Parquet difilter. -- Kueri mengembalikan data dari data2.json dan level2/data5.json -
Kombinasi daftar putih dan blacklist: baca file txt, kecualikan direktori level2
CREATE EXTERNAL TABLE test_whitelist_blacklist_table ( id INT, name STRING ) row format serde 'org.apache.hive.hcatalog.data.JsonSerDe' STORED as textfile LOCATION 'oss://xxx/bucket/level1' TBLPROPERTIES ( 'odps.external.data.enable.extension'='true', -- Aktifkan dukungan ekstensi file 'odps.external.data.file.whitelist.regex'='.*\\.txt', -- Daftar putih: hanya file txt 'odps.external.data.file.blacklist.regex'='.*level2/.*'); -- Blacklist: kecualikan direktori level2 -- Dengan menjalankan select * from test_whitelist_blacklist_table, -- Daftar putih memfilter file txt, lalu blacklist mengecualikan direktori level2 -- Kueri hanya mengembalikan data dari data1.txt -
Pencantuman rekursif: kontrol apakah akan membaca file di subdirektori
CREATE EXTERNAL TABLE test_recursive_enabled ( id INT, name STRING ) row format serde 'org.apache.hive.hcatalog.data.JsonSerDe' STORED as textfile LOCATION 'oss://xxx/bucket/level1' TBLPROPERTIES ( 'odps.external.data.enable.extension'='true', -- Aktifkan dukungan ekstensi file 'odps.external.data.file.whitelist.regex'='.*\\.json' -- Daftar putih: hanya file json 'odps.external.data.file.recursive.listing.enabled'='true'); -- Rekursif diaktifkan -- Dengan menjalankan SELECT * FROM test_recursive_enabled, semua file JSON dipilih. -- Kueri mengembalikan data dari data2.json dan level2/data5.json CREATE EXTERNAL TABLE test_recursive_disabled ( id INT, name STRING ) row format serde 'org.apache.hive.hcatalog.data.JsonSerDe' STORED as textfile LOCATION 'oss://xxx/bucket/level1' TBLPROPERTIES ( 'odps.external.data.enable.extension'='true', -- Aktifkan dukungan ekstensi file 'odps.external.data.file.whitelist.regex'='.*\\.json' -- Daftar putih: hanya file json 'odps.external.data.file.recursive.listing.enabled'='false' -- Rekursif dinonaktifkan ); -- Dengan menjalankan SELECT * FROM test_recursive_disabled, semua file JSON dipilih, tetapi pembacaan rekursif dinonaktifkan. -- Kueri hanya mengembalikan data dari data2.json (direktori level2 dikecualikan) -
Perbarui daftar putih dan blacklist melalui ALTER TABLE
CREATE EXTERNAL TABLE test_alter_table_properties ( id INT, name STRING ) row format serde 'org.apache.hive.hcatalog.data.JsonSerDe' STORED as textfile LOCATION 'oss://xxx/bucket/level1' TBLPROPERTIES ( 'odps.external.data.enable.extension'='true', -- Aktifkan dukungan ekstensi file 'odps.external.data.file.whitelist.regex'='.*\\.json'); -- Daftar putih: hanya file json -- Dengan menjalankan SELECT * FROM test_alter_table_properties, semua file JSON dipilih -- Kueri mengembalikan data dari data2.json dan level2/data5.json ALTER TABLE test_alter_table_properties SET tblproperties( 'odps.external.data.file.whitelist.regex'='.*level2/.*\\.json' ) -- Dengan menjalankan select * from test_alter_table_properties -- Kueri sekarang hanya mengembalikan data dari level2/data5.json
-
Baca data dari OSS
Catatan
-
Setelah membuat tabel eksternal OSS, Anda dapat membaca data dari OSS melalui tabel eksternal tersebut. Untuk jenis file data yang didukung dan sintaks pembuatan, lihat Sintaks.
-
Jika pernyataan SQL melibatkan tipe data kompleks, tambahkan
set odps.sql.type.system.odps2=true;dan kirimkan bersama. Versi tipe data. -
Untuk tabel eksternal OSS yang memetakan ke data open source, atur
set odps.sql.hive.compatible=true;pada tingkat sesi sebelum membaca data dari OSS. Jika tidak, kesalahan akan dilaporkan. -
OSS memiliki batas bandwidth. Jika trafik baca/tulis melebihi batas bandwidth instans dalam waktu singkat, performa tabel eksternal menurun. Batas dan metrik performa.
Sintaks
<select_statement> FROM <from_statement>;
-
select_statement: Klausul
SELECT, yang mengkueri data yang akan dimasukkan ke tabel target dari tabel sumber. -
from_statement: Klausul
FROM, yang menentukan sumber data, seperti nama tabel eksternal.
Data non-partisi
Data non-partisi
Setelah membuat tabel eksternal OSS non-partisi, Anda dapat membaca data dari OSS menggunakan salah satu metode berikut:
-
Metode 1 (Disarankan): Impor data format open source dari OSS ke tabel internal MaxCompute, lalu baca datanya.
Paling cocok untuk perhitungan berulang atau skenario berkinerja tinggi. Buat tabel internal dengan skema yang sama dengan tabel eksternal, impor datanya, lalu jalankan kueri kompleks. Penyimpanan internal mendapat manfaat dari optimasi MaxCompute. Perintah contoh:
CREATE TABLE <table_internal> LIKE <mc_oss_extable_name>; INSERT OVERWRITE TABLE <table_internal> SELECT * FROM <mc_oss_extable_name>; -
Metode 2: Baca data langsung dari OSS, mirip dengan operasi pada tabel internal MaxCompute.
Paling cocok untuk skenario berkinerja rendah. Setiap kueri membaca data langsung dari OSS, bukan dari penyimpanan internal.
Data partisi
Data partisi
MaxCompute melakukan pemindaian penuh terhadap semua data di direktori OSS, termasuk subdirektori. Untuk dataset besar, hal ini menyebabkan I/O yang tidak perlu dan meningkatkan waktu pemrosesan. Tersedia dua solusi.
-
Metode 1 (Disarankan): Simpan data di OSS menggunakan format path partisi standar atau format path partisi kustom.
Tentukan partisi dan oss_location dalam pernyataan pembuatan tabel. Path partisi standar disarankan.
-
Metode 2: Rencanakan beberapa path penyimpanan data.
Buat beberapa tabel eksternal, masing-masing mengarah ke subset data OSS. Metode ini rumit dan tidak disarankan.
Format path partisi standar
oss://<oss_endpoint>/<Bucket name>/<directory name>/<partitionKey1=value1>/<partitionKey2=value2>/...
Contoh: Perusahaan menyimpan file log harian dalam format CSV di OSS dan memproses datanya setiap hari menggunakan MaxCompute. Path partisi standar untuk menyimpan data OSS harus diatur sebagai berikut.
oss://oss-odps-test/log_data/year=2016/month=06/day=01/logfile
oss://oss-odps-test/log_data/year=2016/month=06/day=02/logfile
oss://oss-odps-test/log_data/year=2016/month=07/day=10/logfile
oss://oss-odps-test/log_data/year=2016/month=08/day=08/logfile
...
Format path partisi kustom
Format path partisi kustom hanya berisi nilai kolom partisi, bukan nama kolom partisi. Contoh:
oss://oss-odps-test/log_data_customized/2016/06/01/logfile
oss://oss-odps-test/log_data_customized/2016/06/02/logfile
oss://oss-odps-test/log_data_customized/2016/07/10/logfile
oss://oss-odps-test/log_data_customized/2016/08/08/logfile
...
Jika data OSS menggunakan path partisi non-standar, Anda dapat mengikat subdirektori ke partisi secara manual.
Setelah membuat tabel eksternal, gunakan alter table ... add partition ... location ... untuk mengikat subdirektori ke partisi. Contoh:
ALTER TABLE log_table_external ADD PARTITION (year = '2016', month = '06', day = '01')
location 'oss://oss-cn-hangzhou-internal.aliyuncs.com/bucket_name/oss-odps-test/log_data_customized/2016/06/01/';
ALTER TABLE log_table_external ADD PARTITION (year = '2016', month = '06', day = '02')
location 'oss://oss-cn-hangzhou-internal.aliyuncs.com/bucket_name/oss-odps-test/log_data_customized/2016/06/02/';
ALTER TABLE log_table_external ADD PARTITION (year = '2016', month = '07', day = '10')
location 'oss://oss-cn-hangzhou-internal.aliyuncs.com/bucket_name/oss-odps-test/log_data_customized/2016/07/10/';
ALTER TABLE log_table_external ADD PARTITION (year = '2016', month = '08', day = '08')
location 'oss://oss-cn-hangzhou-internal.aliyuncs.com/bucket_name/oss-odps-test/log_data_customized/2016/08/08/';
Optimasi kueri
Pengumpulan statistik dinamis
Pengumpulan statistik dinamis
Data eksternal tidak memiliki statistik yang telah ada sebelumnya, sehingga pengoptimal kueri menggunakan strategi konservatif dengan efisiensi rendah. Pengumpulan statistik dinamis memungkinkan pengoptimal mengumpulkan statistik tabel selama eksekusi kueri untuk mengidentifikasi tabel kecil, sehingga memungkinkan Hash Join, urutan join yang dioptimalkan, shuffle lebih sedikit, dan pipeline eksekusi lebih pendek.
Parameter berikut hanya berlaku untuk skenario tabel Hive di OSS (seperti Parquet, ORC, JSON, dan CSV), dan tidak berlaku untuk skenario tabel lake seperti tabel eksternal Paimon, tabel eksternal Hudi, atau tabel eksternal Delta Lake.
SET odps.meta.exttable.stats.onlinecollect=true;
SELECT * FROM <tablename>;
Uji performa
Dataset uji: Data TPC-DS
Skala uji: 100 GB
Sumber daya uji: 100 CU
Catatan: Karena skenario bisnis bervariasi, evaluasi lebih lanjut disarankan berdasarkan beban kerja spesifik Anda. Aktifkan flag secara selektif sesuai dengan SQL bisnis Anda.
-
Aktifkan Flag
SET odps.meta.exttable.stats.onlinecollect=true; -
Kesimpulan
-
Waktu eksekusi pekerjaan berkurang 22,75%, penggunaan CPU berkurang 21,72%, dan penggunaan memori berkurang 24%.
-
Q72 adalah kueri paling lambat, dengan waktu eksekusi berkurang 17,61%, CPU 20,82%, dan memori 20,86%.
-
Untuk TPCDS-Q72, kurangnya statistik pada tabel kecil menyebabkan degradasi rencana eksekusi yang signifikan; penambahan statistik meningkatkan performa hingga 5x. Q3, Q18, Q19, Q72, dan Q99 juga menunjukkan peningkatan signifikan.
-
Secara keseluruhan, mayoritas kueri mendapat manfaat besar. Sejumlah kecil kueri tidak menunjukkan peningkatan waktu end-to-end karena rencana eksekusinya tidak terpengaruh, dan hanya menimbulkan overhead tambahan dari pengumpulan statistik. Latensi tambahan yang diperkenalkan dalam fase Optimizer berkisar antara puluhan hingga ratusan milidetik, dengan dampak minimal pada waktu end-to-end.
-
-
Semua kueri
Waktu eksekusi pekerjaan berkurang 22,75%, penggunaan CPU berkurang 21,72%, dan penggunaan memori berkurang 24%.




-
Q72
Q72 adalah kueri paling lambat, dengan waktu eksekusi berkurang 17,61%, CPU 20,82%, dan memori 20,86%.



Optimasi split tabel eksternal
Optimasi split tabel eksternal
Atur ukuran split untuk mengontrol berapa banyak data yang diproses setiap tugas konkuren.
-
Jika volume data besar dan ukuran split terlalu kecil, split berlebihan menyebabkan paralelisme tinggi dan instans menghabiskan sebagian besar waktu menunggu sumber daya.
-
Jika volume data kecil dan ukuran split terlalu besar, split terlalu sedikit menyebabkan konkurensi tidak mencukupi dan sumber daya menganggur.
-- Anda dapat menggunakan salah satu parameter berikut.
-- Satuan: MiB. Nilai default: 256 MiB. Berlaku untuk tabel internal atau eksternal.
SET odps.stage.mapper.split.size=<value>;
SELECT * FROM <tablename>;
-- Satuan: MiB. Nilai default: 256 MiB. Hanya berlaku untuk tabel eksternal.
SET odps.sql.unstructured.data.split.size=<value>;
SELECT * FROM <tablename>;
Kontrol DOP
Kontrol paralelisme dengan DOP
Anda dapat mengatur parameter odps.sql.split.dop untuk menyesuaikan tingkat paralelisme saat membaca data. Parameter ini memiliki prioritas lebih tinggi daripada odps.sql.mapper.split.size.
-
Jika nilai dop lebih besar dari jumlah file di direktori OSS, konkurensi aktual mungkin berbeda signifikan dari nilai dop yang dikonfigurasi.
-
Jika nilai dop terlalu kecil, nilai tersebut tidak akan berlaku. Gunakan parameter
odps.input.file.num.limituntuk mengubah jumlah maksimum file yang dapat diproses oleh satu instans.
Sintaks
-- Sintaks untuk model dua tingkat: set odps.sql.split.dop={"project.table": xxx};
-- Sintaks untuk model tiga tingkat: set odps.sql.split.dop={"project.schema.table": xxx};
SET odps.sql.split.dop={
"project.schema.table1": xxx,
"project.schema.table2": yyy
};
SET odps.sql.common.table.planner.ext.hive.bridge=FALSE;
SELECT * FROM <your_table>;
Contoh penggunaan
Masalah dan solusi distorsi DOP akibat terlalu banyak file kecil
MaxCompute membatasi satu instans untuk memproses maksimal 240 file. Jika direktori tabel eksternal OSS berisi 3.449 file, tingkat paralelisme minimum akan menjadi 3.449 / 240 ≈ 15. Jika Anda mengatur DOP ke nilai kurang dari 15, pengaturan tersebut diabaikan.
Untuk mengatasi ini, atur odps.input.file.num.limit untuk mengubah jumlah maksimum file yang dapat diproses oleh satu instans.
SET odps.sql.split.dop = {"lakehouse47_3.tpch_1t_parquet_snappy.lineitem": 2};
SET odps.input.file.num.limit = 5000;
Satu instans dapat memproses hingga 5.000 file OSS. Karena jumlah file di tabel lineitem jauh di bawah batas ini, tingkat paralelisme aktual sesuai dengan nilai DOP yang dikonfigurasi.
Tulis data ke OSS
MaxCompute dapat menulis data dari tabel internal atau tabel eksternal yang telah diproses ke OSS. Untuk batasan, lihat Cakupan.
-
Tulis data ke OSS menggunakan parser data teks bawaan atau parser data open source: Parser teks bawaan, Parser open-source bawaan.
-
Tulis data ke OSS menggunakan parser kustom: Contoh: Buat tabel eksternal OSS menggunakan parser kustom.
-
Tulis data ke OSS menggunakan fitur unggah multi-bagian OSS: Tulis data ke OSS menggunakan fitur unggah multi-bagian OSS.
Sintaks
INSERT {INTO|OVERWRITE} TABLE <table_name> PARTITION (<ptcol_name>[, <ptcol_name> ...])
<select_statement> FROM <from_statement>;
|
Parameter |
Wajib |
Deskripsi |
|
table_name |
Ya |
Nama tabel eksternal yang akan ditulis. |
|
select_statement |
Ya |
Klausul |
|
from_statement |
Ya |
Klausul |
Untuk memasukkan data ke partisi dinamis, lihat Masukkan atau timpa data ke partisi dinamis.
Catatan
-
Jika operasi
INSERT OVERWRITE ... SELECT ... FROM ...;mengalokasikan 1.000 mapper pada tabel sumber from_tablename, 1.000 file TSV atau CSV akan dihasilkan. -
Anda dapat mengontrol jumlah file yang dihasilkan menggunakan konfigurasi yang disediakan oleh MaxCompute.
-
Jika outputter berada di mapper: Gunakan
odps.stage.mapper.split.sizeuntuk mengontrol jumlah mapper konkuren, yang menyesuaikan jumlah file yang dihasilkan. -
Jika outputter berada di reducer atau joiner: Gunakan
odps.stage.reducer.numdanodps.stage.joiner.nummasing-masing untuk menyesuaikan jumlah file yang dihasilkan.
-
-
Risiko penulisan tidak konsisten: Saat Anda menggunakan pernyataan INSERT OVERWRITE pada tabel eksternal OSS atau menggunakan perintah UNLOAD untuk mengekspor file ke OSS, data di subdirektori lokasi OSS yang ditentukan atau lokasi yang sesuai dengan partisi akan dihapus sebelum data baru ditulis. Jika direktori lokasi berisi data penting yang ditulis langsung ke OSS oleh mesin eksternal lain, data tersebut juga akan dihapus sebelum data baru ditulis. Oleh karena itu, Anda harus memastikan bahwa file yang ada di direktori lokasi tabel eksternal telah dibackup atau direktori UNLOAD kosong. Untuk risiko lain penulisan tidak konsisten, lihat Cakupan.
Tulis data ke OSS menggunakan fitur unggah multi-bagian OSS
Untuk menulis data ke OSS dalam format open source, buat tabel eksternal dengan parser data open source dan aktifkan fitur unggah multi-bagian OSS.
Untuk mengaktifkan fitur unggah multi-bagian OSS, atur berikut ini:
|
Skenario |
Perintah |
|
Atur di tingkat proyek |
Berlaku untuk seluruh proyek.
|
|
Atur di tingkat sesi |
Berlaku hanya untuk tugas saat ini.
|
Nilai default odps.sql.unstructured.oss.commit.mode adalah false. Kedua mode bekerja sebagai berikut:
|
Nilai |
Prinsip |
|
false |
Data disimpan dalam folder .odps di bawah direktori LOCATION, dengan file .meta untuk konsistensi data. Konten .odps hanya dapat diproses dengan benar oleh MaxCompute. Mesin lain mungkin gagal menguraikannya. |
|
true |
MaxCompute menggunakan fitur unggah multi-bagian agar kompatibel dengan mesin pemrosesan data lain. Ini menggunakan metode |
Kelola file yang diekspor
Parameter
Tambahkan awalan, akhiran, atau ekstensi ke file data output menggunakan parameter berikut.
|
property_name |
Skenario |
Deskripsi |
property_value |
Nilai default |
|
odps.external.data.output.prefix (Kompatibel dengan odps.external.data.prefix) |
Tambahkan properti ini saat Anda perlu menambahkan awalan kustom ke file output. |
|
Kombinasi karakter yang diizinkan, seperti 'mc_' |
Tidak ada |
|
odps.external.data.enable.extension |
Tambahkan properti ini saat Anda perlu menampilkan ekstensi file output. |
True menunjukkan bahwa ekstensi file output ditampilkan. False menunjukkan bahwa ekstensi tidak ditampilkan. |
|
False |
|
odps.external.data.output.suffix |
Tambahkan properti ini saat Anda perlu menambahkan akhiran kustom ke file output. |
Hanya berisi angka, huruf, dan garis bawah (a-z, A-Z, 0-9, _). |
Kombinasi karakter yang diizinkan, seperti '_hangzhou' |
Tidak ada |
|
odps.external.data.output.explicit.extension |
Tambahkan properti ini saat Anda perlu menambahkan ekstensi kustom ke file output. |
|
Kombinasi karakter yang diizinkan, seperti "jsonl" |
Tidak ada |
Contoh
Atur awalan kustom untuk file yang ditulis ke OSS menjadi
test06_. DDL-nya sebagai berikut:CREATE EXTERNAL TABLE <mc_oss_extable_name> ( vehicleId INT, recordId INT, patientId INT, calls INT, locationLatitute DOUBLE, locationLongitude DOUBLE, recordTime STRING, direction STRING ) ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe' WITH serdeproperties ( 'odps.properties.rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole' ) STORED AS textfile LOCATION 'oss://oss-cn-beijing-internal.aliyuncs.com/***/' TBLPROPERTIES ( -- Tambahkan awalan kustom. 'odps.external.data.output.prefix'='test06_') ; -- Tulis data ke tabel eksternal. INSERT INTO <mc_oss_extable_name> VALUES (1,32,76,1,63.32106,-92.08174,'9/14/2014 0:10','NW');Setelah menulis data, file yang dihasilkan di OSS diberi nama dengan awalan kustom
test06_, misalnya,test06_202509101.Untuk menyesuaikan akhiran file yang ditulis ke OSS menjadi
_beijing, DDL-nya sebagai berikut:CREATE EXTERNAL TABLE <mc_oss_extable_name> ( vehicleId INT, recordId INT, patientId INT, calls INT, locationLatitute DOUBLE, locationLongitude DOUBLE, recordTime STRING, direction STRING ) ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe' WITH serdeproperties ( 'odps.properties.rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole' ) STORED AS textfile LOCATION 'oss://oss-cn-beijing-internal.aliyuncs.com/***/' TBLPROPERTIES ( -- Tambahkan akhiran kustom. 'odps.external.data.output.suffix'='_beijing') ; -- Tulis data ke tabel eksternal. INSERT INTO <mc_oss_extable_name> VALUES (1,32,76,1,63.32106,-92.08174,'9/14/2014 0:10','NW');Untuk menghasilkan ekstensi file secara otomatis untuk file output, gunakan DDL berikut:
CREATE EXTERNAL TABLE <mc_oss_extable_name> ( vehicleId INT, recordId INT, patientId INT, calls INT, locationLatitute DOUBLE, locationLongitude DOUBLE, recordTime STRING, direction STRING ) ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe' WITH serdeproperties ( 'odps.properties.rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole' ) STORED AS textfile LOCATION 'oss://oss-cn-beijing-internal.aliyuncs.com/***/' TBLPROPERTIES ( -- Hasilkan ekstensi file secara otomatis. 'odps.external.data.enable.extension'='true') ; -- Tulis data ke tabel eksternal. INSERT INTO <mc_oss_extable_name> VALUES (1,32,76,1,63.32106,-92.08174,'9/14/2014 0:10','NW');Untuk menyesuaikan ekstensi file menjadi
jsonluntuk file yang ditulis ke OSS, DDL-nya sebagai berikut:CREATE EXTERNAL TABLE <mc_oss_extable_name> ( vehicleId INT, recordId INT, patientId INT, calls INT, locationLatitute DOUBLE, locationLongitude DOUBLE, recordTime STRING, direction STRING ) ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe' WITH serdeproperties ( 'odps.properties.rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole' ) STORED AS textfile LOCATION 'oss://oss-cn-beijing-internal.aliyuncs.com/***/' TBLPROPERTIES ( -- Tambahkan ekstensi file kustom. 'odps.external.data.output.explicit.extension'='jsonl') ; -- Tulis data ke tabel eksternal. INSERT INTO <mc_oss_extable_name> VALUES (1,32,76,1,63.32106,-92.08174,'9/14/2014 0:10','NW');Nama file yang dihasilkan adalah
20250905072538695g3mlopvxicr4_M1_1_0_0-0_TableSink1.jsonl, dengan ekstensi file kustom.jsonl.Untuk file yang ditulis ke OSS, atur awalan menjadi
mc_, akhiran menjadi_beijing, dan ekstensi file menjadijsonl. DDL-nya sebagai berikut:CREATE EXTERNAL TABLE <mc_oss_extable_name> ( vehicleId INT, recordId INT, patientId INT, calls INT, locationLatitute DOUBLE, locationLongitude DOUBLE, recordTime STRING, direction STRING ) ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe' WITH serdeproperties ( 'odps.properties.rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole' ) STORED AS textfile LOCATION 'oss://oss-cn-beijing-internal.aliyuncs.com/***/' TBLPROPERTIES ( -- Tambahkan awalan kustom. 'odps.external.data.output.prefix'='mc_', -- Tambahkan akhiran kustom. 'odps.external.data.output.suffix'='_beijing', -- Tambahkan ekstensi file kustom. 'odps.external.data.output.explicit.extension'='jsonl') ; -- Tulis data ke tabel eksternal. INSERT INTO <mc_oss_extable_name> VALUES (1,32,76,1,63.32106,-92.08174,'9/14/2014 0:10','NW');Nama file yang dihasilkan adalah
mc_20250905073013526gra1l214x6t6_M1_1_0_0-0_TableSink1_beijing.jsonl, di mana20250905073013526adalah timestamp yang dihasilkan sistem, dan bagian tengahnya adalah pengenal tugas.
Tulis file besar menggunakan partisi dinamis
Skenario bisnis
Ekspor hasil perhitungan dari tabel leluhur ke OSS sebagai partisi, menulisnya sebagai file besar (misalnya, 4 GB). Konfigurasikan parameter odps.adaptive.shuffle.desired.partition.size (dalam MB) dengan partisi dinamis.
-
Keuntungan: Anda dapat mengontrol ukuran file output yang diinginkan dengan mengonfigurasi nilai parameter.
-
Kerugian: Waktu eksekusi keseluruhan lebih lama karena menulis file besar mengurangi tingkat paralelisme, yang pada gilirannya meningkatkan waktu eksekusi.
Deskripsi metrik
-- service.mode harus dimatikan.
SET odps.service.mode=off;
-- Kemampuan partisi dinamis harus diaktifkan.
SET odps.sql.reshuffle.dynamicpt=true;
-- Atur konsumsi data yang diinginkan untuk setiap reducer. Asumsikan Anda ingin setiap file berukuran 4 GB.
SET odps.adaptive.shuffle.desired.partition.size=4096;
Contoh
Tulis file JSON sekitar 4 GB ke OSS.
-
Siapkan data uji. Gunakan tabel dataset publik
bigdata_public_dataset.tpcds_1t.web_sales, yang berukuran sekitar 30 GB. Data disimpan dalam format terkompresi di MaxCompute, sehingga ukurannya bertambah setelah diekspor. -
Buat tabel eksternal JSON.
-- Nama tabel contoh: json_ext_web_sales CREATE EXTERNAL TABLE json_ext_web_sales( c_int INT , c_string STRING ) PARTITIONED BY (pt STRING) ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe' WITH serdeproperties ( 'odps.properties.rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole' ) STORED AS textfile LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/oss-mc-test/demo-test/'; -
Tanpa mengatur parameter apa pun, tulis tabel uji ke tabel eksternal JSON dalam format partisi dinamis.
-- service.mode harus dimatikan. set odps.service.mode=off; -- Aktifkan switch sintaks Layer 3. SET odps.namespace.schema=true; -- Tulis ke tabel eksternal JSON dalam format partisi dinamis. INSERT OVERWRITE json_ext_web_sales PARTITION(pt) SELECT CAST(ws_item_sk AS INT) AS c_int, CAST(ws_bill_customer_sk AS string) AS c_string , COALESCE(CONCAT(ws_bill_addr_sk %2, '_', ws_promo_sk %3),'null_pt') AS pt FROM bigdata_public_dataset.tpcds_1t.web_sales;Dua file disimpan di OSS, dengan ukuran masing-masing 2,112 GB dan 2,102 GB.
-
Tambahkan parameter
odps.adaptive.shuffle.desired.partition.sizeuntuk output file besar dan tulis tabel uji ke tabel eksternal JSON dalam format partisi dinamis.-- service.mode harus dimatikan. SET odps.service.mode=off; -- Aktifkan switch sintaks Layer 3. SET odps.namespace.schema=true; -- Kemampuan partisi dinamis harus diaktifkan. SET odps.sql.reshuffle.dynamicpt=true; -- Atur konsumsi data yang diinginkan untuk setiap reducer. Asumsikan Anda ingin setiap file berukuran 4 GB. SET odps.adaptive.shuffle.desired.partition.size=4096; -- Tulis ke tabel eksternal JSON dalam format partisi dinamis. INSERT OVERWRITE json_ext_web_sales PARTITION(pt) SELECT CAST(ws_item_sk AS INT) AS c_int, CAST(ws_bill_customer_sk AS string) AS c_string , COALESCE(CONCAT(ws_bill_addr_sk %2, '_', ws_promo_sk %3),'null_pt') AS pt FROM bigdata_public_dataset.tpcds_1t.web_sales;File data tunggal yang dihasilkan berukuran sekitar 4,214 GB.
Operasi partisi pada tabel eksternal OSS
Tabel eksternal OSS mendukung operasi partisi. Operasi partisi pada tabel eksternal OSS dan Operasi partisi pada tabel internal. Tabel berikut mencantumkan operasi yang didukung.
|
Operasi |
Didukung |
|
Add partition |
|
|
Modify partition update time |
|
|
Modify partition value |
|
|
Merge partitions |
|
|
List partitions |
|
|
View partition information |
|
|
Drop partition |
|
|
Truncate partition |
|
Impor dari atau ekspor ke OSS
-
Perintah LOAD: Mengimpor data dari penyimpanan eksternal, seperti OSS, ke tabel atau partisi MaxCompute.
-
Perintah UNLOAD: Mengekspor data dari proyek MaxCompute ke penyimpanan eksternal, seperti OSS, untuk digunakan oleh mesin komputasi lain.
Lampiran: Siapkan data sampel
-
Siapkan direktori OSS
Informasi data sampel yang disediakan adalah sebagai berikut:
-
oss_endpoint:
oss-cn-hangzhou-internal.aliyuncs.com, yaitu China (Hangzhou). -
Nama bucket:
oss-mc-test. -
Nama direktori:
Demo1/,Demo2/,Demo3/, danSampleData/.
-
-
Data tabel non-partisi
File yang diunggah ke direktori
Demo1/adalah vehicle.csv, yang berisi data berikut. DirektoriDemo1/digunakan untuk memetakan ke tabel non-partisi yang dibuat dengan parser data teks bawaan.1,1,51,1,46.81006,-92.08174,9/14/2014 0:00,S 1,2,13,1,46.81006,-92.08174,9/14/2014 0:00,NE 1,3,48,1,46.81006,-92.08174,9/14/2014 0:00,NE 1,4,30,1,46.81006,-92.08174,9/14/2014 0:00,W 1,5,47,1,46.81006,-92.08174,9/14/2014 0:00,S 1,6,9,1,46.81006,-92.08174,9/15/2014 0:00,S 1,7,53,1,46.81006,-92.08174,9/15/2014 0:00,N 1,8,63,1,46.81006,-92.08174,9/15/2014 0:00,SW 1,9,4,1,46.81006,-92.08174,9/15/2014 0:00,NE 1,10,31,1,46.81006,-92.08174,9/15/2014 0:00,N -
Data tabel partisi
Direktori
Demo2/berisi lima subdirektori:direction=N/,direction=NE/,direction=S/,direction=SW/, dandirection=W/. File yang diunggah adalah vehicle1.csv, vehicle2.csv, vehicle3.csv, vehicle4.csv, dan vehicle5.csv, masing-masing. File-file ini berisi data berikut. DirektoriDemo2/digunakan untuk memetakan ke tabel partisi yang dibuat dengan parser data teks bawaan.--vehicle1.csv 1,7,53,1,46.81006,-92.08174,9/15/2014 0:00 1,10,31,1,46.81006,-92.08174,9/15/2014 0:00 --vehicle2.csv 1,2,13,1,46.81006,-92.08174,9/14/2014 0:00 1,3,48,1,46.81006,-92.08174,9/14/2014 0:00 1,9,4,1,46.81006,-92.08174,9/15/2014 0:00 --vehicle3.csv 1,6,9,1,46.81006,-92.08174,9/15/2014 0:00 1,5,47,1,46.81006,-92.08174,9/14/2014 0:00 1,6,9,1,46.81006,-92.08174,9/15/2014 0:00 --vehicle4.csv 1,8,63,1,46.81006,-92.08174,9/15/2014 0:00 --vehicle5.csv 1,4,30,1,46.81006,-92.08174,9/14/2014 0:00 -
Data terkompresi
File yang diunggah ke direktori
Demo3/adalah vehicle.csv.gz. File di dalam paket terkompresi adalah vehicle.csv, yang memiliki konten yang sama dengan file di direktoriDemo1/. File ini digunakan untuk memetakan ke tabel eksternal OSS dengan properti kompresi. -
Data parser kustom
File yang diunggah ke direktori
SampleData/adalah vehicle6.csv, yang berisi data berikut. DirektoriSampleData/digunakan untuk memetakan ke tabel eksternal OSS yang dibuat dengan parser data open source.1|1|51|1|46.81006|-92.08174|9/14/2014 0:00|S 1|2|13|1|46.81006|-92.08174|9/14/2014 0:00|NE 1|3|48|1|46.81006|-92.08174|9/14/2014 0:00|NE 1|4|30|1|46.81006|-92.08174|9/14/2014 0:00|W 1|5|47|1|46.81006|-92.08174|9/14/2014 0:00|S 1|6|9|1|46.81006|-92.08174|9/14/2014 0:00|S 1|7|53|1|46.81006|-92.08174|9/14/2014 0:00|N 1|8|63|1|46.81006|-92.08174|9/14/2014 0:00|SW 1|9|4|1|46.81006|-92.08174|9/14/2014 0:00|NE 1|10|31|1|46.81006|-92.08174|9/14/2014 0:00|N
FAQ tabel eksternal OSS
Bagaimana cara mengatasi kesalahan "Inline data exceeds the maximum allowed size" saat memproses data OSS menggunakan tabel eksternal?
-
Masalah
Saat memproses data OSS, kesalahan
Inline data exceeds the maximum allowed sizedilaporkan. -
Penyebab
OSS Store memiliki batas ukuran untuk setiap file kecil. Kesalahan dilaporkan jika file melebihi 3 GB.
-
Solusi
Atur dua properti berikut untuk mengontrol ukuran data yang ditulis setiap reducer ke tabel eksternal, menjaga file dalam batas 3 GB.
set odps.sql.mapper.split.size=256; # Menyesuaikan ukuran data yang dibaca setiap mapper, dalam MB. set odps.stage.reducer.num=100; # Menyesuaikan jumlah worker di tahap reduce.
Bagaimana cara mengatasi kesalahan overflow memori yang terjadi setelah saya mengunggah UDF untuk mengakses tabel eksternal OSS di MaxCompute, meskipun UDF tersebut lolos pengujian lokal?
-
Masalah
Saat mengakses tabel eksternal OSS di MaxCompute, UDF yang lolos pengujian lokal mengembalikan kesalahan berikut setelah diunggah.
FAILED: ODPS-0123131:User defined function exception - Traceback: java.lang.OutOfMemoryError: Java heap spaceSetelah mengatur parameter berikut, waktu eksekusi meningkat, tetapi kesalahan tetap terjadi.
set odps.stage.mapper.mem = 2048; set odps.stage.mapper.jvm.mem = 4096; -
Penyebab
Ada terlalu banyak file objek di tabel eksternal, yang menyebabkan penggunaan memori berlebihan, dan tidak ada partisi yang diatur.
-
Solusi
-
Gunakan jumlah data yang lebih kecil untuk kueri.
-
Partisi file objek untuk mengurangi penggunaan memori.
-
Bagaimana cara menggabungkan beberapa file kecil menjadi satu file menggunakan tabel eksternal OSS?
Periksa log Logview untuk melihat apakah tahap terakhir dalam rencana eksekusi SQL adalah reducer atau joiner.
-
Jika reducer, jalankan pernyataan
set odps.stage.reducer.num=1; -
Jika joiner, jalankan pernyataan
set odps.stage.joiner.num=1;
Bagaimana cara mengatasi kesalahan "Couldn't connect to server" saat membaca dari tabel eksternal OSS?
-
Masalah
Saat membaca data dari tabel eksternal OSS, kesalahan
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 serverdilaporkan. -
Penyebab
-
Penyebab 1: Saat tabel eksternal OSS dibuat, titik akhir publik digunakan untuk
oss_endpointdi alamat oss_location, bukan titik akhir internal. -
Penyebab 2: Saat tabel eksternal OSS dibuat, titik akhir wilayah lain digunakan untuk
oss_endpointdi alamat oss_location.
-
-
Solusi
-
Untuk Penyebab 1
Verifikasi bahwa
oss_endpointdi oss_location adalah titik akhir internal. Jika merupakan titik akhir publik, ubah menjadi titik akhir internal. Lihat Parameter.Misalnya, jika pengguna di wilayah Indonesia (Jakarta) menggunakan alamat
oss://oss-ap-southeast-5.aliyuncs.com/<bucket>/....untuk membuat tabel eksternal, alamat tersebut harus diubah menjadi alamat internal yang sesuaioss://oss-ap-southeast-5-internal.aliyuncs.com/<bucket>/..... -
Untuk Penyebab 2
Verifikasi bahwa
oss_endpointdi oss_location sesuai dengan wilayah yang ingin Anda akses. Nama domain jaringan klasik OSS tercantum di Wilayah dan titik akhir.
-
Bagaimana cara mengatasi kesalahan "Network is unreachable (connect failed)" saat membuat tabel eksternal OSS?
-
Masalah
Saat membuat tabel eksternal OSS, kesalahan
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)dilaporkan. -
Penyebab
Saat tabel eksternal OSS dibuat, titik akhir publik digunakan untuk
oss_endpointdi alamat oss_location, bukan titik akhir internal. -
Solusi
Verifikasi bahwa
oss_endpointdi oss_location adalah titik akhir internal. Jika merupakan titik akhir publik, ubah menjadi titik akhir internal. Lihat Parameter.Misalnya, jika pengguna di wilayah China (Beijing) menggunakan alamat
oss://oss-cn-beijing.aliyuncs.com/<bucket>/....untuk membuat tabel eksternal, alamat tersebut harus diubah menjadi alamat internal yang sesuaioss://oss-cn-beijing-internal.aliyuncs.com/<bucket>/.....
Bagaimana cara mengatasi eksekusi pekerjaan SQL yang lambat pada tabel eksternal OSS?
-
Pembacaan lambat file terkompresi GZ di tabel eksternal OSS
-
Gejala
Pengguna membuat tabel eksternal OSS dengan sumber data berupa file terkompresi 200 GB di OSS. Proses pembacaan data lambat.
-
Penyebab
Kecepatan pemrosesan SQL lambat karena terlalu sedikit mapper yang mengeksekusi komputasi di tahap map.
-
Solusi
-
Untuk data terstruktur, Anda dapat mengatur parameter berikut untuk menyesuaikan jumlah data yang dibaca satu mapper guna mempercepat eksekusi SQL.
set odps.sql.mapper.split.size=256; # Menyesuaikan ukuran data tabel yang dibaca setiap mapper, dalam MB. -
Untuk data tidak terstruktur, periksa apakah hanya ada satu file OSS di path tabel eksternal OSS. Jika hanya ada satu, hanya satu mapper yang dapat dihasilkan karena data tidak terstruktur dalam format terkompresi tidak dapat dibagi. Hal ini menyebabkan kecepatan pemrosesan lambat. Kami menyarankan Anda membagi file OSS besar menjadi file-file lebih kecil di path tabel eksternal yang sesuai di OSS. Hal ini meningkatkan jumlah mapper yang dihasilkan saat tabel eksternal dibaca dan meningkatkan kecepatan pembacaan.
-
-
-
Pencarian lambat data tabel eksternal MaxCompute menggunakan SDK
-
Gejala
Pencarian data tabel eksternal MaxCompute menggunakan SDK lambat.
-
Solusi
Tabel eksternal hanya mendukung pemindaian tabel penuh, yang lambat. Gunakan tabel internal MaxCompute sebagai gantinya.
-
Bagaimana cara mengatasi masalah di mana data lama dihapus tetapi data baru tidak ditulis saat menggunakan fitur unggah multi-bagian OSS?
-
Masalah
Dalam skenario
insert overwrite, jika pekerjaan gagal dalam kasus ekstrem, hasilnya mungkin tidak sesuai ekspektasi. Data lama dihapus, tetapi data baru tidak ditulis. -
Penyebab
Data baru gagal ditulis ke tabel target karena kemungkinan sangat kecil terjadi kegagalan perangkat keras atau kegagalan pembaruan metadata. Operasi penghapusan di OSS tidak mendukung rollback, sehingga data lama yang dihapus tidak dapat dipulihkan.
-
Solusi
-
Jika Anda menimpa tabel eksternal OSS berdasarkan data lamanya, misalnya,
insert overwrite table T select * from table T;, backup data OSS terlebih dahulu. Jika pekerjaan gagal, Anda dapat menimpa tabel eksternal OSS berdasarkan data lama yang telah dibackup. -
Jika pekerjaan
insert overwritedapat dikirim ulang, cukup kirim ulang pekerjaan jika gagal.
-
Solusi untuk kesalahan "table not found" saat mengakses tabel eksternal OSS dari Spark
-
Masalah
Saat menggunakan Spark untuk mengakses tabel eksternal OSS, tugas gagal dengan kesalahan "table not found".
-
Solusi
-
Tambahkan parameter berikut:
-
Aktifkan konfigurasi tabel eksternal:
spark.sql.catalog.odps.enableExternalTable=true; -
Konfigurasikan wilayah tempat OSS berada:
spark.hadoop.odps.oss.region.default=cn-<region>
-
-
Jika kesalahan tetap terjadi setelah menambahkan parameter di atas:
at java.lang.Thread.run(Thread.java:745) Caused by: java.lang.Exception: com.aliyun.odps.cupid.CupidException: connectionId and rolearn are mutually exclusive at com.aliyun.odps.cupid.table.v1.commontable.impl.reader.CupidCommonTableReadSession.splitTableBuat ulang tabel eksternal OSS, lalu akses kembali.
-
Referensi
-
Format tabel eksternal OSS yang didukung:
-
Buat tabel eksternal OSS dan baca dari atau tulis ke OSS menggunakan parser kustom: Parser kustom.
-
Uraikan file OSS menjadi dataset dengan skema yang mendukung penyaringan dan pemrosesan kolom: Fitur khusus: Schemaless Query.