全部產品
Search
文件中心

E-MapReduce:OSS與ClickHouse間的資料匯入與匯出

更新時間:Jul 01, 2024

OSS相容S3協議,您能夠在EMR ClickHouse叢集上通過S3表引擎或S3表函數讀寫OSS中的資料。本文為您介紹如何將OSS中的資料匯入至ClickHouse叢集及如何將ClickHouse叢集上的資料匯出至OSS。

前提條件

OSS資料匯入至ClickHouse叢集

步驟一:建立業務表

  1. 使用SSH方式登入ClickHouse叢集,詳情請參見登入叢集

  2. 執行以下命令,進入ClickHouse用戶端。

    clickhouse-client -h core-1-1 -m
    說明

    本樣本登入core-1-1節點,如果您有多個Core節點,可以登入任意一個節點。

  3. 執行以下命令,建立資料庫product,並在product資料庫中建立業務表orders。

    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());
    說明

    樣本中的{shard}{replica}是阿里雲EMR為ClickHouse叢集自動產生的宏定義,可以直接使用。

步驟二:匯入資料

通過S3表引擎匯入資料

ClickHouse的HDFS表引擎能夠從指定OSS地址讀取特定格式的檔案資料,文法如下:

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]);

參數

描述

db

資料庫名。

table_name

表名。

name1/name2

列名。

tyep1/type2

列的類型。

path

OSS路徑。

ClickHouse叢集訪問OSS使用地址詳情,請參見ECS執行個體通過OSS內網地址訪問OSS資源

path支援virtual hosted style和path style兩種形式。推薦您使用virtual hosted style。

path支援使用以下萬用字元:

  • *表示除了 '/' 以外任意個字元,包括Null 字元串。

  • ?表示單個字元。

  • {str1,str2,...,strn}表示str1/str2/.../strn中任意一個字串。

  • {N..M}表示從N到M的任一數字。N和M可以包含前置0,例如 {001..099}。

    重要

    根據萬用字元來決定哪些檔案會被使用在SELECT時而非建立表時,因此如果是為了寫入資料至OSS,不應該使用萬用字元。

access_key_id

阿里雲帳號的AccessKey ID。

access_key_secret

阿里雲帳號的AccessKey Secret。

format

path所指向的對象(檔案)的格式。例如,CSV和XML等類型,詳細資料請參見Formats for Input and Output Data

compression

壓縮類型。

該參數為選擇性參數,預設會根據檔案延伸選取合適的壓縮類型。

根據您建立的叢集版本,設定壓縮類型:

  • EMR-3.x系列版本:支援nonegzip/gzbrotli/bdeflateauto

  • EMR-5.x系列版本:支援nonegzip/gzbrotli/blzma(xz)autozstd/zst

  1. 建表從OSS當中讀取資料

    1. 下載並上傳樣本資料orders.csv至OSS中,本文將檔案上傳名為test的OSS Bucket的根目錄下。

    2. 執行以下命令建立OSS表,設定表引擎為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');
      說明

      樣本中的資料目錄http://test.oss-cn-beijing-internal.aliyuncs.com/orders.csv,表示cn-beijing地區下名稱為test的Bucket中的orders.csv檔案。

  2. 執行以下命令將資料匯入product.orders_all表中。

    INSERT INTO product.orders_all
    SELECT
      uid,
      date,
      skuId,
      order_revenue
    FROM
      oss.orders_oss;
  3. 您可以通過以下命令查看錶中資料,驗證資料一致性:

    • 查看錶orders_all的資料。

      SELECT count(1) FROM product.orders_all;
    • 查看錶orders_oss的資料。

      SELECT count(1) FROM oss.orders_oss;

通過S3表函數匯入資料

ClickHouse的S3表函數能夠從指定HDFS地址讀取檔案資料,返回指定結構的表,文法如下:

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

參數

描述

path

OSS路徑。

ClickHouse叢集訪問OSS使用地址詳情,請參見ECS執行個體通過OSS內網地址訪問OSS資源

path支援virtual hosted style和path style兩種形式。推薦您使用virtual hosted style。

path支援使用以下萬用字元:

  • *表示除了 '/' 以外任意個字元,包括Null 字元串。

  • ?表示單個字元。

  • {str1,str2,...,strn}表示str1/str2/.../strn中任意一個字串。

  • {N..M}表示從N到M的任一數字。N和M可以包含前置0,例如 {001..099}。

    重要

    根據萬用字元來決定哪些檔案會被使用在SELECT時而非建立表時,因此如果是為了寫入資料至OSS,不應該使用萬用字元。

access_key_id

阿里雲帳號的AccessKey ID。

access_key_secret

阿里雲帳號的AccessKey Secret。

format

path所指向的對象(檔案)的格式。例如,CSV和XML等類型,詳細資料請參見Formats for Input and Output Data

structure

表中欄位的類型。例如,column1 UInt32、column2 String。

compression

壓縮類型。

該參數為選擇性參數,預設會根據檔案延伸選取合適的壓縮類型。

根據您建立的叢集版本,設定壓縮類型:

  • EMR-3.x系列版本:支援nonegzip/gzbrotli/bdeflateauto

  • EMR-5.x系列版本:支援nonegzip/gzbrotli/blzma(xz)autozstd/zst

  1. 使用S3表函數將資料匯入至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. 您可以通過以下命令查看錶中資料,驗證資料一致性:

    • 查看錶orders_all的資料。

      SELECT count(1) FROM product.orders_all;
    • 查看錶orders_oss的資料。

      SELECT count(1) FROM oss.orders_oss;

ClickHouse叢集資料匯出至OSS

步驟一:建立業務表

本文中匯出操作使用的業務表結構與匯入操作的業務表結構相同,具體建立操作可查看步驟一:建立業務表

步驟二:資料準備

  1. 執行以下命令向product.orders_all業務表中插入資料,為後續匯出操作準備資料。

    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. (可選)設定匯出方式,EMR-5.8.0及之後、EMR-3.45.0及之後版本可通過設定寫入方式來避免路徑上檔案已存在的問題。

    增量匯出

    設定後若檔案已存在會在對應目錄下建立檔案並存放資料。

    set s3_create_new_file_on_insert=1

    覆蓋匯出

    設定後若檔案已存在會覆蓋原有資料,請謹慎設定。

    set s3_truncate_on_insert=1

步驟三:匯出資料

通過S3表引擎匯出資料

  1. 執行以下命令,建立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. 執行以下命令,向表中寫入資料。

    --假設業務表為product.orders_all
    INSERT INTO oss.orders_oss
    SELECT
      uid,
      date,
      skuId,
      order_revenue
    FROM
      product.orders_all;
    說明

    ClickHouse在資料匯出時會在相應地址上建立檔案並寫入資料,預設在檔案已存在情況下匯出失敗。EMR-5.8.0、EMR-3.45.0之後的版本可通過配置參數來避免此問題。

  3. OSS管理主控台上查看資料。

通過HDFS表函數匯出資料

  1. 執行以下命令匯出資料。

    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;
    說明

    ClickHouse在資料匯出時會在相應地址上建立檔案並寫入資料,預設在檔案已存在情況下匯出失敗。EMR-5.8.0、EMR-3.45.0之後的版本可通過配置參數來避免此問題。

  2. OSS管理主控台上查看資料。

OSS相關配置

profile

  1. 支援的profile

    如果使用MultipartUpload上傳檔案到OSS,則可以設定s3_min_upload_part_size 參數以指定每個part最小的大小,預設值為512 MB,必須使用UInt64範圍內的整數。

  2. 設定方法

    • 在一次SQL中,代碼設定如下。

      INSERT INTO OSS_TABLE
      SELECT
        ...
      FROM
        ...
      SETTINGS
        s3_min_upload_part_size=1073741824;
    • 在一次Session中,代碼設定如下。

      SET s3_min_upload_part_size=1073741824;
      INSERT INTO OSS_TABLE
      SELECT
        ...
      FROM
        ...
      ;
    • 針對某一個表,代碼設定如下。

      CREATE TABLE OSS_TABLE
      (
        ...
      ) ENGINE = s3(...)
      SETTINGS
        s3_min_upload_part_size=1073741824;
    • 針對某一個使用者,設定如下。

      在EMR控制台ClickHouse服務的配置頁面,單擊server-users頁簽,新增參數為users.<YourUserName>.s3_min_upload_part_size,參數值為1073741824的配置項。

configuration

EMR中的ClickHouse支援使用如下參數配置OSS,程式碼範例如下。

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

其中,相關參數描述如下。

參數

描述

endpoint-name

Endpoint的名稱。

endpoint

OSS的訪問網域名稱,詳情請參見OSS訪問網域名稱使用規則

access_key_id

阿里雲帳號的AccessKey ID。

secret_access_key

阿里雲帳號的AccessKey Secret。

您也可以在EMR控制台ClickHouse服務的配置頁面,單擊server-config頁簽,通過以下兩個方式新增自訂配置。

方式

操作

方法一

新增參數oss.<endpoint-name>.endpointoss.<endpoint-name>.access_key_idoss.<endpoint-name>.secret_access_key及其對應的參數值。

說明

參數中的<endpoint-name>需要替換為Endpoint的名稱。

方法二

新增參數為oss,參數值如下的配置項。

<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>
說明

參數值請替換為您實際的值。

如果您已進行如上配置,則在建立OSS表或使用OSS表函數時,可以使用如下命令。

  • OSS表

    CREATE TABLE OSS_TABLE
    (
      column1 UInt32,
      column2 String
      ...
    )
    ENGINE = S3(path, format, [compression]);
  • OSS表函數

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