全部产品
Search
文档中心

开源大数据平台E-MapReduce:使用HDFS进行数据冷热分离

更新时间:Oct 22, 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上存储的副本个数。