Gunakan pernyataan SELECT INTO OUTFILE untuk mengekspor hasil kueri dari ApsaraDB for SelectDB ke penyimpanan remote—Object Storage Service (OSS) atau Hadoop Distributed File System (HDFS)—guna pencadangan atau migrasi data.
Cara kerja
Tulis kueri
SELECTuntuk menentukan data yang akan diekspor.Tentukan jalur tujuan di OSS atau HDFS serta atur format dan properti output.
Jalankan pernyataan tersebut. SelectDB mengeksekusi kueri dan menulis hasilnya ke tujuan dalam satu operasi sinkron.
Periksa baris yang dikembalikan untuk memverifikasi jumlah file, jumlah baris, dan ukuran file sebagai konfirmasi keberhasilan.
Catatan penggunaan
Eksekusi sinkron dan integritas hasil
SELECT INTO OUTFILE bersifat sinkron. Pernyataan hanya mengembalikan respons setelah ekspor selesai—atau gagal. Jika koneksi terputus selama ekspor, tidak ada status yang dikembalikan dan Anda tidak dapat memastikan apakah ekspor telah selesai.
Untuk mengonfirmasi keberhasilan ekspor secara andal, tambahkan "success_file_name" = "SUCCESS" ke klausa PROPERTIES. Saat ekspor berhasil, SelectDB menulis file penanda bernama SUCCESS ke direktori output.
Eksekusi single-threaded
Secara default, ekspor menggunakan satu thread pada satu node BE. Durasi ekspor sama dengan waktu eksekusi kueri ditambah waktu penulisan set hasil:
Durasi total = Waktu eksekusi kueri + Waktu penulisan hasilUntuk dataset besar, perpanjang timeout sebelum menjalankan ekspor:
SET query_timeout = <seconds>;Untuk detail tentang variabel sesi, lihat Variable management.
Jalur file dan perilaku overwrite
SELECT INTO OUTFILE tidak memeriksa apakah jalur tujuan atau file sudah ada. Pernyataan ini tidak membuat jalur secara otomatis atau menimpa file yang sudah ada. Pembuatan jalur dan perilaku overwrite dikendalikan oleh sistem penyimpanan remote (OSS atau HDFS).
Tanggung jawab manajemen file
SelectDB tidak mengelola file yang diekspor. Bersihkan file output dari pekerjaan yang berhasil dan file sisa dari pekerjaan yang gagal langsung di sistem penyimpanan Anda.
Format file yang didukung
| Tipe data | Format yang didukung |
|---|---|
| Tipe dasar | CSV, CSV_WITH_NAMES, CSV_WITH_NAMES_AND_TYPES, Parquet, ORC (Optimized Row Columnar) |
| Tipe kompleks (ARRAY, MAP, STRUCT) | CSV, CSV_WITH_NAMES, CSV_WITH_NAMES_AND_TYPES, ORC |
| Data bersarang | Tidak didukung |
Nilai output khusus
Fungsi BITMAP dan HyperLogLog (HLL): Jika output berisi karakter tak terlihat,
\Ndikembalikan sebagai gantinya (menunjukkan null).Fungsi geospasial: Output berupa biner terenkripsi. Gunakan
ST_AsTextuntuk mendapatkan teks yang dapat dibaca. Fungsi yang terpengaruh:ST_CIRCLE,ST_POINT,ST_POLYGON,ST_GEOMETRYFROMTEXT,ST_LINEFROMTEXT,ST_GEOMETRYFROMWKB.
Perilaku file hasil
Set hasil kosong tetap menghasilkan file output.
File segmen selalu berisi baris lengkap, sehingga ukuran file aktual mungkin sedikit berbeda dari
max_file_size.
Batasan
SELECT INTO OUTFILE hanya mendukung protokol Amazon Simple Storage Service (Amazon S3) dan protokol HDFS.
Sintaks
query_stmt
INTO OUTFILE "file_path"
[FORMAT AS format_name]
[PROPERTIES ("key"="value", ...)]Parameter
| Parameter | Wajib | Deskripsi |
|---|---|---|
query_stmt | Ya | Pernyataan SELECT yang menentukan data yang akan diekspor. |
file_path | Ya | Jalur tujuan dan awalan nama file opsional. Abaikan awalan untuk hanya menggunakan direktori, misalnya "hdfs://path/to/". |
FORMAT AS | Tidak | Format output. Opsi: CSV (default), CSV_WITH_NAMES, CSV_WITH_NAMES_AND_TYPES, PARQUET, ORC. |
PROPERTIES | Tidak | Properti file, HDFS, atau S3. Lihat File properties, HDFS properties, dan S3 properties. |
Pemberian nama file
Ketika file_path mencakup awalan (misalnya "s3://bucket_name/to/my_file_"), file output diberi nama mengikuti pola berikut:
<awalan><nama-instans>_<urutan>.csvNomor urutan dimulai dari
0dan bertambah untuk setiap file segmen.Untuk satu file output, nomor urutan dihilangkan.
Ekstensi default adalah
.csv. Ganti denganfile_suffix.
Contoh: Dengan awalan my_file_ dan FORMAT AS CSV, ekspor multi-file menghasilkan:
my_file_abcdefg_0.csv
my_file_abcdefg_1.csv
my_file_abcdefg_2.csv
...Properti file
| Properti | Wajib | Deskripsi |
|---|---|---|
column_separator | Tidak | Pemisah kolom. Hanya berlaku untuk format CSV. |
line_delimiter | Tidak | Pemisah baris. Hanya berlaku untuk format CSV. |
max_file_size | Tidak | Ukuran maksimum per file segmen. Rentang valid: 5 MB–2 GB. Default: 1 GB. Untuk file ORC, ukuran aktual adalah ceil(max_file_size / 64) × 64 MB. |
delete_existing_files | Tidak | Apakah akan menghapus semua file di direktori tujuan sebelum mengekspor. false (default): ekspor tanpa menghapus file yang ada. true: hapus semua file dan subdirektori di direktori tujuan terlebih dahulu. |
success_file_name | Tidak | Nama file penanda yang ditulis ke direktori tujuan setelah ekspor berhasil, misalnya "SUCCESS". Gunakan ini untuk mengonfirmasi penyelesaian ekspor ketika koneksi mungkin terputus. |
file_suffix | Tidak | Ekstensi file untuk file output. Menggantikan ekstensi default. |
delete_existing_files = true menghapus data secara permanen. Gunakan pengaturan ini hanya di lingkungan pengujian. Untuk mengaktifkannya, ajukan tiket ke dukungan teknis Alibaba Cloud agar mengatur enable_delete_existing_files = true di fe.conf dan restart frontend.
Contoh cakupan `delete_existing_files`:
"file_path" = "/user/tmp"— menghapus semua file dan direktori di bawah/user/."file_path" = "/user/tmp/"— menghapus semua file dan direktori di bawah/user/tmp/.
Properti HDFS
Properti berikut wajib saat mengekspor melalui HDFS.
| Properti | Wajib | Deskripsi |
|---|---|---|
fs.defaultFS | Ya | Titik akhir dan port NameNode. |
hadoop.username | Ya | Username untuk autentikasi HDFS. |
dfs.nameservices | Ya | Nama layanan. Harus sesuai dengan nilai dalam hdfs-site.xml. |
dfs.ha.namenodes.[ID nameservice] | Ya | ID NameNode dalam Name Service. Harus sesuai dengan hdfs-site.xml. |
dfs.namenode.rpc-address.[ID nameservice].[ID name node] | Ya | Alamat Remote Procedure Call (RPC) untuk setiap NameNode. Harus sesuai dengan hdfs-site.xml. |
dfs.client.failover.proxy.provider.[ID nameservice] | Ya | Kelas Java untuk failover NameNode aktif. Default: org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider. |
Otentikasi Kerberos (jika diaktifkan)
| Properti | Wajib | Deskripsi |
|---|---|---|
dfs.namenode.kerberos.principal | Ya | Nama principal Kerberos dari NameNode HDFS. |
hadoop.security.authentication | Ya | Metode autentikasi. Atur ke kerberos. |
hadoop.kerberos.principal | Ya | Principal untuk otentikasi Kerberos. |
hadoop.kerberos.keytab | Ya | Jalur ke file Kerberos keytab. |
Properti S3
Properti ini berlaku untuk sistem penyimpanan apa pun yang mendukung protokol S3, termasuk OSS.
| Properti | Wajib | Deskripsi |
|---|---|---|
s3.endpoint | Ya | Titik akhir sistem penyimpanan tujuan. |
s3.access_key | Ya | Kunci akses untuk autentikasi. |
s3.secret_key | Ya | Kunci rahasia untuk autentikasi. |
s3.region | Ya | Wilayah sistem penyimpanan tujuan. |
s3.session_token | Jika menggunakan kredensial temporary | Token sesi untuk autentikasi sesi temporary. |
use_path_style | Tidak | Gaya akses. Default: false (gaya virtual-hosted). Atur ke true untuk memaksa akses gaya path pada sistem penyimpanan yang tidak mendukung gaya virtual-hosted. |
Skema URI: Gunakan http://, https://, atau s3:// di file_path.
http://atauhttps://:use_path_stylemenentukan gaya akses.s3://: selalu menggunakan gaya virtual-hosted, terlepas dariuse_path_style.
Sertakan selalu skema URI (http://, https://, atau s3://) di URL tujuan. Menghilangkan skema menyebabkan error: ERROR 1105 (HY000): errCode = 2, detailMessage = Unknown properties: [s3.region, s3.endpoint, s3.secret_key, s3.access_key].
Respons
SELECT INTO OUTFILE bersifat sinkron. Saat pernyataan selesai, respons berupa satu baris per thread ekspor.
Respons sukses:
SELECT * FROM tbl1 LIMIT 10 INTO OUTFILE "file:///home/work/path/result_";+------------+-----------+----------+--------------------------------------------------------------------+
| FileNumber | TotalRows | FileSize | URL |
+------------+-----------+----------+--------------------------------------------------------------------+
| 1 | 3 | 7 | file:///192.168.1.10/home/work/path/result_{fragment_instance_id}_ |
| 1 | 2 | 4 | file:///192.168.1.11/home/work/path/result_{fragment_instance_id}_ |
+------------+-----------+----------+--------------------------------------------------------------------+
2 baris dalam set (2,218 dtk)| Field | Deskripsi |
|---|---|
FileNumber | Jumlah file yang dihasilkan. |
TotalRows | Jumlah baris dalam set hasil. |
FileSize | Ukuran total file yang diekspor, dalam byte. |
URL | Node komputasi tempat data diekspor jika data diekspor ke disk lokal. |
Respons ekspor paralel (beberapa baris, satu per thread):
+------------+-----------+----------+--------------------------------------------------------------------+
| FileNumber | TotalRows | FileSize | URL |
+------------+-----------+----------+--------------------------------------------------------------------+
| 1 | 3 | 7 | file:///192.168.1.10/home/work/path/result_{fragment_instance_id}_ |
| 1 | 2 | 4 | file:///192.168.1.11/home/work/path/result_{fragment_instance_id}_ |
+------------+-----------+----------+--------------------------------------------------------------------+
2 rows in set (2.218 sec)Respons error:
ERROR 1064 (HY000): errCode = 2, detailMessage = ...Aktifkan ekspor paralel
Secara default, ekspor berjalan pada satu thread node BE. Aktifkan ekspor paralel untuk mendistribusikan beban kerja ke beberapa node BE.
Langkah 1: Aktifkan variabel sesi.
SET enable_parallel_outfile = true;Langkah 2: Verifikasi bahwa kueri Anda mendukung ekspor paralel.
Jalankan EXPLAIN pada pernyataan SELECT INTO OUTFILE Anda:
EXPLAIN <select_into_outfile_statement>;Periksa output:
Ekspor paralel didukung:
RESULT FILE SINKmuncul diPLAN FRAGMENT 1.Ekspor paralel tidak didukung:
RESULT FILE SINKmuncul diPLAN FRAGMENT 0.
Kueri denganORDER BYtidak dapat berjalan secara paralel meskipunenable_parallel_outfile = true, karena pengurutan memerlukan langkah merge single-threaded.
Contoh rencana kueri (ekspor paralel didukung):
+-----------------------------------------------------------------------------+
| Explain String |
+-----------------------------------------------------------------------------+
| PLAN FRAGMENT 0 |
| OUTPUT EXPRS:<slot 2> | <slot 3> | <slot 4> | <slot 5> |
| PARTITION: UNPARTITIONED |
| |
| RESULT SINK |
| |
| 1:EXCHANGE |
| |
| PLAN FRAGMENT 1 |
| OUTPUT EXPRS:`k1` + `k2` |
| PARTITION: HASH_PARTITIONED: `default_cluster:test`.`multi_tablet`.`k1` |
| |
| RESULT FILE SINK |
| FILE PATH: s3://ml-bd-repo/bpit_test/outfile_1951_ |
| STORAGE TYPE: S3 |
| |
| 0:OlapScanNode |
| TABLE: multi_tablet |
+-----------------------------------------------------------------------------+Langkah 3: Hitung konkurensi maksimum (opsional).
Saat ekspor paralel didukung, jumlah maksimum permintaan konkuren adalah:
be_instance_num × parallel_fragment_exec_instance_numbe_instance_num: jumlah node BE. Kluster dengan hingga 32 core CPU menggunakan 1 node; kluster dengan minimal 32 core CPU menggunakan beberapa node, masing-masing dengan 32 core CPU.parallel_fragment_exec_instance_num: pengaturan paralelisme per node.
Untuk melihat pengaturan paralelisme saat ini:
SHOW VARIABLES LIKE '%parallel_fragment_exec_instance_num%';Untuk mengaturnya:
SET parallel_fragment_exec_instance_num = <value>;Contoh
Ekspor ke HDFS
Properti HDFS yang diperlukan berbeda tergantung pada apakah high availability (HA) diaktifkan untuk kluster Hadoop.
Kluster Hadoop tanpa high availability
-- fileSystem_port default: 9000
SELECT * FROM tbl
INTO OUTFILE "hdfs://${host}:${fileSystem_port}/path/to/result_"
FORMAT AS CSV
PROPERTIES
(
"fs.defaultFS" = "hdfs://ip:port",
"hadoop.username" = "work"
);Kluster Hadoop dengan high availability
-- fileSystem_port default: 8020
SELECT * FROM tbl
INTO OUTFILE "hdfs:///path/to/result_"
FORMAT AS CSV
PROPERTIES
(
"fs.defaultFS" = "hdfs://hacluster/",
"dfs.nameservices" = "hacluster",
"dfs.ha.namenodes.hacluster" = "n1,n2",
"dfs.namenode.rpc-address.hacluster.n1" = "192.168.0.1:8020",
"dfs.namenode.rpc-address.hacluster.n2" = "192.168.0.2:8020",
"dfs.client.failover.proxy.provider.hacluster" = "org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider"
);Jika total hasil ≤ 1 GB, SelectDB menulis satu file: result_0.csv. Jika total melebihi 1 GB, SelectDB menulis beberapa file segmen: result_0.csv, result_1.csv, dan seterusnya.
Ekspor ke OSS melalui protokol S3
Ekspor hasil kueri UNION ke format Parquet dalam bucket OSS di wilayah China (Hangzhou):
SELECT k1 FROM tbl1 UNION SELECT k2 FROM tbl1
INTO OUTFILE "s3://oss-bucket/result_"
FORMAT AS PARQUET
PROPERTIES
(
"s3.endpoint" = "oss-cn-hangzhou-internal.aliyuncs.com",
"s3.access_key" = "****",
"s3.secret_key" = "****",
"s3.region" = "cn-hangzhou"
);Ekspor ke OSS dengan ekspor paralel diaktifkan
Ekspor data secara paralel. Semua permintaan menggunakan variabel sesi enable_parallel_outfile.
SET enable_parallel_outfile = true;
SELECT k1 FROM tb1 LIMIT 1000
INTO OUTFILE "s3://my_bucket/export/my_file_"
FORMAT AS CSV
PROPERTIES
(
"s3.endpoint" = "oss-cn-hangzhou-internal.aliyuncs.com",
"s3.access_key" = "****",
"s3.secret_key" = "****",
"s3.region" = "cn-hangzhou"
);Jika kueri mencakup ORDER BY, ekspor paralel dinonaktifkan secara otomatis meskipun enable_parallel_outfile = true:
SET enable_parallel_outfile = true;
SELECT k1 FROM tb1 ORDER BY k1 LIMIT 1000
INTO OUTFILE "s3://my_bucket/export/my_file_"
FORMAT AS CSV
PROPERTIES
(
"s3.endpoint" = "oss-cn-hangzhou-internal.aliyuncs.com",
"s3.access_key" = "****",
"s3.secret_key" = "****",
"s3.region" = "cn-hangzhou"
);Pemetaan tipe data
Saat mengekspor ke Parquet atau ORC, SelectDB secara otomatis memetakan tipe datanya ke format yang didukung oleh masing-masing jenis file.
SelectDB ke ORC
| Jenis SelectDB | Tipe ORC |
|---|---|
| BOOLEAN | BOOLEAN |
| TINYINT | TINYINT |
| SMALLINT | SMALLINT |
| INT | INT |
| BIGINT | BIGINT |
| LARGEINT | STRING |
| DATE | STRING |
| DATEV2 | STRING |
| DATETIME | STRING |
| DATETIMEV2 | TIMESTAMP |
| FLOAT | FLOAT |
| DOUBLE | DOUBLE |
| CHAR / VARCHAR / STRING | STRING |
| DECIMAL | DECIMAL |
| STRUCT | STRUCT |
| MAP | MAP |
| ARRAY | ARRAY |
SelectDB ke Parquet (melalui Apache Arrow)
Ekspor Parquet mengarahkan data melalui Apache Arrow. Tipe data SelectDB dipetakan ke tipe Arrow terlebih dahulu, lalu Arrow menuliskannya ke Parquet.
| Tipe SelectDB | Tipe Apache Arrow |
|---|---|
| BOOLEAN | BOOLEAN |
| TINYINT | INT8 |
| SMALLINT | INT16 |
| INT | INT32 |
| BIGINT | INT64 |
| LARGEINT | UTF8 |
| DATE | UTF8 |
| DATEV2 | UTF8 |
| DATETIME | UTF8 |
| DATETIMEV2 | UTF8 |
| FLOAT | FLOAT32 |
| DOUBLE | FLOAT64 |
| CHAR / VARCHAR / STRING | UTF8 |
| DECIMAL | DECIMAL128 |
| STRUCT | STRUCT |
| MAP | MAP |
| ARRAY | LIST |