このトピックでは、Hadoop Distributed File System(HDFS)を使用して、Alibaba Cloud E-MapReduce(EMR)のClickHouseクラスター内のホットデータとコールドデータを分離する方法について説明します。このトピックで説明されている操作は、クラスター内のホットデータとコールドデータを自動的に維持するだけでなく、クラスター内のコンピューティングリソースとストレージリソースを最大限に活用してコストを削減するのにも役立ちます。これらの操作は、クラスターの読み取りおよび書き込みパフォーマンスには影響しません。
前提条件
EMRコンソールで、EMR V5.5.0以降のClickHouseクラスターが作成されていること。詳細については、「ClickHouseクラスターの作成」をご参照ください。
ClickHouseクラスターと同じ仮想プライベートクラウド(VPC)にデプロイされたHDFSサービスが利用可能であること。たとえば、EMR HadoopクラスターのHDFSサービスを使用できます。
HDFSサービスに対する読み取りおよび書き込み権限が付与されていること。
制限事項
このトピックで説明されている操作は、EMR V5.5.0以降のClickHouseクラスターでのみ実行できます。
手順
手順 1:EMRコンソールでHDFSディスクを追加する
クラスターのClickHouseサービスページの[構成] タブに移動します。
EMRコンソールにログインします。左側のナビゲーションペインで、[ECS上のEMR] をクリックします。
上部のナビゲーションバーで、クラスターが存在するリージョンを選択し、ビジネス要件に基づいてリソースグループを選択します。
[EMR On ECS] ページで、管理するクラスターを見つけ、[アクション] 列の [サービス] をクリックします。
[サービス] タブで、ClickHouseセクションの [構成] をクリックします。
[構成] タブで、[server-metrika] タブをクリックします。
[storage_configuration] パラメーターの値を変更します。
[disks] にHDFSディスクを追加します。
サンプルコード:
<disk_hdfs> <type>hdfs</type> <endpoint>hdfs://${your-hdfs-url}</endpoint> <min_bytes_for_seek>1048576</min_bytes_for_seek> <thread_pool_size>16</thread_pool_size> <objects_chunk_size_to_delete>1000</objects_chunk_size_to_delete> </disk_hdfs>次の表は、上記のコードで使用されているパラメーターについて説明しています。
パラメーター
必須
説明
disk_hdfs
はい
ディスクの名前。カスタム名を指定できます。
type
はい
ディスクのタイプ。hdfs に設定します。
endpoint
はい
HDFSサービスのエンドポイント。
重要ほとんどの場合、HDFSサービスのエンドポイントはNameNodeのアドレスです。ほとんどの場合、NameNodeが高可用性(HA)モードでデプロイされている場合、HDFSサービスのポート番号は 8020 です。それ以外の場合、HDFSサービスのポート番号は 9000 です。
min_bytes_for_seek
いいえ
シーク操作によって実行される最小の正のシークオフセット。正のシークオフセットがこのパラメーターの値より小さい場合、シーク操作の代わりにスキップ操作が実行されます。デフォルト値:1048576。
thread_pool_size
いいえ
ディスク内の復元要求を処理するために使用されるスレッドプールのサイズ。デフォルト値:16。
objects_chunk_size_to_delete
いいえ
同時に削除できるHDFSファイルの最大数。デフォルト値:1000。
[policies] にストレージポリシーを追加します。
サンプルコード:
<hdfs_ttl> <volumes> <local> <!-- デフォルトのストレージポリシーを使用するすべてのディスクを含めます。 --> <disk>disk1</disk> <disk>disk2</disk> <disk>disk3</disk> <disk>disk4</disk> </local> <remote> <disk>disk_hdfs</disk> </remote> </volumes> <move_factor>0.2</move_factor> </hdfs_ttl>説明上記のコードをデフォルトのストレージポリシーに追加することもできます。
構成を保存します。
[保存] をクリックします。
表示されるダイアログボックスで、[実行理由] パラメーターを構成し、[構成を保存して配信] スイッチをオンにして、[保存] をクリックします。
クライアント構成をデプロイします。
ClickHouseサービスページの [構成] タブで、[クライアント構成のデプロイ] をクリックします。
表示されるダイアログボックスで、[実行理由] パラメーターを構成し、[OK] をクリックします。
[確認] メッセージで、[OK] をクリックします。
手順 2:構成を確認する
SSHモードでClickHouseクラスターにログインします。詳細については、「クラスターへのログイン」をご参照ください。
次のコマンドを実行して、ClickHouseクライアントを起動します:
clickhouse-client -h core-1-1 -m説明サンプルコマンドでは、core-1-1 はログインするコアノードの名前を示しています。複数のコアノードがある場合は、いずれかのノードにログインできます。
次のステートメントを実行して、ディスク情報を表示します。
select * from system.disks;次の出力が返されます。
┌─name─────┬─path─────────────────────────────────┬───────────free_space─┬──────────total_space─┬─keep_free_space─┬─type──┐ │ default │ /var/lib/clickhouse/ │ 83868921856 │ 84014424064 │ 0 │ local │ │ disk1 │ /mnt/disk1/clickhouse/ │ 83858436096 │ 84003938304 │ 10485760 │ local │ │ disk2 │ /mnt/disk2/clickhouse/ │ 83928215552 │ 84003938304 │ 10485760 │ local │ │ disk3 │ /mnt/disk3/clickhouse/ │ 83928301568 │ 84003938304 │ 10485760 │ local │ │ disk4 │ /mnt/disk4/clickhouse/ │ 83928301568 │ 84003938304 │ 10485760 │ local │ │ disk_hdfs│ /var/lib/clickhouse/disks/disk_hdfs/ │ 18446744073709551615 │ 18446744073709551615 │ 0 │ hdfs │ └──────────┴──────────────────────────────────────┴──────────────────────┴──────────────────────┴─────────────────┴───────┘次のステートメントを実行して、ディスクストレージポリシーを表示します。
select * from system.storage_policies;次の出力が返されます。
┌─policy_name──┬─volume_name─┬─volume_priority─┬─disks──────────────────────────────┬─volume_type─┬─max_data_part_size─┬─move_factor─┬─prefer_not_to_merge─┐ │ default │ single │ 1 │ ['disk1','disk2','disk3','disk4'] │JBOD │ 0 │ 0 │ 0 │ │ hdfs_ttl │ local │ 1 │ ['disk1','disk2','disk3','disk4'] │JBOD │ 0 │ 0.2 │ 0 │ │ hdfs_ttl │ remote │ 2 │ ['disk_hdfs'] │JBOD │ 0 │ 0.2 │ 0 │ └──────────────┴─────────────┴─────────────────┴───────────────────────────────────┴─────────────┴────────────────────┴─────────────┴─────────────────────┘上記の出力が返された場合、HDFSディスクが追加されています。
手順 3:ホットデータとコールドデータを分離する
既存のテーブルを再構築する
現在のストレージポリシーを表示します。
ClickHouseクライアントで次のコマンドを実行して、ディスク情報を表示します。
SELECT storage_policy FROM system.tables WHERE database='<database_name>' AND name='<table_name>';上記のコマンドで、
<database_name>はデータベース名、<table_name>はテーブル名を示します。次の出力が返された場合、次の手順を実行してボリュームを追加する必要があります。
<default> <volumes> <single> <disk>disk1</disk> <disk>disk2</disk> <disk>disk3</disk> <disk>disk4</disk> </single> </volumes> </default>
ボリュームを追加します。
EMRコンソールのClickHouseサービスページの [構成] タブで、[volumes] にボリュームを追加します。サンプルコード:
<default> <volumes> <single> <disk>disk1</disk> <disk>disk2</disk> <disk>disk3</disk> <disk>disk4</disk> </single> <!-- remote という名前の次のボリュームが追加されます。 --> <remote> <disk>disk_hdfs</disk> </remote> </volumes> <!-- 複数のボリュームを追加する場合は、move_factor を指定します。 --> <move_factor>0.2</move_factor> </default>次のコマンドを実行して、Time to Live(TTL)を変更します。
ALTER TABLE <yourDataName>.<yourTableName> MODIFY TTL toStartOfMinute(addMinutes(t, 5)) TO VOLUME 'remote';次のコマンドを実行して、各データパートの分布を表示します。
select partition,name,path from system.parts where database='<yourDataName>' and table='<yourTableName>' and active=1次の出力が返されます。
┌─partition───────────┬─name─────────────────┬─path──────────────────────────────────────────────────────────────────────────────────────────────────┐ │ 2022-01-12 11:30:00 │ 1641958200_1_96_3 │ /var/lib/clickhouse/disks/disk_hdfs/store/156/156008ff-41bf-460c-8848-e34fad88c25d/1641958200_1_96_3/ │ │ 2022-01-12 11:35:00 │ 1641958500_97_124_2 │ /mnt/disk3/clickhouse/store/156/156008ff-41bf-460c-8848-e34fad88c25d/1641958500_97_124_2/ │ │ 2022-01-12 11:35:00 │ 1641958500_125_152_2 │ /mnt/disk4/clickhouse/store/156/156008ff-41bf-460c-8848-e34fad88c25d/1641958500_125_152_2/ │ │ 2022-01-12 11:35:00 │ 1641958500_153_180_2 │ /mnt/disk1/clickhouse/store/156/156008ff-41bf-460c-8848-e34fad88c25d/1641958500_153_180_2/ │ │ 2022-01-12 11:35:00 │ 1641958500_181_186_1 │ /mnt/disk4/clickhouse/store/156/156008ff-41bf-460c-8848-e34fad88c25d/1641958500_181_186_1/ │ │ 2022-01-12 11:35:00 │ 1641958500_187_192_1 │ /mnt/disk3/clickhouse/store/156/156008ff-41bf-460c-8848-e34fad88c25d/1641958500_187_192_1/ │ └─────────────────────┴──────────────────────┴───────────────────────────────────────────────────────────────────────────────────────────────────────┘ 6 rows in set. Elapsed: 0.002 sec.説明上記の出力が返された場合、TTLに基づいてホットデータとコールドデータが分離されています。ホットデータはローカルディスクに保存され、コールドデータはHDFSに保存されます。
/var/lib/clickhouse/disks/disk_hdfs は、HDFSディスクのメタデータを保存するパスです。/mnt/disk{1..4}/clickhouse は、ローカルディスクのパスです。
テーブルを作成する
構文
CREATE TABLE <yourDataName>.<yourTableName> [ON CLUSTER cluster_emr] ( column1 Type1, column2 Type2, ... ) Engine = MergeTree() -- Replicated*MergeTree タイプのエンジンも使用できます。 PARTITION BY <yourPartitionKey> ORDER BY <yourPartitionKey> TTL <yourTtlKey> TO VOLUME 'remote' SETTINGS storage_policy='hdfs_ttl';説明上記のコマンドで、<yourPartitionKey> はClickHouseクラスター内のテーブルのパーティションキーを示します。<yourTtlKey> は指定するTTLを示します。
サンプルコード
CREATE TABLE test.test ( `id` UInt32, `t` DateTime ) ENGINE = MergeTree() PARTITION BY toStartOfFiveMinute(t) ORDER BY id TTL toStartOfMinute(addMinutes(t, 5)) TO VOLUME 'remote' SETTINGS storage_policy='hdfs_ttl';説明この例では、test.test という名前のテーブルは、最後の 5 分間のデータのみをローカルディスクに保存します。データが生成されて 5 分後、データはHDFSにある remote という名前のボリュームに移動されます。
その他のパラメーター
[server-config]
merge_tree.allow_remote_fs_zero_copy_replication:true に設定します。これにより、Replicated*MergeTreeタイプのエンジンは、HDFSディスクを指すメタデータを複製して、ClickHouseクラスター内の同じシャードに対して複数のメタデータレプリカを生成します。
[server-users]
profile.${your-profile-name}.hdfs_replication:HDFSで生成されるデータレプリカの数を指定します。