本文為您介紹在阿里云E-MapReduce的ClickHouse集群上,如何通過HDFS進行數據的冷熱分離。通過本文操作,您既可以在保證集群讀寫性能的基礎上,自動維護集群上的冷熱數據,又可以充分利用計算和存儲資源,以降低成本。
前提條件
已在EMR控制臺上創建EMR-5.5.0及以上版本的ClickHouse集群,詳情請參見創建ClickHouse集群。
在同一VPC下具有一個HDFS服務(例如,EMR Hadoop集群)。
擁有HDFS服務的讀寫權限。
使用限制
本文操作僅適用于EMR-5.5.0及以上版本的ClickHouse集群。
操作流程
步驟一:在EMR控制臺添加磁盤
進入ClickHouse配置頁面。
在頂部菜單欄處,根據實際情況選擇地域和資源組。
在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模式,其端口通常為8020,否則為9000。
min_bytes_for_seek
否
最小使用Seek的Byte數量,低于該值時會用Skip代Seek。默認值為1048576。
thread_pool_size
否
用于Disk用于執行restore時所使用的線程池的大小。默認值為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>
說明該部分內容也可以直接添加在default策略中。
保存配置。
在ClickHouse服務的配置頁面,單擊保存。
在修改信息對話框中,輸入執行原因,打開保存并下發配置開關,單擊保存。
部署客戶端配置。
在ClickHouse服務的配置頁面,單擊部署客戶端配置。
在部署CLICKHOUSE客戶端配置對話框中,輸入執行原因,單擊確定。
在確認對話框中,單擊確定。
步驟二:驗證配置
使用SSH方式登錄ClickHouse集群,詳情請參見登錄集群。
執行如下命令,啟動ClickHouse客戶端。
clickhouse-client -h core-1-1 -m
說明本示例登錄core-1-1節點,如果您有多個Core節點,可以登錄任意一個節點。
執行如下命令,查看磁盤信息。
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 │ └──────────────┴─────────────┴─────────────────┴───────────────────────────────────┴─────────────┴────────────────────┴─────────────┴─────────────────────┘
當回顯信息如上文所示時,表示磁盤擴容操作完成。
步驟三:進行冷熱分離
對已有的表進行改造
查看當前的存儲策略。
在ClickHouse客戶端執行如下命令,查看磁盤信息。
SELECT storage_policy FROM system.tables WHERE database='<database_name>' AND name='<table_name>';
命令中的
<database_name>
為數據庫名,<table_name>
為表名。如果返回信息如下所示,則需要參見下一步驟添加一個volume。
<default> <volumes> <single> <disk>disk1</disk> <disk>disk2</disk> <disk>disk3</disk> <disk>disk4</disk> </single> </volumes> </default>
擴展當前的存儲策略。
在EMR控制臺ClickHouse服務的配置頁簽,增加volume內容,詳細信息如下。
<default> <volumes> <single> <disk>disk1</disk> <disk>disk2</disk> <disk>disk3</disk> <disk>disk4</disk> </single> <!-- 以下是新增的volume remote --> <remote> <disk>disk_hdfs</disk> </remote> </volumes> <!-- 多個volume時需要指定move_factor --> <move_factor>0.2</move_factor> </default>
執行以下命令,修改TTL。
ALTER TABLE <yourDataName>.<yourTableName> MODIFY TTL toStartOfMinute(addMinutes(t, 5)) TO VOLUME 'remote';
執行以下命令,查看各個part的分布。
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.
說明如果返回信息如上所示,則表明數據根據時間做了冷熱分離。熱數據存放在本地盤中,冷數據存放在HDFS中。
其中,/var/lib/clickhouse/disks/disk_hdfs是disk_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';
說明本示例中,表格會將5分鐘內的數據存放在本地,過了5分鐘后,數據會被移動到remote volume中,也就是HDFS中。
相關配置
server-config
merge_tree.allow_remote_fs_zero_copy_replication:設置為true,以在Replicated*MergeTree使用DiskHDFS等遠程存儲時利用其自身的多副本進行備份,ClickHouse的一個Shard下的多個副本中的數據僅會備份元數據。
server-users
profile.${your-profile-name}.hdfs_replication:設置數據在HDFS上存儲的副本個數。