All Products
Search
Document Center

MaxCompute:Tabel eksternal OSS

Last Updated:Oct 30, 2026

MaxCompute mendukung tabel eksternal OSS yang dipetakan ke direktori Object Storage Service (OSS). Gunakan tabel eksternal OSS 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. Anda harus melakukan Pemisahan pada file yang berukuran lebih besar dari 2 GB.

  • MaxCompute dan OSS harus berada di Wilayah yang sama.

  • Hindari penggunaan karakter khusus (seperti spasi) dalam nama direktori OSS karena dapat menyebabkan kegagalan operasi baca dan tulis selanjutnya.

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. Lihat Membuat bucket dan Mengelola 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 serta menjalankan UDF tersebut. Pembuatan direktori secara manual juga didukung.

    Karena MaxCompute hanya diterapkan di beberapa Wilayah, konektivitas jaringan lintas-Wilayah dapat menjadi masalah. Simpan bucket Anda di Wilayah yang sama dengan proyek MaxCompute Anda.
  • Otorisasi

    • Dapatkan izin untuk mengakses OSS. Akun Alibaba Cloud, RAM user, atau Peran RAM dapat mengakses tabel eksternal OSS. Lihat Otorisasi STS untuk OSS.

    • Dapatkan izin CreateTable di proyek MaxCompute Anda. Lihat Izin MaxCompute.

Deskripsi izin

  • Saat Anda mengakses tabel eksternal OSS, data diakses melalui peran yang ditentukan dalam parameter odps.properties.rolearn, terlepas dari apakah Anda menggunakan Akun Alibaba Cloud, RAM user, atau Peran RAM. Oleh karena itu, Anda harus membuat Peran RAM dan memberikannya izin untuk mengakses Bucket OSS target, lalu mengonfigurasi ARN peran tersebut dalam parameter odps.properties.rolearn. Untuk informasi selengkapnya, lihat Parameter.

  • Anda dapat mengotorisasi akses akun yang sama atau lintas-akun berdasarkan kebutuhan bisnis Anda. Sebaiknya gunakan kebijakan otorisasi kustom untuk Kontrol akses yang lebih detail halus. Untuk informasi selengkapnya, lihat Otorisasi untuk Sumber data eksternal.

Membuat tabel eksternal OSS

  • Tabel partisi dan tabel non-partisi:

    • Pilih berdasarkan cara penyimpanan file data Anda di OSS. Gunakan tabel partisi jika file berada di jalur terpartisi; 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 merupakan objek yang diarsipkan, Anda harus terlebih dahulu memulihkan objek tersebut.

Sintaks CREATE EXTERNAL TABLE bervariasi berdasarkan format file data. Sesuaikan sintaks dan parameter dengan format data Anda. Pengaturan yang salah akan menyebabkan kegagalan baca dan tulis.

Sintaks

Membuat tabel eksternal menggunakan parser data teks bawaan

Sintaks

Format file data

Contoh

CREATE EXTERNAL TABLE [IF NOT EXISTS] <mc_oss_extable_name> 
(
<col_name> <data_type>,
...
)
[comment <table_comment>]
[partitioned BY (<col_name> <data_type>, ...)] 
STORED BY '<StorageHandler>'  
WITH serdeproperties (
 ['<property_name>'='<property_value>',...]
) 
location '<oss_location>';

Format file data yang didukung untuk membaca dari atau menulis ke OSS:

  • CSV

  • TSV

  • File CSV dan TSV yang dikompresi dengan GZIP, SNAPPY, atau LZO

Membuat tabel eksternal menggunakan parser data open source bawaan

Sintaks

Format file data

Contoh

CREATE EXTERNAL TABLE [IF NOT EXISTS] <mc_oss_extable_name>
(
<col_name> <data_type>,
...
)
[comment <table_comment>]
[partitioned BY (<col_name> <data_type>, ...)]
[row format serde '<serde_class>'
  [WITH serdeproperties (
    ['<property_name>'='<property_value>',...])
  ]
]
STORED AS <file_format> 
location '<oss_location>' 
[USING '<resource_name>']
[tblproperties ('<tbproperty_name>'='<tbproperty_value>',...)];

Format file data yang didukung untuk membaca dari atau menulis ke OSS:

  • PARQUET

  • TEXTFILE

  • ORC

  • RCFILE

  • AVRO

  • JSON

  • SEQUENCEFILE

  • Hudi (hanya mendukung pembacaan data Hudi yang dihasilkan oleh DLF)

  • File PARQUET yang dikompresi dengan ZSTD, SNAPPY, atau GZIP

  • File ORC yang dikompresi dengan SNAPPY atau ZLIB

  • File TEXTFILE yang dikompresi dengan GZIP, SNAPPY, atau LZO

Membuat tabel eksternal menggunakan parser kustom

Sintaks

Format file data

Contoh

CREATE EXTERNAL TABLE [IF NOT EXISTS] <mc_oss_extable_name> 
(
<col_name> <date_type>,
...
)
[comment <table_comment>]
[partitioned BY (<col_name> <data_type>, ...)] 
STORED BY '<StorageHandler>' 
WITH serdeproperties (
 ['<property_name>'='<property_value>',...]
) 
location '<oss_location>' 
USING '<jar_name>';

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 dikonversi paksa ke kasus 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 terkait dalam file data OSS. Jika tidak, data tidak dapat dibaca.

    table_comment

    Tidak

    Komentar untuk tabel. Komentar harus berupa string valid dengan panjang tidak lebih dari 1.024 byte. Jika tidak, kesalahan akan dilaporkan.

    partitioned by (col_name data_type, ...)

    Tidak

    Jika file data di OSS disimpan dalam jalur terpartisi, 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

    Jalur OSS tempat file data berada. Secara default, semua file data di jalur ini akan dibaca.

    Formatnya adalah oss://<oss_endpoint>/<Nama Bucket>/<Nama direktori OSS>/.

    • 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 dalam Wilayah dan Titik akhir.

        Pastikan Wilayah OSS tempat file data disimpan sama dengan Wilayah proyek MaxCompute Anda. Jika berada di Wilayah yang berbeda, masalah konektivitas jaringan mungkin 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 cross-region dapat menyebabkan masalah konektivitas jaringan.
    • Nama Bucket: 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.

    • Nama Direktori: 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
  • Atribut WITH serdeproperties

    property_name

    Skenario

    property_value

    Nilai default

    odps.properties.rolearn

    Tambahkan properti ini saat menggunakan otorisasi STS.

    Tentukan ARN Peran RAM yang memiliki izin untuk mengakses OSS.

    Dapatkan ARN dari detail role di Konsol RAM. Contoh: acs:ram::xxxxxx:role/<role_name>.

    • Jika pemilik MaxCompute dan OSS adalah akun yang sama:

      • Jika Anda tidak menentukan odps.properties.rolearn dalam pernyataan pembuatan tabel, ARN role aliyunodpsdefaultrole akan digunakan secara default. Anda harus terlebih dahulu membuat ram role menggunakan otorisasi STS. Role AliyunODPSDefaultRole memiliki izin yang luas. Sebaiknya berikan izin melalui role kustom.

      • 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 role kustom. Untuk informasi selengkapnya, lihat Otorisasi STS untuk OSS (otorisasi kustom).

Whitelist dan blacklist

Tabel eksternal OSS MaxCompute mendukung pemfilteran whitelist dan blacklist. Dengan mengatur parameter whitelist dan blacklist di tblproperties, Anda dapat memfilter file mana yang akan dibaca dari sebuah direktori.

  • Parameter tblproperties

    Detail parameter tblproperties

    property_name

    Kasus penggunaan

    Catatan

    property_value

    Default

    odps.external.data.file.whitelist.regex

    Pemfilteran whitelist kustom

    Pola regex

    Pola regex untuk pencocokan file, mis., '.*\\.json'

    Tidak ada

    odps.external.data.file.blacklist.regex

    Pemfilteran blacklist kustom

    Pola regex

    Pola regex untuk pencocokan file, mis., '.*\\.txt'

    Tidak ada

    odps.external.data.file.recursive.listing.enabled

    Mengontrol pencarian file rekursif

    • True

    • False

    True

    odps.sql.unstructured.file.pattern.black.list(flag session yang ada)

    Pemfilteran blacklist tingkat sesi

    Pola regex

    Pola regex untuk pencocokan file, mis., '.*\\.json'

    Tidak ada

  • Aturan yang berlaku

    • Blacklist memiliki prioritas lebih tinggi daripada whitelist: jika sebuah file sesuai dengan kondisi blacklist apa pun, file tersebut akan dikecualikan.

    • Flag session dan parameter blacklist tblproperties memiliki hubungan "OR". Jika keduanya dikonfigurasi, keduanya akan berlaku—file yang sesuai dengan salah satu kondisi blacklist akan dikecualikan. Konfigurasi tblProperties disarankan.

      Metode konfigurasi

      Jenis jalur

      Parameter

      flag session

      Jalur absolut

      odps.sql.unstructured.file.pattern.black.list

      tblproperties

      Jalur relatif

      odps.external.data.file.blacklist.regex

  • Catatan regex

    • Anchor awal baris ^ dan akhir baris $ bersifat opsional. Misalnya, untuk mencocokkan file .json, .*\.json sudah cukup.

    • Hanya satu pola regex yang didukung. Untuk mengecualikan multiple jenis file, gunakan |:

      -- Mengecualikan file csv, txt, dan parquet
      "odps.external.data.file.blacklist.regex": ".*\\.(txt|csv|parquet)$" 
  • Memperbarui parameter whitelist 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

      -- Misalkan 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
    • Whitelist: hanya membaca 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', -- Mengaktifkan dukungan ekstensi file
        'odps.external.data.file.whitelist.regex'='.*\\.json'); -- Whitelist: 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: mengecualikan 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', -- Mengaktifkan dukungan ekstensi file
        'odps.external.data.file.blacklist.regex'='.*\\.(txt|csv|parquet)$'); -- Blacklist: mengecualikan 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 whitelist dan blacklist: membaca file txt, mengecualikan 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', -- Mengaktifkan dukungan ekstensi file
        'odps.external.data.file.whitelist.regex'='.*\\.txt', -- Whitelist: hanya file txt
        'odps.external.data.file.blacklist.regex'='.*level2/.*'); -- Blacklist: mengecualikan direktori level2
      
      -- Dengan menjalankan select * from test_whitelist_blacklist_table,
      -- Whitelist memfilter file txt, kemudian blacklist mengecualikan direktori level2
      -- Kueri hanya mengembalikan data dari data1.txt
    • Pencantuman rekursif: mengontrol 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', -- Mengaktifkan dukungan ekstensi file
        'odps.external.data.file.whitelist.regex'='.*\\.json' -- Whitelist: 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', -- Mengaktifkan dukungan ekstensi file
        'odps.external.data.file.whitelist.regex'='.*\\.json' -- Whitelist: 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)
    • Memperbarui whitelist 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', -- Mengaktifkan dukungan ekstensi file
        'odps.external.data.file.whitelist.regex'='.*\\.json'); -- Whitelist: 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

Membaca data dari OSS

Catatan

  • Setelah Anda 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; di awal dan kirimkan bersama-sama. Lihat Versi Tipe data.

  • Untuk tabel eksternal OSS yang dipetakan 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, kinerja tabel eksternal akan menurun. Lihat Batas dan metrik kinerja.

Sintaks

<select_statement> FROM <from_statement>;
  • select_statement: Klausa SELECT, yang melakukan kueri data yang akan dimasukkan ke dalam tabel target dari tabel sumber.

  • from_statement: Klausa FROM, yang menentukan Sumber data, seperti nama tabel eksternal.

Data non-partisi

Data non-partisi

Setelah Anda 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 data tersebut.

    Terbaik untuk perhitungan berulang atau skenario Berkinerja-tinggi. Buat Tabel internal dengan skema yang sama dengan tabel eksternal, impor data, lalu jalankan kueri kompleks. Penyimpanan internal memanfaatkan pengoptimalan MaxCompute. Contoh perintah:

    CREATE TABLE <table_internal> LIKE <mc_oss_extable_name>;
    INSERT OVERWRITE TABLE <table_internal> SELECT * FROM <mc_oss_extable_name>;
  • Metode 2: Membaca data langsung dari OSS, mirip dengan operasi pada Tabel internal MaxCompute.

    Terbaik untuk skenario kinerja rendah. Setiap kueri membaca data langsung dari OSS, bukan dari penyimpanan internal.

Data terpartisi

Data terpartisi

MaxCompute melakukan pemindaian tabel penuh terhadap semua data di direktori OSS, termasuk subdirektori. Untuk set data besar, hal ini menyebabkan I/O yang tidak perlu dan meningkatkan waktu pemrosesan. Dua solusi tersedia.

  • Metode 1 (Disarankan): Menyimpan data di OSS menggunakan format jalur terpartisi standar atau format jalur terpartisi kustom.

    Tentukan partisi dan oss_location dalam pernyataan pembuatan tabel. Jalur terpartisi standar disarankan.

  • Metode 2: Merencanakan multiple jalur penyimpanan data.

    Buat multiple tabel eksternal, masing-masing menunjuk ke subset data OSS. Metode ini rumit dan tidak disarankan.

Format jalur terpartisi standar

oss://<oss_endpoint>/<Nama Bucket>/<nama direktori>/<partitionKey1=value1>/<partitionKey2=value2>/...

Contoh: Sebuah perusahaan menyimpan file log harian dalam format CSV di OSS dan memproses data tersebut setiap hari menggunakan MaxCompute. Jalur terpartisi 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 jalur terpartisi kustom

Format jalur terpartisi 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 jalur terpartisi non-standar, Anda dapat meng-bind subdirektori ke partisi secara manual.

Setelah membuat tabel eksternal, gunakan alter table ... add partition ... location ... untuk meng-bind 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/';

Pengoptimalan kueri

Pengumpulan statistik dinamis

Pengumpulan statistik dinamis

Data eksternal tidak memiliki statistik yang sudah 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, memungkinkan Hash Join, urutan join yang dioptimalkan, shuffle yang lebih sedikit, dan pipeline eksekusi yang 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 kinerja

Set data 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 menurun sebesar 22,75%, Penggunaan CPU menurun sebesar 21,72%, dan Penggunaan memori menurun sebesar 24%.

    • Q72 adalah kueri terlambat, dengan waktu eksekusi Pekerjaan berkurang sebesar 17,61%, CPU sebesar 20,82%, dan memori sebesar 20,86%.

    • Untuk TPCDS-Q72, statistik yang hilang pada tabel kecil menyebabkan degradasi rencana eksekusi yang signifikan; penambahan statistik meningkatkan kinerja hingga 5x. Q3, Q18, Q19, Q72, dan Q99 juga menunjukkan peningkatan yang nyata.

    • Secara keseluruhan, sebagian besar kueri mendapat manfaat yang cukup besar. Sejumlah kecil kueri tidak mengalami peningkatan dalam waktu end-to-end karena rencana eksekusinya tidak terpengaruh, dan hanya menanggung overhead tambahan dari pengumpulan statistik. Latensi ekstra yang diperkenalkan dalam fase Pengoptimal berkisar dari puluhan hingga ratusan milidetik, dengan dampak minimal pada waktu end-to-end.

  • Semua kueri

    Waktu eksekusi Pekerjaan menurun sebesar 22,75%, Penggunaan CPU menurun sebesar 21,72%, dan Penggunaan memori menurun sebesar 24%.

    image

    imageimageimage

  • Q72

    Q72 merupakan kueri paling lambat, dengan penurunan waktu proses pekerjaan sebesar 17,61%, CPU 20,82%, dan memori 20,86%.

    image.pngimageimage

Pengoptimalan Pemisahan tabel eksternal

Pengoptimalan Pemisahan tabel eksternal

Sesuaikan ukuran Pemisahan untuk mengontrol berapa banyak data yang diproses oleh setiap task konkurensi.

  • Jika volume data besar dan ukuran Pemisahan terlalu kecil, Pemisahan yang berlebihan menyebabkan tingkat paralelisme tinggi dan Instans menghabiskan sebagian besar waktu menunggu Sumber daya.

  • Jika volume data kecil dan ukuran Pemisahan terlalu besar, Pemisahan yang terlalu sedikit menyebabkan konkurensi tidak memadai 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

Mengontrol tingkat 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 secara signifikan dari nilai dop yang dikonfigurasi.

  • Jika nilai dop terlalu kecil, pengaturan tersebut tidak akan berlaku. Gunakan parameter odps.input.file.num.limit untuk 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 untuk distorsi DOP yang disebabkan oleh 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 adalah 3.449 / 240 ≈ 15. Jika Anda mengatur DOP ke nilai kurang dari 15, pengaturan tersebut akan diabaikan.

Untuk mengatasi hal 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 dalam tabel lineitem jauh di bawah batas ini, tingkat paralelisme aktual sesuai dengan nilai DOP yang dikonfigurasi.

Menulis data ke OSS

MaxCompute dapat menulis data dari tabel internal atau tabel eksternal yang telah diproses ke OSS. Untuk batasan, lihat Cakupan.

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 tujuan penulisan.

select_statement

Ya

Klausa SELECT, yang melakukan kueri data yang akan dimasukkan ke dalam tabel target dari tabel sumber. Jika tabel target hanya memiliki satu tingkat partisi dinamis, nilai bidang terakhir dalam klausa SELECT adalah nilai partisi dinamis tabel target. Hubungan antara nilai dari SELECT tabel sumber dan nilai partisi output ditentukan oleh urutan bidang, bukan oleh nama kolom. Jika urutan bidang tabel sumber berbeda dengan tabel target, tentukan bidang dalam select_statement sesuai urutan tabel target.

from_statement

Ya

Klausa FROM, yang menunjukkan Sumber data. Misalnya, nama Tabel internal yang akan dibaca.

Untuk memasukkan data ke dalam partisi dinamis, lihat Memasukkan atau menimpa data di partisi dinamis.

Catatan

  • Jika operasi INSERT OVERWRITE ... SELECT ... FROM ...; mengalokasikan 1.000 mapper pada tabel sumber from_tablename, maka 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.size untuk mengontrol jumlah mapper konkuren, yang menyesuaikan jumlah file yang dihasilkan.

    • Jika outputter berada di reducer atau joiner: Gunakan odps.stage.reducer.num dan odps.stage.joiner.num masing-masing untuk menyesuaikan jumlah file yang dihasilkan.

  • Risiko penulisan yang 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 dicadangkan atau direktori UNLOAD kosong. Untuk risiko penulisan yang tidak konsisten lainnya, lihat Cakupan.

Menulis 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

Diatur pada tingkat proyek

Berlaku untuk seluruh proyek.

setproject odps.sql.unstructured.oss.commit.mode =true;

Diatur pada tingkat sesi

Hanya berlaku untuk task saat ini.

set odps.sql.unstructured.oss.commit.mode =true;

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 mengurainya.

true

MaxCompute menggunakan fitur unggah multi-bagian agar kompatibel dengan mesin pemrosesan data lainnya. Ini menggunakan metode two-phase commit untuk memastikan Konsistensi data, dan tidak akan ada direktori .odps atau file .meta.

Mengelola 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.

  • Hanya berisi angka, huruf, dan garis bawah (a-z, A-Z, 0-9, _).

  • Panjang antara 1 hingga 10 karakter.

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.

  • True

  • False

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.

  • Hanya berisi angka, huruf, dan garis bawah (a-z, A-Z, 0-9, _).

  • Panjang antara 1 hingga 10 karakter.

  • Memiliki prioritas lebih tinggi daripada parameter odps.external.data.enable.extension.

Kombinasi karakter yang diizinkan, seperti "jsonl"

Tidak ada

Contoh

  1. Mengatur awalan kustom untuk file yang ditulis ke OSS menjadi test06_. DDL-nya adalah 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 (
    -- Menambahkan awalan kustom.
        'odps.external.data.output.prefix'='test06_') 
    ;
    
    -- Menulis 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 dinamai dengan awalan kustom test06_, misalnya, test06_202509101.

  2. Untuk menyesuaikan akhiran file yang ditulis ke OSS menjadi _beijing, DDL-nya adalah 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 (
    -- Menambahkan akhiran kustom.
        'odps.external.data.output.suffix'='_beijing') 
    ;
    
    -- Menulis 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');
  3. Untuk menghasilkan ekstensi file secara otomatis bagi 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 (
    -- Menghasilkan ekstensi file secara otomatis.
        'odps.external.data.enable.extension'='true') 
    ;
    
    -- Menulis 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');
  4. Untuk menyesuaikan ekstensi file menjadi jsonl bagi file yang ditulis ke OSS, DDL-nya adalah 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 (
    -- Menambahkan ekstensi file kustom.
       'odps.external.data.output.explicit.extension'='jsonl') 
    ;
    
    -- Menulis 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.

  5. Untuk file yang ditulis ke OSS, atur awalan menjadi mc_, akhiran menjadi _beijing, dan ekstensi file menjadi jsonl. DDL-nya adalah 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 (
        -- Menambahkan awalan kustom.
        'odps.external.data.output.prefix'='mc_', 
        -- Menambahkan akhiran kustom.
        'odps.external.data.output.suffix'='_beijing', 
        -- Menambahkan ekstensi file kustom.
        'odps.external.data.output.explicit.extension'='jsonl') 
    ;  
    
    -- Menulis 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 mana 20250905073013526 adalah stempel waktu yang dihasilkan sistem, dan bagian tengah adalah pengidentifikasi task.

Menulis file besar menggunakan partisi dinamis

Skenario bisnis

Mengekspor 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.

  • Kekurangan: 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. Misalkan Anda ingin setiap file berukuran 4 GB.
SET odps.adaptive.shuffle.desired.partition.size=4096;	

Contoh

Menulis file JSON sekitar 4 GB ke OSS.

  1. 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.

  2. Buat tabel eksternal JSON.

    -- Contoh nama tabel: 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/';
  3. 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 sakelar sintaks Lapisan 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.

  4. Tambahkan parameter odps.adaptive.shuffle.desired.partition.size untuk 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 sakelar sintaks Lapisan 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. Misalkan 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. Lihat Operasi partisi pada tabel eksternal OSS dan Operasi partisi pada tabel internal. Tabel berikut mencantumkan operasi yang didukung.

Operasi

Didukung

Menambah partisi

Ya

Mengubah waktu pembaruan partisi

Ya

Mengubah nilai partisi

Tidak

Menggabungkan partisi

Tidak

Mencantumkan partisi

Ya

Melihat informasi partisi

Ya

Menghapus partisi

Ya

Memotong partisi

Tidak

Mengimpor dari atau mengekspor ke OSS

  • Perintah LOAD: Mengimpor data dari penyimpanan eksternal, seperti OSS, ke dalam tabel atau partisi MaxCompute.

  • Perintah UNLOAD: Mengekspor data dari proyek MaxCompute ke penyimpanan eksternal, seperti OSS, untuk digunakan oleh Mesin komputasi lainnya.

Lampiran: Menyiapkan data sampel

  1. Menyiapkan 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/, dan SampleData/.

  2. Data tabel non-partisi

    File yang diunggah ke direktori Demo1/ adalah vehicle.csv, yang berisi data berikut. Direktori Demo1/ 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
  3. Data tabel terpartisi

    Direktori Demo2/ berisi lima subdirektori: direction=N/, direction=NE/, direction=S/, direction=SW/, dan direction=W/. File yang diunggah masing-masing adalah vehicle1.csv, vehicle2.csv, vehicle3.csv, vehicle4.csv, dan vehicle5.csv. File-file ini berisi data berikut. Direktori Demo2/ 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
  4. Data terkompresi

    File yang diunggah ke direktori Demo3/ adalah vehicle.csv.gz. File di dalam paket terkompresi adalah vehicle.csv, yang memiliki konten sama dengan file di direktori Demo1/. Ini digunakan untuk memetakan ke tabel eksternal OSS dengan properti kompresi.

  5. Data parser kustom

    File yang diunggah ke direktori SampleData/ adalah vehicle6.csv, yang berisi data berikut. Direktori SampleData/ 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 size dilaporkan.

  • Penyebab

    OSS Store memiliki batas ukuran untuk setiap file kecil. Kesalahan dilaporkan jika file melebihi 3 GB.

  • Solusi

    Sesuaikan dua properti berikut untuk mengontrol ukuran data yang ditulis setiap reducer ke tabel eksternal, menjaga file tetap dalam batas 3 GB.

    set odps.sql.mapper.split.size=256; # Menyesuaikan ukuran data yang dibaca oleh 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 lulus uji lokal?

  • Masalah

    Saat mengakses tabel eksternal OSS di MaxCompute, UDF yang lulus uji lokal mengembalikan kesalahan berikut setelah diunggah.

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

    Setelah mengatur parameter berikut, waktu eksekusi meningkat, tetapi kesalahan tetap ada.

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

    Terlalu banyak file objek dalam tabel eksternal, yang menyebabkan Penggunaan memori berlebihan, dan tidak ada partisi yang diatur.

  • Solusi

    • Gunakan jumlah data yang lebih kecil untuk kueri.

    • Partisikan file objek untuk mengurangi Penggunaan memori.

Bagaimana cara menggabungkan multiple 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 server dilaporkan.

  • Penyebab

    • Penyebab 1: Saat tabel eksternal OSS dibuat, Titik akhir publik digunakan untuk oss_endpoint dalam alamat oss_location, bukan Titik akhir internal.

    • Penyebab 2: Saat tabel eksternal OSS dibuat, Titik akhir Wilayah lain digunakan untuk oss_endpoint dalam alamat oss_location.

  • Solusi

    • Untuk Penyebab 1

      Verifikasi bahwa oss_endpoint dalam oss_location adalah Titik akhir internal. Jika itu adalah 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 sesuai oss://oss-ap-southeast-5-internal.aliyuncs.com/<bucket>/.....

    • Untuk Penyebab 2

      Verifikasi bahwa oss_endpoint dalam oss_location sesuai dengan Wilayah yang ingin Anda akses. Nama domain jaringan klasik OSS tercantum dalam 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_endpoint dalam alamat oss_location, bukan Titik akhir internal.

  • Solusi

    Verifikasi bahwa oss_endpoint dalam oss_location adalah Titik akhir internal. Jika itu adalah 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 sesuai oss://oss-cn-beijing-internal.aliyuncs.com/<bucket>/.....

Bagaimana cara mengatasi eksekusi Pekerjaan SQL yang lambat pada tabel eksternal OSS?

  • Pembacaan file terkompresi GZ yang lambat di tabel eksternal OSS

    • Gejala

      Seorang pengguna membuat tabel eksternal OSS dengan Sumber data berupa file terkompresi GZ berukuran 200 GB di OSS. Proses pembacaan data berjalan lambat.

    • Penyebab

      Kecepatan pemrosesan SQL lambat karena terlalu sedikit mapper yang menjalankan komputasi di tahap map.

    • Solusi

      • Untuk data terstruktur, Anda dapat mengatur parameter berikut untuk menyesuaikan jumlah data yang dibaca oleh satu mapper guna mempercepat eksekusi SQL.

        set odps.sql.mapper.split.size=256; # Menyesuaikan ukuran data tabel yang dibaca oleh setiap mapper, dalam MB.       
      • Untuk data tidak terstruktur, periksa apakah hanya ada satu file OSS di jalur tabel eksternal OSS. Jika hanya ada satu, hanya satu mapper yang dapat dihasilkan karena data tidak terstruktur dalam format terkompresi tidak dapat dipisah. Hal ini mengakibatkan kecepatan pemrosesan yang lambat. Sebaiknya pisahkan file OSS besar menjadi file-file yang lebih kecil di jalur tabel eksternal terkait di OSS. Ini meningkatkan jumlah mapper yang dihasilkan saat tabel eksternal dibaca dan meningkatkan kecepatan pembacaan.

  • Pencarian data tabel eksternal MaxCompute yang lambat menggunakan SDK

    • Gejala

      Mencari data tabel eksternal MaxCompute menggunakan SDK berjalan lambat.

    • Solusi

      Tabel eksternal hanya mendukung pemindaian tabel penuh, yang berjalan lambat. Gunakan Tabel internal MaxCompute sebagai gantinya.

Bagaimana cara mengatasi masalah di mana data lama terhapus tetapi data baru tidak tertulis saat menggunakan fitur unggah multi-bagian OSS?

  • Masalah

    Dalam skenario insert overwrite, jika Pekerjaan gagal dalam kasus ekstrem, hasilnya mungkin tidak sesuai dengan harapan. Data lama terhapus, tetapi data baru tidak tertulis.

  • Penyebab

    Data yang baru ditulis gagal ditulis ke tabel target karena probabilitas yang sangat rendah dari kegagalan perangkat keras atau kegagalan pembaruan metadata. Operasi penghapusan di OSS tidak mendukung rollback, sehingga data lama yang terhapus tidak dapat dipulihkan.

  • Solusi

    • Jika Anda menimpa tabel eksternal OSS berdasarkan data lamanya, misalnya, insert overwrite table T select * from table T;, cadangkan data OSS terlebih dahulu. Jika Pekerjaan gagal, Anda kemudian dapat menimpa tabel eksternal OSS berdasarkan data lama yang telah dicadangkan.

    • Jika Pekerjaan insert overwrite dapat dikirim ulang, cukup kirim ulang Pekerjaan tersebut jika gagal.

Solusi untuk kesalahan "table not found" saat mengakses tabel eksternal OSS dari Spark

  • Masalah

    Saat menggunakan Spark untuk mengakses tabel eksternal OSS, task 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 ada setelah Anda 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.splitTable

      Buat ulang tabel eksternal OSS lalu akses kembali.

Kesalahan saat membaca dari atau menulis ke tabel eksternal OSS: Failed to connect Http service: http://***.oss-cn-shanghai-internal.aliyuncs.com.***

  • Detail kesalahan

    Detail kesalahan

    ODPS-0123131: Fuxi job failed - Common table io jni exception - ExceptionType: java.lang.reflect.InvocationTargetException
    Message: null
    StackTrace:
    java.lang.reflect.InvocationTargetException
    	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    	at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    	at com.aliyun.odps.CommonReaderFactory.lambda$create$0(CommonReaderFactory.java:65)
    	at com.aliyun.odps.utils.ClassLoaderSwitcher.executeActionOnSpecifiedClassLoader(ClassLoaderSwitcher.java:30)
    	at com.aliyun.odps.CommonReaderFactory.create(CommonReaderFactory.java:42)
    	at com.aliyun.odps.CommonReaderFactory.create(CommonReaderFactory.java:28)
    Caused by: com.aliyun.odps.exception.CommonTableUserException: ODPS-0123131:User defined function exception - ODPS-0123131:User defined function exception - java.io.IOException: ErrorCode : 2001, ErrorMessage : Failed to connect Http service: http://***.oss-cn-shanghai-internal.aliyuncs.com/***?objectMeta [RequestId]: 
    	at com.aliyun.odps.vectorized.VectorizedMetrics.runAndCollectTimeElapsedMetric(VectorizedMetrics.java:49)
    	at com.aliyun.odps.vectorized.VectorizedReaderWrapper.setupVectorizedReader(VectorizedReaderWrapper.java:90)
    	at com.aliyun.odps.vectorized.VectorizedReaderWrapper.<init>(VectorizedReaderWrapper.java:69)
    	... 8 more
  • Penyebab dan solusi

    1. Penyebab 1: Periksa apakah Pekerjaan tabel eksternal menggunakan UDF untuk mengakses Titik akhir internal OSS. Jika ya, bangun konektivitas jaringan menggunakan salah satu opsi berikut. Jika tidak, Pekerjaan mungkin gagal secara berkala.

      1. Opsi 1 (disarankan): Menggunakan koneksi jaringan untuk mengakses Sumber daya VPC.

      2. Opsi 2: Menambahkan Titik akhir internal OSS ke daftar putih.

    2. Penyebab 2: Periksa apakah tabel eksternal OSS termasuk salah satu jenis berikut. Jika ya, bangun konektivitas jaringan menggunakan opsi yang tercantum di bawah Penyebab 1.

      Tabel eksternal Lance, tabel eksternal Hudi, tabel eksternal Delta Lake, atau tabel eksternal yang menggunakan parser kustom.

    3. Penyebab 3: Pada halaman Json Summary di Logview, periksa apakah parameter odps.isolation.session.enable diatur ke true. Jika ya, bangun konektivitas jaringan menggunakan opsi yang tercantum di bawah Penyebab 1.

ODPS-0010000:System internal error

  • Detail kesalahan

    ODPS-0010000:System internal error - 
    ActionHandler job failed with failinfo	storage service worker error occured: 
    common/io/oss/oss_file_system_cppsdk.cpp(919): 
    OSSRequestException: Status: -50, RequestId: , 
    ErrorCode: ClientError:-50, Message: E_HTTP_ERROR_CONN_REFUSED
  • Penyebab

    Titik akhir OSS publik digunakan saat tabel eksternal OSS dibuat.

  • Solusi

    Saat membuat tabel eksternal OSS, parameter location dengan oss_endpoint harus berupa Titik akhir internal. Untuk informasi tentang mendapatkan Titik akhir, lihat Parameter. Jika kesalahan tetap ada setelah beralih ke Titik akhir internal, kirimkan Tiket ke tim dukungan teknis MaxCompute untuk mendapatkan bantuan.

Referensi