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

E-MapReduce:OSS を使用してホットデータとコールドデータを分離する

最終更新日:Mar 24, 2025

このトピックでは、オブジェクトストレージサービス(OSS)を使用して、Alibaba Cloud E-MapReduce(EMR)のClickHouseクラスター内のホットデータとコールドデータを分離する方法について説明します。このトピックで説明されている操作は、クラスター内のホットデータとコールドデータを自動的に維持するだけでなく、クラスター内のコンピューティングリソースとストレージリソースを最大限に活用してコストを削減するのにも役立ちます。これらの操作は、クラスターの読み取りパフォーマンスと書き込みパフォーマンスには影響しません。

前提条件

EMR V5.7.0以降のClickHouseクラスターがEMRコンソールで作成されています。詳細については、「ClickHouseクラスターを作成する」をご参照ください。

制限事項

このトピックで説明されている操作は、EMR V5.7.0以降のClickHouseクラスターでのみ実行できます。

手順

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

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

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

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

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

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

    2. 上部のナビゲーションバーで、クラスターが存在するリージョンとリソースグループをビジネス要件に基づいて選択します。

    3. [EMR On ECS] ページで、管理するクラスターを見つけ、[アクション] 列の [サービス] をクリックします。

    4. [サービス] タブで、ClickHouse セクションの [構成] をクリックします。

  2. 構成サーバーメトリカ タブで、 タブをクリックします。

  3. ストレージ構成 パラメーターの値を変更します。

    1. ディスク にディスクを追加します。

      サンプルコード:

      <disk_oss>
          <type>s3</type>
          <endpoint>http(s)://${yourBucketName}.${yourEndpoint}/${yourFlieName}</endpoint>
          <access_key_id>${yourAccessKeyId}</access_key_id>
          <secret_access_key>${yourAccessKeySecret}</secret_access_key>
          <send_metadata>false</send_metadata>
          <metadata_path>${yourMetadataPath}</metadata_path>
          <cache_enabled>true</cache_enabled>
          <cache_path>${yourCachePath}</cache_path>
          <skip_access_check>false</skip_access_check>
          <min_bytes_for_seek>1048576</min_bytes_for_seek>
          <thread_pool_size>16</thread_pool_size>
          <list_object_keys_size>1000</list_object_keys_size>
        </disk_oss>

      次の表は、上記のコードで使用されているパラメーターについて説明しています。

      パラメーター

      必須

      説明

      disk_oss

      はい

      ディスクの名前。カスタム名を指定できます。

      type

      はい

      ディスクのタイプ。S3 に設定します。

      endpoint

      はい

      OSSオブジェクトのURL。http(s)://${yourBucketName}.${yourEndpoint}/${yourFlieName}

      説明

      このパラメーターの値は http または https で始まる必要があります。 ${yourBucketName} は OSS バケットの名前を指定します。 ${yourEndpoint} は OSS バケットのエンドポイントを指定します。 {yourFlieName} は OSS バケット内のオブジェクトの名前を指定します。たとえば、このパラメーターを http://clickhouse.oss-cn-hangzhou-internal.aliyuncs.com/test に設定できます。

      の形式です。

      access_key_id

      はい

      Alibaba CloudアカウントのAccessKey ID。

      AccessKey IDを取得する方法の詳細については、「AccessKey ペアの取得」をご参照ください。

      secret_access_key

      はい

      Alibaba CloudアカウントのAccessKeyシークレット。

      AccessKeyシークレットは、署名文字列の暗号化と検証に使用されます。AccessKeyシークレットを取得する方法の詳細については、「AccessKey ペアの取得」をご参照ください。

      send_metadata

      いいえ

      OSSオブジェクトに対して操作を実行するときにメタデータを追加するかどうかを指定します。有効な値:

      • true:OSSオブジェクトに対して操作を実行するときにメタデータが追加されます。

      • false:OSSオブジェクトに対して操作を実行するときにメタデータは追加されません。これがデフォルト値です。

      metadata_path

      いいえ

      ローカルファイルとOSSオブジェクト間のマッピングを格納するパス。

      デフォルト値:${path}/disks/<disk_name>/

      説明

      <disk_name> は、追加するディスクの名前を指定します。<disk_name> は、disk_oss パラメーターに対応します。

      cache_enabled

      いいえ

      データキャッシュ機能を有効にするかどうかを指定します。有効な値:

      • true:データキャッシュ機能を有効にします。これがデフォルト値です。

      • false:データキャッシュ機能を無効にします。

      データキャッシュ機能には次の利点があります:

      • OSSのデータキャッシュ機能は、.idx.mrk.mrk2.mrk3.txt.dat、、、、、 形式のオブジェクトのみをローカルにキャッシュするために使用できます。他の形式のオブジェクトは、ローカルキャッシュではなくOSSからアクセスされます。

      • ローカルキャッシュの容量は、ストレージディスクの容量によって異なります。

      • ローカルキャッシュ内のデータは、Least Recently Used(LRU)アルゴリズムなどのキャッシュエビクションアルゴリズムを使用してクリアされません。ローカルキャッシュの存在は、オブジェクトの有効期限(TTL)に依存します。

      • 初めてOSSから読み取るデータがローカルキャッシュに存在しない場合は、データを含むオブジェクトをOSSからローカルキャッシュにダウンロードできます。

      • 初めてデータを書き込むとき、データはローカルキャッシュのみに書き込まれます。その後、データはローカルキャッシュからOSSに書き込まれます。

      • OSSからオブジェクトを削除すると、オブジェクトはローカルキャッシュから自動的に削除されます。OSSでオブジェクトの名前を変更すると、オブジェクトはローカルキャッシュで自動的に名前が変更されます。

      cache_path

      いいえ

      ローカルキャッシュのパス。

      既定値: ${path}/disks/<disk_name>/cache/ です。

      skip_access_check

      いいえ

      ディスクのロード時に、ディスクに対する読み取り権限と書き込み権限があるかどうかを確認するかどうかを指定します。有効な値:

      • true:システムは権限があるかどうかを確認します。これがデフォルト値です。

      • false:システムは権限があるかどうかを確認しません。

      min_bytes_for_seek

      いいえ

      シーク操作を実行するために必要な最小バイト数。バイト数がこのパラメーターの値より少ない場合、シーク操作の代わりにスキップ操作が実行されます。デフォルト値: 1048576 。

      thread_pool_size

      いいえ

      ディスク内の 復元 リクエストを処理するために使用されるスレッドプールのサイズ。デフォルト値: 16 。

      list_object_keys_size

      いいえ

      オブジェクトディレクトリに同時にリストできるオブジェクトの最大数。デフォルト値: 1000 。

    2. ポリシー にストレージポリシーを追加します。

      サンプルコード:

      <oss_ttl>
          <volumes>
            <local>
              <!-- デフォルトのストレージポリシーを使用するすべてのディスクを含めます。 -->
              <disk>disk1</disk>
              <disk>disk2</disk>
              <disk>disk3</disk>
              <disk>disk4</disk>
            </local>
            <remote>
              <disk>disk_oss</disk>
            </remote>
          </volumes>
          <move_factor>0.2</move_factor>
      </oss_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_oss │ /var/lib/clickhouse/disks/disk_oss/ │ 18446744073709551615 │ 18446744073709551615 │               0 │ oss   │
    └──────────┴─────────────────────────────────────┴──────────────────────┴──────────────────────┴─────────────────┴───────┘
                                
  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 │
    │ oss_ttl     │ local       │               1 │ ['disk1','disk2','disk3','disk4']          │JBOD        │                  0 │          0.2 │                   0 │
    │ oss_ttl     │ remote      │               2 │ ['disk_oss']                         │JBOD        │                  0 │          0.2 │                   0 │
    └─────────────┴─────────────┴─────────────────┴───────────────────────────────────┴─────────────┴────────────────────┴─────────────┴─────────────────────┘

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

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

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

  1. ClickHouseクライアントで次のステートメントを実行して、現在のストレージポリシーを表示します。

    SELECT
      storage_policy
    FROM system.tables
    WHERE database='<yourDatabaseName>' AND name='<yourTableName>';

    上記のステートメントでは、<yourDataName> はデータベース名を指定します。<yourTableName> はテーブル名を指定します。

    次の出力が返された場合、次の手順を実行してボリュームを追加する必要があります:

    <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_oss</disk>
        </remote>
      </volumes>
      <!-- 複数のボリュームを追加する場合は、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. 次のステートメントを実行して、各データパートの分布を表示します。

    select partition,name,path from system.parts where database='<yourDataName>' and table='<yourTableName>' and active=1

    次の出力が返されます:

    
    ┌─partition───────────┬─name─────────────────────┬─path──────────────────────────────────────────────────────────────────────────────────────────────────────┐
    │ 2022-01-11 19:55:00 │ 1641902100_1_90_3_193    │ /var/lib/clickhouse/disks/disk_oss/store/fc5/fc50a391-4c16-406b-a396-6e1104873f68/1641902100_1_90_3_193/  │
    │ 2022-01-11 19:55:00 │ 1641902100_91_96_1_193   │ /var/lib/clickhouse/disks/disk_oss/store/fc5/fc50a391-4c16-406b-a396-6e1104873f68/1641902100_91_96_1_193/ │
    │ 2022-01-11 20:00:00 │ 1641902400_97_124_2_193  │ /mnt/disk3/clickhouse/store/fc5/fc50a391-4c16-406b-a396-6e1104873f68/1641902400_97_124_2_193/             │
    │ 2022-01-11 20:00:00 │ 1641902400_125_152_2_193 │ /mnt/disk2/clickhouse/store/fc5/fc50a391-4c16-406b-a396-6e1104873f68/1641902400_125_152_2_193/            │
    │ 2022-01-11 20:00:00 │ 1641902400_153_180_2_193 │ /mnt/disk4/clickhouse/store/fc5/fc50a391-4c16-406b-a396-6e1104873f68/1641902400_153_180_2_193/            │
    │ 2022-01-11 20:00:00 │ 1641902400_181_186_1_193 │ /mnt/disk3/clickhouse/store/fc5/fc50a391-4c16-406b-a396-6e1104873f68/1641902400_181_186_1_193/            │
    │ 2022-01-11 20:00:00 │ 1641902400_187_192_1_193 │ /mnt/disk4/clickhouse/store/fc5/fc50a391-4c16-406b-a396-6e1104873f68/1641902400_187_192_1_193/            │
    └─────────────────────┴──────────────────────────┴───────────────────────────────────────────────────────────────────────────────────────────────────────────┘
    
    7 rows in set. Elapsed: 0.002 sec.
    説明

    上記の出力が返された場合、TTLに基づいてホットデータとコールドデータが分離されます。ホットデータはローカルディスクに格納され、コールドデータはOSSに格納されます。

    /var/lib/clickhouse/disks/disk_oss は、OSS ディスクの metadata_path パラメーターのデフォルト値です。/mnt/disk{1..4}/clickhouse は、ローカルディスクのパスです。

テーブルを作成する

  • 構文

    CREATE TABLE <yourDataName>.<yourTableName> [ON CLUSTER cluster_emr]
    (
      column1 Type1,
      column2 Type2,
      ...
    ) Engine = MergeTree() -- or Replicated*MergeTree()
    PARTITION BY <yourPartitionKey>
    ORDER BY <yourPartitionKey>
    TTL <yourTtlKey> TO VOLUME 'remote'
    SETTINGS storage_policy='oss_ttl';
    説明

    上記の構文で、<パーティションキー><yourTtlKey> は ClickHouseクラスター内のテーブルのパーティションキーを指定します。 は指定する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='oss_ttl';
    説明

    この例では、test.test という名前のテーブルは、過去 5 分間のデータのみをローカルディスクに格納します。データは生成されてから 5 分後に、OSSの remote という名前のボリュームに移動されます。

その他のパラメーター

  • サーバー構成

    merge_tree.allow_remote_fs_zero_copy_replication: 値を true に設定します。これにより、Replicated*MergeTree タイプのエンジンは、OSS ディスクを指すメタデータを複製して、ClickHouse クラスタ内の同じシャードに対して複数のメタデータレプリカを生成します。

  • サーバーユーザー

    • profile.${your-profile-name}.s3_min_upload_part_size: 書き込みバッファー内のデータ量がこのパラメーターの値よりも大きい場合、データは OSS に書き込まれます。

    • profile.${your-profile-name}.s3_max_single_part_upload_size}: 書き込みバッファー内のデータ量がこのパラメーターの値よりも大きい場合、[分片上传(MultipartUpload)][Multipart upload] 操作が使用されます。詳細については、「」をご参照ください。