E-MapReduce (EMR) ClickHouse クラスターでは、S3 テーブルエンジンまたは S3 テーブル関数を使用して、OSS からのデータの読み取りと OSS への書き込みができます。このトピックでは、OSS から ClickHouse クラスターにデータをインポートする方法と、クラスターから OSS にデータをエクスポートする方法について説明します。
前提条件
-
OSS でバケットが作成済みであること。詳細については、「バケットの作成」をご参照ください。
-
ClickHouse クラスターが作成済みであること。詳細については、「ClickHouse クラスターの作成」をご参照ください。
OSS から ClickHouse へのデータのインポート
ステップ 1:ビジネス テーブルの作成
-
SSH 経由で ClickHouse クラスターにログインします。詳細については、「クラスターへのログイン」をご参照ください。
-
ClickHouse クライアントを起動します:
clickhouse-client -h core-1-1 -mcore-1-1はログインしたコアノードの名前です。クラスターに複数のコアノードがある場合は、いずれか 1 つに接続してください。 -
productという名前のデータベースと、ローカルのレプリケートされたテーブルproduct.ordersおよび分散テーブルproduct.orders_allの 2 つのテーブルを作成します: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 クラスター用に自動生成するマクロです。
手順 2:データのインポート
S3 テーブルエンジンを使用したインポート
ClickHouse の S3 テーブルエンジンは、指定された 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 |
カラム名。 |
|
type1/type2 |
カラムのデータ型。 |
|
path |
OSS パス。 ClickHouse クラスターから OSS にアクセスするための内部エンドポイントを確認するには、「内部エンドポイントを使用して ECS インスタンスから OSS リソースにアクセスする」をご参照ください。 path パラメーターは、仮想ホスト形式とパス形式の 2 つの形式に対応しています。仮想ホスト形式の使用を推奨します。 path パラメーターでは、次のワイルドカードが使用できます:
|
|
AccessKey ID |
Alibaba Cloud の AccessKey ID。 |
|
AccessKey Secret |
Alibaba Cloud の AccessKey Secret。 |
|
format |
path パラメーターで指定されたオブジェクト (ファイル) の形式。CSV や XML などがあります。詳細については、「入出力データの形式」をご参照ください。 |
|
compression |
圧縮タイプ。 このパラメーターは省略可能です。デフォルトでは、ClickHouse は拡張子から圧縮タイプを自動的に検出します。 クラスターの EMR のバージョンに応じて圧縮タイプを設定します。
|
-
OSS からデータを読み取るテーブルを作成します。
-
サンプルデータファイル orders.csv をダウンロードし、test という名前の OSS バケットのルートディレクトリにアップロードします。
-
次のコマンドを実行して、S3 テーブルエンジンを使用する OSS テーブルを作成します。
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 という名前のバケット内の 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 テーブル関数は、指定された OSS パスからデータを読み取り、定義された構造を持つテーブルを返します。構文は次のとおりです:
s3(path, [access_key_id, access_key_secret,] format, structure, [compression])
|
パラメーター |
説明 |
|
|
OSS パス。 ClickHouse クラスターから OSS にアクセスするための内部エンドポイントを確認するには、「内部エンドポイントを使用して ECS インスタンスから OSS リソースにアクセスする」をご参照ください。 path パラメーターは、仮想ホスト形式とパス形式の 2 つの形式に対応しています。仮想ホスト形式の使用を推奨します。 path では、次のワイルドカードが使用できます:
|
|
|
Alibaba Cloud の AccessKey ID。 |
|
|
Alibaba Cloud の AccessKey Secret。 |
|
|
path パラメーターで指定されたオブジェクト (ファイル) の形式。CSV や XML などがあります。詳細については、「入出力データの形式」をご参照ください。 |
|
|
テーブル構造。カラム名とデータ型を定義します。例: |
|
|
圧縮タイプ。 このパラメーターは省略可能です。デフォルトでは、ClickHouse は拡張子から圧縮タイプを自動的に検出します。 クラスターの EMR のバージョンに応じて圧縮タイプを設定します。
|
-
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 へのデータのエクスポート
手順 1:ビジネス テーブルの作成
データをエクスポートするためのビジネス テーブルは、インポート用のテーブルと同じスキーマを使用します。テーブルを作成するには、「手順 1:ビジネス テーブルの作成」をご参照ください。
手順 2:データの準備
-
エクスポート用のデータを準備するには、次のコマンドを実行してデータを 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 以降では、指定されたパスにファイルが既に存在する場合の処理方法として、書き込みモードを設定できます。
増分エクスポート
ファイルが既に存在する場合、ClickHouse は同じディレクトリに新しいファイルを作成し、そのファイルにデータを書き込みます。
set s3_create_new_file_on_insert=1上書きエクスポート
ファイルが既に存在する場合、ClickHouse は既存のデータを上書きします。この設定は慎重に使用してください。
set s3_truncate_on_insert=1
手順 3:データのエクスポート
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 コンソールでデータを表示します。
S3 テーブル関数を使用したエクスポート
-
次のコマンドを実行して、データをエクスポートします。
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 関連の設定
プロファイル
-
サポートされるプロファイル
OSS へのマルチパートアップロードを使用する場合、
s3_min_upload_part_sizeパラメーターで各パートの最小サイズを設定します。デフォルトは 512 MB です。値はUInt64整数である必要があります。 -
設定方法
-
単一の SQL ステートメントの場合は、次のようにパラメーターを設定します:
INSERT INTO OSS_TABLE SELECT ... FROM ... SETTINGS s3_min_upload_part_size=1073741824; -
単一のセッションの場合は、次のようにパラメーターを設定します:
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 サービスの Configure ページで [server-users] タブをクリックし、[users.<YourUserName>.s3_min_upload_part_size] パラメーターを追加して、その値を 1073741824 に設定します。
-
設定
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 |
OSS へのアクセスに使用するドメイン名。詳細については、「OSS ドメイン名」をご参照ください。 |
|
access_key_id |
Alibaba Cloud の AccessKey ID。 |
|
secret_access_key |
Alibaba Cloud の AccessKey Secret。 |
EMR コンソールの ClickHouse サービスのConfigureページで、[server-config] タブをクリックして、次の 2 つの方法でカスタム設定を追加することもできます。
|
方法 |
操作 |
|
方法 1 |
パラメーター oss.<endpoint-name>.endpoint、oss.<endpoint-name>.access_key_id、および oss.<endpoint-name>.secret_access_key とそれぞれに対応する値を追加します。 説明
|
|
方法 2 |
[oss] という名前のパラメーターを追加し、その値を次の設定に設定します。
説明
プレースホルダーをご自身の値に置き換えてください。 |
設定が完了したら、次の簡略化された構文で OSS テーブルを作成するか、S3 テーブル関数を使用できます:
-
OSS テーブル
CREATE TABLE OSS_TABLE ( column1 UInt32, column2 String ... ) ENGINE = S3(path, format, [compression]); -
S3 テーブル関数
s3(path, format, structure, [compression]);