全部產品
Search
文件中心

E-MapReduce:使用HDFS進行資料冷熱分離

更新時間:Oct 23, 2024

本文為您介紹在阿里雲E-MapReduce的ClickHouse叢集上,如何通過HDFS進行資料的冷熱分離。通過本文操作,您既可以在保證叢集讀寫效能的基礎上,自動維護叢集上的冷熱資料,又可以充分利用計算和儲存資源,以降低成本。

前提條件

  • 已在EMR控制台上建立EMR-5.5.0及以上版本的ClickHouse叢集,詳情請參見建立ClickHouse叢集

  • 在同一VPC下具有一個HDFS服務(例如,EMR Hadoop叢集)。

  • 擁有HDFS服務的讀寫權限。

使用限制

本文操作僅適用於EMR-5.5.0及以上版本的ClickHouse叢集。

操作流程

  1. 步驟一:在EMR控制台添加磁碟

  2. 步驟二:驗證配置

  3. 步驟三:進行冷熱分離

步驟一:在EMR控制台添加磁碟

  1. 進入ClickHouse配置頁面。

    1. 登入EMR on ECS控制台

    2. 在頂部功能表列處,根據實際情況選擇地區和資源群組

    3. EMR on ECS頁面,單擊目的地組群操作列的叢集服務

    4. 叢集服務頁面,單擊ClickHouse服務地區的配置

  2. 配置頁簽,單擊server-metrika頁簽。

  3. 修改storage_configuration的參數值。

    1. 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。

    2. 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策略中。

  4. 儲存配置。

    1. 在ClickHouse服務的配置頁面,單擊儲存

    2. 修改資訊對話方塊中,輸入執行原因,開啟儲存並下發配置開關,單擊儲存

  5. 部署用戶端配置。

    1. 在ClickHouse服務的配置頁面,單擊部署用戶端配置

    2. 部署CLICKHOUSE用戶端配置對話方塊中,輸入執行原因,單擊確定

    3. 確認對話方塊中,單擊確定

步驟二:驗證配置

  1. 使用SSH方式登入ClickHouse叢集,詳情請參見登入叢集

  2. 執行如下命令,啟動ClickHouse用戶端。

    clickhouse-client -h core-1-1 -m
    說明

    本樣本登入core-1-1節點,如果您有多個Core節點,可以登入任意一個節點。

  3. 執行如下命令,查看磁碟資訊。

    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  │
    └──────────┴──────────────────────────────────────┴──────────────────────┴──────────────────────┴─────────────────┴───────┘
                                
  4. 執行如下命令,查看磁碟儲存策略。

    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 │
    └──────────────┴─────────────┴─────────────────┴───────────────────────────────────┴─────────────┴────────────────────┴─────────────┴─────────────────────┘

    當回顯資訊如上文所示時,表示磁碟擴容操作完成。

步驟三:進行冷熱分離

對已有的表進行改造

  1. 查看當前的儲存策略。

    1. 在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>
  2. 擴充當前的儲存策略。

    在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>
  3. 執行以下命令,修改TTL。

    ALTER TABLE <yourDataName>.<yourTableName>
      MODIFY TTL toStartOfMinute(addMinutes(t, 5)) TO VOLUME 'remote';
  4. 執行以下命令,查看各個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上儲存的副本個數。