すべてのプロダクト
Search
ドキュメントセンター

E-MapReduce:HDFS を使用したホットデータとコールドデータの分離

最終更新日:Jan 11, 2025

このトピックでは、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. 手順 1:EMRコンソールでHDFSディスクを追加する

  2. 手順 2:構成を確認する

  3. 手順 3:ホットデータとコールドデータを分離する

手順 1:EMRコンソールでHDFSディスクを追加する

  1. クラスターのClickHouseサービスページの[構成] タブに移動します。

    1. EMRコンソールにログインします。左側のナビゲーションペインで、[ECS上のEMR] をクリックします。

    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)モードでデプロイされている場合、HDFSサービスのポート番号は 8020 です。それ以外の場合、HDFSサービスのポート番号は 9000 です。

      min_bytes_for_seek

      いいえ

      シーク操作によって実行される最小の正のシークオフセット。正のシークオフセットがこのパラメーターの値より小さい場合、シーク操作の代わりにスキップ操作が実行されます。デフォルト値:1048576。

      thread_pool_size

      いいえ

      ディスク内の復元要求を処理するために使用されるスレッドプールのサイズ。デフォルト値: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>
      説明

      上記のコードをデフォルトのストレージポリシーに追加することもできます。

  4. 構成を保存します。

    1. [保存] をクリックします。

    2. 表示されるダイアログボックスで、[実行理由] パラメーターを構成し、[構成を保存して配信] スイッチをオンにして、[保存] をクリックします。

  5. クライアント構成をデプロイします。

    1. ClickHouseサービスページの [構成] タブで、[クライアント構成のデプロイ] をクリックします。

    2. 表示されるダイアログボックスで、[実行理由] パラメーターを構成し、[OK] をクリックします。

    3. [確認] メッセージで、[OK] をクリックします。

手順 2:構成を確認する

  1. SSHモードでClickHouseクラスターにログインします。詳細については、「クラスターへのログイン」をご参照ください。

  2. 次のコマンドを実行して、ClickHouseクライアントを起動します:

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

    サンプルコマンドでは、core-1-1 はログインするコアノードの名前を示しています。複数のコアノードがある場合は、いずれかのノードにログインできます。

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

    上記の出力が返された場合、HDFSディスクが追加されています。

手順 3:ホットデータとコールドデータを分離する

既存のテーブルを再構築する

  1. 現在のストレージポリシーを表示します。

    1. 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>
  2. ボリュームを追加します。

    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>
  3. 次のコマンドを実行して、Time to Live(TTL)を変更します。

    ALTER TABLE <yourDataName>.<yourTableName>
      MODIFY TTL toStartOfMinute(addMinutes(t, 5)) TO VOLUME 'remote';
  4. 次のコマンドを実行して、各データパートの分布を表示します。

    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で生成されるデータレプリカの数を指定します。