OSS相容S3協議,您能夠在EMR ClickHouse叢集上通過S3表引擎或S3表函數讀寫OSS中的資料。本文為您介紹如何將OSS中的資料匯入至ClickHouse叢集及如何將ClickHouse叢集上的資料匯出至OSS。
前提條件
-
已在OSS上建立儲存空間,詳情請參見控制台建立儲存空間。
-
已建立ClickHouse叢集,詳情請參見建立ClickHouse叢集。
OSS資料匯入至ClickHouse叢集
步驟一:建立業務表
-
使用SSH方式登入ClickHouse叢集,詳情請參見登入叢集。
-
執行以下命令,進入ClickHouse用戶端。
clickhouse-client -h core-1-1 -m說明本樣本登入core-1-1節點,如果您有多個Core節點,可以登入任意一個節點。
-
執行以下命令,建立資料庫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支援使用以下萬用字元:
|
|
access_key_id |
阿里雲帳號的AccessKey ID。 |
|
access_key_secret |
阿里雲帳號的AccessKey Secret。 |
|
format |
path所指向的對象(檔案)的格式。例如,CSV和XML等類型,詳細資料請參見Formats for Input and Output Data。 |
|
compression |
壓縮類型。 該參數為選擇性參數,預設會根據檔案延伸選取合適的壓縮類型。 根據您建立的叢集版本,設定壓縮類型:
|
-
建表從OSS當中讀取資料
-
下載並上傳樣本資料orders.csv至OSS中,本文將檔案上傳名為test的OSS Bucket的根目錄下。
-
執行以下命令建立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檔案。
-
-
執行以下命令將資料匯入product.orders_all表中。
INSERT INTO product.orders_all SELECT uid, date, skuId, order_revenue FROM oss.orders_oss; -
您可以通過以下命令查看錶中資料,驗證資料一致性:
-
查看錶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])
|
參數 |
描述 |
|
|
OSS路徑。 ClickHouse叢集訪問OSS使用地址詳情,請參見ECS執行個體通過OSS內網地址訪問OSS資源。 path支援virtual hosted style和path style兩種形式。推薦您使用virtual hosted style。 path支援使用以下萬用字元:
|
|
|
阿里雲帳號的AccessKey ID。 |
|
|
阿里雲帳號的AccessKey Secret。 |
|
|
path所指向的對象(檔案)的格式。例如,CSV和XML等類型,詳細資料請參見Formats for Input and Output Data。 |
|
|
表中欄位的類型。例如,column1 UInt32、column2 String。 |
|
|
壓縮類型。 該參數為選擇性參數,預設會根據檔案延伸選取合適的壓縮類型。 根據您建立的叢集版本,設定壓縮類型:
|
-
使用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'); -
您可以通過以下命令查看錶中資料,驗證資料一致性:
-
查看錶orders_all的資料。
SELECT count(1) FROM product.orders_all; -
查看錶orders_oss的資料。
SELECT count(1) FROM oss.orders_oss;
-
ClickHouse叢集資料匯出至OSS
步驟一:建立業務表
本文中匯出操作使用的業務表結構與匯入操作的業務表結構相同,具體建立操作可查看步驟一:建立業務表。
步驟二:資料準備
-
執行以下命令向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); -
(可選)設定匯出方式,EMR-5.8.0及之後、EMR-3.45.0及之後版本可通過設定寫入方式來避免路徑上檔案已存在的問題。
增量匯出
設定後若檔案已存在會在對應目錄下建立檔案並存放資料。
set s3_create_new_file_on_insert=1覆蓋匯出
設定後若檔案已存在會覆蓋原有資料,請謹慎設定。
set s3_truncate_on_insert=1
步驟三:匯出資料
通過S3表引擎匯出資料
-
執行以下命令,建立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'); -
執行以下命令,向表中寫入資料。
--假設業務表為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之後的版本可通過配置參數來避免此問題。
-
在OSS管理主控台上查看資料。
通過HDFS表函數匯出資料
-
執行以下命令匯出資料。
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之後的版本可通過配置參數來避免此問題。
-
在OSS管理主控台上查看資料。
OSS相關配置
profile
-
支援的profile
如果使用MultipartUpload上傳檔案到OSS,則可以設定
s3_min_upload_part_size參數以指定每個part最小的大小,預設值為512 MB,必須使用UInt64範圍內的整數。 -
設定方法
-
在一次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的訪問網域名稱,詳情請參見通過IPv6協議訪問OSS。 |
|
access_key_id |
阿里雲帳號的AccessKey ID。 |
|
secret_access_key |
阿里雲帳號的AccessKey Secret。 |
您也可以在EMR控制台ClickHouse服務的配置頁面,單擊server-config頁簽,通過以下兩個方式新增自訂配置。
|
方式 |
操作 |
|
方法一 |
新增參數oss.<endpoint-name>.endpoint、oss.<endpoint-name>.access_key_id和oss.<endpoint-name>.secret_access_key及其對應的參數值。 說明
參數中的 |
|
方法二 |
新增參數為oss,參數值如下的配置項。
說明
參數值請替換為您實際的值。 |
如果您已進行如上配置,則在建立OSS表或使用OSS表函數時,可以使用如下命令。
-
OSS表
CREATE TABLE OSS_TABLE ( column1 UInt32, column2 String ... ) ENGINE = S3(path, format, [compression]); -
OSS表函數
s3(path, format, structure, [compression]);