全部产品
Search
文档中心

E-MapReduce:Impor dan ekspor data antara OSS dan ClickHouse

更新时间:Jul 02, 2025

Object Storage Service (OSS) kompatibel dengan protokol Amazon Simple Storage Service (Amazon S3). Anda dapat menggunakan mesin tabel S3 atau fungsi tabel S3 dalam kluster E-MapReduce (EMR) ClickHouse untuk membaca dan menulis data ke OSS. Topik ini menjelaskan cara mengimpor data dari OSS ke kluster ClickHouse serta mengekspor data dari kluster ClickHouse ke OSS.

Prasyarat

  • Bucket telah dibuat di OSS. Untuk informasi lebih lanjut, lihat Buat Bucket.

  • Kluster EMR ClickHouse telah dibuat. Untuk informasi lebih lanjut, lihat Buat Kluster ClickHouse.

Impor data dari OSS ke kluster ClickHouse

Langkah 1: Buat tabel bisnis

  1. Masuk ke kluster ClickHouse melalui mode SSH. Untuk informasi lebih lanjut, lihat Masuk ke Kluster.

  2. Jalankan perintah berikut untuk memulai klien ClickHouse:

    clickhouse-client -h core-1-1 -m
    Catatan

    Dalam perintah contoh, core-1-1 adalah nama node inti yang Anda masuki. Jika kluster memiliki beberapa node inti, Anda dapat masuk ke salah satu node tersebut.

  3. Eksekusi pernyataan berikut untuk membuat database bernama product dan tabel bisnis bernama orders dalam database product:

    CREATE DATABASE IF NOT EXISTS product ON CLUSTER cluster_emr;
    CREATE TABLE IF NOT EXISTS product.orders ON CLUSTER cluster_emr
    (
        `uid` UInt32,
        `date` DateTime,
        `skuId` UInt32,
        `order_revenue` UInt32
    )
    Engine = ReplicatedMergeTree('/cluster_emr/product/orders/{shard}', '{replica}')
    PARTITION BY toYYYYMMDD(date)
    ORDER BY toYYYYMMDD(date);
    CREATE TABLE IF NOT EXISTS product.orders_all ON CLUSTER cluster_emr
    (
        `uid` UInt32,
        `date` DateTime,
        `skuId` UInt32,
        `order_revenue` UInt32
    )
    Engine = Distributed(cluster_emr, product, orders, rand());
    Catatan

    Dalam kode contoh, {shard} dan {replica} adalah makro yang secara otomatis dihasilkan oleh Alibaba Cloud EMR untuk kluster ClickHouse dan dapat digunakan langsung.

Langkah 2: Impor data

Gunakan mesin tabel S3 untuk mengimpor data

Mesin tabel Hadoop Distributed File System (HDFS) ClickHouse dapat membaca file data dalam format tertentu dari alamat OSS yang ditentukan. Sintaks:

CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
  name1 [type1] [NULL|NOT NULL] [DEFAULT|MATERIALIZED|ALIAS expr1] [compression_codec] [TTL expr1],
  name2 [type2] [NULL|NOT NULL] [DEFAULT|MATERIALIZED|ALIAS expr2] [compression_codec] [TTL expr2],
  ...
)
ENGINE = S3(path, [access_key_id, access_key_secret,] format, [compression]);

Parameter

Deskripsi

db

Nama database.

table_name

Nama tabel.

name1/name2

Nama kolom dalam tabel.

tyep1/type2

Tipe data kolom dalam tabel.

path

Path OSS objek yang disimpan dalam bucket OSS.

Untuk informasi tentang endpoint yang digunakan oleh kluster ClickHouse untuk mengakses bucket OSS, lihat Akses ke sumber daya OSS dari instance ECS menggunakan endpoint internal OSS.

Anda dapat mengatur parameter path ke URL virtual-hosted atau URL path-style. Kami merekomendasikan Anda mengatur parameter ini ke URL virtual-hosted.

Nilai parameter path mendukung wildcard berikut:

  • * menunjukkan karakter apa pun kecuali garis miring (/). String kosong juga didukung.

  • ? menunjukkan satu karakter.

  • {str1,str2,...,strn} menentukan string dari str1, str2, ... dan strn.

  • {N..M} menentukan angka dalam rentang nilai dari N hingga M. N dan M dapat berisi nol di depan, seperti {001..099}.

    Penting

    Wildcard sebelumnya digunakan untuk menentukan file mana yang ditentukan dalam pernyataan SELECT, bukan untuk membuat tabel. Jika Anda ingin menulis data ke OSS, jangan gunakan wildcard.

access_key_id

ID AccessKey akun Alibaba Cloud Anda.

access_key_secret

Rahasia AccessKey akun Alibaba Cloud Anda.

format

Format objek yang disimpan dalam path. Format file seperti CSV dan XML didukung. Untuk informasi lebih lanjut, lihat Format untuk Data Input dan Output.

compression

Format kompresi.

Parameter ini opsional. Jika Anda tidak menentukan parameter ini, sistem menggunakan format kompresi berdasarkan ekstensi nama file.

Anda dapat menentukan parameter ini berdasarkan versi kluster EMR yang Anda buat:

  • Seri EMR V3.X: none, gzip/gz, brotli/b, deflate, atau auto.

  • Seri EMR V5.X: none, gzip/gz, brotli/b, lzma(xz), auto, atau zstd/zst.

  1. Buat tabel untuk membaca data dari OSS.

    1. Unduh objek contoh orders.csv dan unggah objek tersebut ke OSS. Dalam contoh ini, objek diunggah ke direktori root bucket OSS bernama test.

    2. Eksekusi pernyataan berikut untuk membuat tabel OSS dan gunakan mesin tabel S3:

      CREATE DATABASE IF NOT EXISTS oss ON CLUSTER cluster_emr;
      CREATE TABLE oss.orders_oss
      (
        uid UInt32,
        date DateTime,
        skuId UInt32,
        order_revenue UInt32
      ) ENGINE = S3('http://test.oss-cn-beijing-internal.aliyuncs.com/orders.csv', '<access_key_id>', '<access_key_secret>', 'CSV');
      Catatan

      Dalam kode contoh, http://test.oss-cn-beijing-internal.aliyuncs.com/orders.csv adalah path ke objek orders.csv dalam bucket OSS bernama test di wilayah China (Beijing).

  2. Eksekusi pernyataan berikut untuk mengimpor data ke tabel product.orders_all:

    INSERT INTO product.orders_all
    SELECT
      uid,
      date,
      skuId,
      order_revenue
    FROM
      oss.orders_oss;
  3. Eksekusi pernyataan berikut untuk melihat data dalam tabel dan memeriksa konsistensi data:

    • Kueri data dalam tabel orders_all.

      SELECT count(1) FROM product.orders_all;
    • Kueri data dalam tabel orders_oss.

      SELECT count(1) FROM oss.orders_oss;

Gunakan fungsi tabel S3 untuk mengimpor data

Fungsi tabel S3 ClickHouse dapat membaca file data dari alamat HDFS yang ditentukan dan mengembalikan tabel dengan skema yang ditentukan. Sintaks:

s3(path, [access_key_id, access_key_secret,] format, structure, [compression])

Parameter

Deskripsi

path

Path OSS objek yang disimpan dalam bucket OSS.

Untuk informasi tentang endpoint yang digunakan oleh kluster ClickHouse untuk mengakses bucket OSS, lihat Akses ke sumber daya OSS dari instance ECS menggunakan endpoint internal OSS.

Anda dapat mengatur parameter path ke URL virtual-hosted atau URL path-style. Kami merekomendasikan Anda mengatur parameter ini ke URL virtual-hosted.

Nilai parameter path mendukung wildcard berikut:

  • * menunjukkan karakter apa pun kecuali garis miring (/). String kosong juga didukung.

  • ? menunjukkan satu karakter.

  • {str1,str2,...,strn} menentukan string dari str1, str2, ... dan strn.

  • {N..M} menentukan angka dalam rentang nilai dari N hingga M. N dan M dapat berisi nol di depan, seperti {001..099}.

    Penting

    Wildcard sebelumnya digunakan untuk menentukan file mana yang ditentukan dalam pernyataan SELECT, bukan untuk membuat tabel. Jika Anda ingin menulis data ke OSS, jangan gunakan wildcard.

access_key_id

ID AccessKey akun Alibaba Cloud Anda.

access_key_secret

Rahasia AccessKey akun Alibaba Cloud Anda.

format

Format objek yang disimpan dalam path. Format file seperti CSV dan XML didukung. Untuk informasi lebih lanjut, lihat Format untuk Data Input dan Output.

structure

Tipe data bidang dalam tabel. Contoh: column1 UInt32 dan column2 String.

compression

Format kompresi.

Parameter ini opsional. Jika Anda tidak menentukan parameter ini, sistem menggunakan format kompresi berdasarkan ekstensi nama file.

Anda dapat menentukan parameter ini berdasarkan versi kluster EMR yang Anda buat:

  • Seri EMR V3.X: none, gzip/gz, brotli/b, deflate, atau auto.

  • Seri EMR V5.X: none, gzip/gz, brotli/b, lzma(xz), auto, atau zstd/zst.

  1. Gunakan fungsi tabel S3 untuk mengimpor data ke kluster ClickHouse.

    INSERT INTO product.orders_all
    SELECT
      uid,
      date,
      skuId,
      order_revenue
    FROM
      s3('http://test.oss-cn-beijing-internal.aliyuncs.com/orders.csv',
          '<your-access-key>',
          '<your-access-secret>',
          'CSV',
          'uid UInt32, date DateTime, skuId UInt32, order_revenue UInt32');
  2. Eksekusi pernyataan berikut untuk melihat data dalam tabel dan memeriksa konsistensi data:

    • Kueri data dalam tabel orders_all.

      SELECT count(1) FROM product.orders_all;
    • Kueri data dalam tabel orders_oss.

      SELECT count(1) FROM oss.orders_oss;

Ekspor data dari kluster ClickHouse ke OSS

Langkah 1: Buat tabel bisnis

Dalam contoh ini, skema tabel bisnis yang digunakan untuk ekspor data sama dengan yang digunakan untuk impor data. Untuk informasi lebih lanjut, lihat Langkah 1: Buat Tabel Bisnis.

Langkah 2: Persiapkan data

  1. Eksekusi pernyataan berikut untuk menyisipkan data ke tabel bisnis product.orders_all sebagai persiapan untuk operasi ekspor selanjutnya:

    INSERT INTO product.orders_all VALUES 
      (60333391,'2021-08-04 11:26:01',49358700,89) 
      (38826285,'2021-08-03 10:47:29',25166907,27) 
      (10793515,'2021-07-31 02:10:31',95584454,68) 
      (70246093,'2021-08-01 00:00:08',82355887,97) 
      (70149691,'2021-08-02 12:35:45',68748652,1)  
      (87307646,'2021-08-03 19:45:23',16898681,71) 
      (61694574,'2021-08-04 23:23:32',79494853,35) 
      (61337789,'2021-08-02 07:10:42',23792355,55) 
      (66879038,'2021-08-01 16:13:19',95820038,89);
  2. Opsional. Tentukan metode ekspor untuk mencegah kegagalan jika objek tempat Anda ingin menulis data sudah ada. Anda dapat menentukan metode ekspor untuk kluster EMR versi V5.8.0, V3.45.0, dan versi minor terbaru mereka.

    Ekspor inkremental

    Setelah mengonfigurasi parameter berikut, jika objek tempat Anda ingin menulis data sudah ada di OSS, objek baru akan dibuat dalam direktori terkait untuk menyimpan data inkremental.

    set s3_create_new_file_on_insert=1

    Ekspor timpa

    Setelah mengonfigurasi parameter berikut, jika objek tempat Anda ingin menulis data sudah ada di OSS, data yang ingin Anda tulis akan menimpa data yang ada dalam objek terkait. Lanjutkan dengan hati-hati.

    set s3_truncate_on_insert=1

Langkah 3: Ekspor data

Gunakan mesin tabel S3 untuk mengekspor data

  1. Eksekusi pernyataan berikut untuk membuat tabel S3:

    CREATE TABLE oss.orders_oss
    (
      uid UInt32,
      date DateTime,
      skuId UInt32,
      order_revenue UInt32
    ) ENGINE = S3('http://test.oss-cn-beijing-internal.aliyuncs.com/orders.csv', '<access_key_id>', '<access_key_secret>', 'CSV');
  2. Eksekusi pernyataan berikut untuk menulis data ke tabel:

    -- Dalam contoh ini, tabel bisnis product.orders_all digunakan.
    INSERT INTO oss.orders_oss
    SELECT
      uid,
      date,
      skuId,
      order_revenue
    FROM
      product.orders_all;
    Catatan

    Selama ekspor data, ClickHouse membuat objek dalam path terkait dan menulis data ke objek tersebut. Secara default, jika objek tempat Anda ingin menulis data sudah ada di OSS, ekspor data gagal. Anda dapat mengonfigurasi parameter untuk kluster EMR versi V5.8.0, V3.45.0, dan versi minor terbaru mereka untuk mencegah kegagalan.

  3. Lihat data di Konsol OSS.

Gunakan fungsi tabel HDFS untuk mengekspor data

  1. Eksekusi pernyataan berikut untuk mengekspor data:

    INSERT INTO FUNCTION
    s3('http://test.oss-cn-beijing-internal.aliyuncs.com/orders.csv',
          '<your-access-key>',
          '<your-access-secret>',
          'CSV',
          'uid UInt32, date DateTime, skuId UInt32, order_revenue UInt32')
    SELECT
      uid,
      date,
      skuId,
      order_revenue
    FROM
      product.orders_all;
    Catatan

    Selama ekspor data, ClickHouse membuat objek dalam path terkait dan menulis data ke objek tersebut. Secara default, jika objek tempat Anda ingin menulis data sudah ada di OSS, ekspor data gagal. Anda dapat mengonfigurasi parameter untuk kluster EMR versi V5.8.0, V3.45.0, dan versi minor terbaru mereka untuk mencegah kegagalan.

  2. Lihat data di Konsol OSS.

Konfigurasikan parameter terkait OSS

profil

  1. Profil yang Didukung

    Jika Anda menggunakan metode unggah multipart untuk mengunggah file ke OSS, Anda dapat menggunakan parameter s3_min_upload_part_size untuk menentukan ukuran minimum setiap bagian dalam file. Ukuran minimum default adalah 512 MB. Nilai parameter ini harus berupa integer dengan tipe nilai UInt64.

  2. Metode Konfigurasi

    • Kode contoh berikut menunjukkan cara menentukan parameter s3_min_upload_part_size dalam satu kueri SQL:

      INSERT INTO OSS_TABLE
      SELECT
        ...
      FROM
        ...
      SETTINGS
        s3_min_upload_part_size=1073741824;
    • Kode contoh berikut menunjukkan cara menentukan parameter s3_min_upload_part_size dalam sesi:

      SET s3_min_upload_part_size=1073741824;
      INSERT INTO OSS_TABLE
      SELECT
        ...
      FROM
        ...
      ;
    • Kode contoh berikut menunjukkan cara menentukan parameter s3_min_upload_part_size untuk tabel:

      CREATE TABLE OSS_TABLE
      (
        ...
      ) ENGINE = s3(...)
      SETTINGS
        s3_min_upload_part_size=1073741824;
    • Tentukan parameter s3_min_upload_part_size untuk pengguna:

      Pada tab Configure halaman layanan ClickHouse di konsol EMR, klik tab server-users. Pada tab ini, klik Tambah Item Konfigurasi. Dalam kotak dialog Tambah Item Konfigurasi, tambahkan item konfigurasi dengan key users.<YourUserName>.s3_min_upload_part_size dan value 1073741824.

konfigurasi

Kode contoh berikut menunjukkan cara menentukan parameter terkait OSS dalam kluster EMR ClickHouse:

<s3>
    <endpoint-name>
        <endpoint>https://oss-cn-beijing-internal.aliyuncs.com/bucket</endpoint>
        <access_key_id>ACCESS_KEY_ID</access_key_id>
        <secret_access_key>ACCESS_KEY_SECRET</secret_access_key>
    </endpoint-name>
</s3>

Tabel berikut menjelaskan parameter dalam kode contoh.

Parameter

Deskripsi

endpoint-name

Informasi tentang endpoint.

endpoint

Endpoint yang digunakan untuk mengakses OSS. Untuk informasi lebih lanjut, lihat Nama domain OSS.

access_key_id

ID AccessKey akun Alibaba Cloud Anda.

secret_access_key

Rahasia AccessKey akun Alibaba Cloud Anda.

Anda juga dapat masuk ke tab Configure halaman layanan ClickHouse di konsol EMR dan klik tab server-config untuk menambahkan konfigurasi kustom menggunakan salah satu dari metode berikut.

Metode

Deskripsi

Metode 1

Tambahkan item konfigurasi dengan key oss.<endpoint-name>.endpoint, oss.<endpoint-name>.access_key_id, dan oss.<endpoint-name>.secret_access_key dan tentukan nilainya.

Catatan

Anda harus mengganti <endpoint-name> dalam key dengan endpoint OSS.

Metode 2

Tambahkan item konfigurasi dengan kunci oss dan nilai dalam format berikut:

<endpoint-name>
  <endpoint>https://oss-cn-beijing-internal.aliyuncs.com/bucket</endpoint>
  <access_key_id>ACCESS_KEY_ID</access_key_id>
  <secret_access_key>ACCESS_KEY_SECRET</secret_access_key>
</endpoint-name>
Catatan

Anda harus mengganti nilai parameter dengan endpoint sebenarnya, ID AccessKey, dan Rahasia AccessKey.

Setelah menyelesaikan konfigurasi sebelumnya, Anda dapat mengeksekusi pernyataan berikut untuk membuat tabel OSS dan menggunakan fungsi tabel OSS:

  • Buat tabel OSS

    CREATE TABLE OSS_TABLE
    (
      column1 UInt32,
      column2 String
      ...
    )
    ENGINE = S3(path, format, [compression]);
  • Gunakan fungsi tabel OSS

    s3(path, format, structure, [compression]);