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的訪問網域名稱,詳情請參見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]);