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

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

最終更新日:Aug 21, 2026

このトピックでは、Alibaba Cloud E-MapReduce (EMR) の ClickHouse クラスターで OSS を使用してホット/コールドデータ分離を実装する方法について説明します。この方法により、ホットデータとコールドデータを自動的に管理し、パフォーマンスを維持しながらコンピューティングリソースとストレージリソースを最適化してコストを削減できます。

前提条件

E-MapReduce (EMR) コンソールで、EMR V5.7.0 以降を実行する ClickHouse クラスターが作成されている必要があります。詳細については、「ClickHouse クラスターの作成」をご参照ください。

制限事項

このトピックで説明する操作は、EMR V5.7.0 以降の ClickHouse クラスターにのみ適用されます。

手順

手順1:EMR コンソールでのディスク追加

  1. ClickHouse サービスの設定ページに移動します。

    1. EMR on ECS コンソールにログインします。

    2. 上部メニューで、リージョンとリソースグループを選択します。

    3. [EMR on ECS] ページで、対象のクラスターを見つけ、Services 列の Services をクリックします。

    4. Services ページで、ClickHouse セクションの Configure をクリックします。

  2. Configure ページで、[server-metrika] タブをクリックします。

  3. [storage_configuration] のパラメーターを変更します。

    1. [ディスク] で、ディスクを追加します。

      次のコードは、必要な設定を示しています。

      <disk_oss>
          <type>s3</type>
          <endpoint>http(s)://${yourBucketName}.${yourEndpoint}/${yourPathPrefix}</endpoint>
          <access_key_id>${YOUR_ACCESS_KEY_ID}</access_key_id>
          <secret_access_key>${YOUR_ACCESS_KEY_SECRET}</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 サービスのエンドポイントです。形式は http(s)://${yourBucketName}.${yourEndpoint}/${yourPathPrefix} です。

      説明

      endpoint パラメーターの値は http または https で始まる必要があります。形式では、${yourBucketName} は OSS バケット名、${yourEndpoint} は OSS エンドポイント、${yourPathPrefix} は 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 Secret です。

      このキーは、OSS の署名文字列を暗号化および検証します。AccessKey Secret の取得方法については、「AccessKey ペアの取得」をご参照ください。

      send_metadata

      いいえ

      OSS ファイルの操作時にメタデータを追加するかどうかを指定します。有効な値:

      • true:メタデータを追加します。

      • false (デフォルト):メタデータを追加しません。

      metadata_path

      いいえ

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

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

      説明

      <disk_name> はディスク名で、この例では disk_oss です。

      cache_enabled

      いいえ

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

      • true (デフォルト):キャッシュを有効にします。

      • false:キャッシュを無効にします。

      キャッシュは次のように機能します。

      • キャッシュは、拡張子が .idx、.mrk、.mrk2、.mrk3、.txt、.dat のファイルのローカルキャッシュにのみ使用されます。他の拡張子のファイルは、キャッシュからではなく OSS から直接読み取られます。

      • ローカルキャッシュには容量制限がありません。最大容量はストレージディスクの容量です。

      • ローカルキャッシュは、最近使用されていない (LRU) などのポリシーによってクリアされません。代わりに、ファイルのライフサイクルにわたって保持されます。

      • データが最初に読み取られるとき、キャッシュにまだ存在しない場合は、OSS からキャッシュにダウンロードされます。

      • データが最初に書き込まれるとき、OSS にアップロードされる前にローカルにキャッシュされます。

      • オブジェクトが OSS から削除されると、ローカルキャッシュからもクリアされます。オブジェクトが OSS で名前変更されると、ローカルキャッシュでも名前変更されます。

      cache_path

      いいえ

      キャッシュパスです。

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

      skip_access_check

      いいえ

      ディスクのロード時に読み取り/書き込み権限のチェックをスキップするかどうかを指定します。有効な値:

      • true:チェックをスキップします。

      • false (デフォルト):チェックを実行します。

      min_bytes_for_seek

      いいえ

      シーク操作の最小バイト数です。値がこのしきい値を下回る場合、直接シークではなく、読み取りとスキップの操作が実行されます。デフォルト値:1048576。

      thread_pool_size

      いいえ

      ディスクが restore コマンドを実行するために使用するスレッドプールのサイズです。デフォルト値: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. ClickHouse サービスのConfigureページで、Deploy Client Configurationをクリックします。

    2. [CLICKHOUSE クライアント設定のデプロイ] ダイアログボックスで、アクションの理由を入力し、OK をクリックします。

    3. Confirm ダイアログボックスで、OK をクリックします。

  5. Deploy the client configuration.

    1. On the [Configure] page of the ClickHouse service, click [Deploy Client Configuration].

    2. In the [Deploy CLICKHOUSE Client Configuration] dialog box, enter a reason for the action and click [OK ].

    3. In the [Confirm] dialog box, click [OK ].

手順2:設定の検証

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

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

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

    この例では、core-1-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 │ s3    │
    └──────────┴─────────────────────────────────────┴──────────────────────┴──────────────────────┴─────────────────┴───────┘
                                
  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 │
    └─────────────┴─────────────┴─────────────────┴───────────────────────────────────┴─────────────┴────────────────────┴─────────────┴─────────────────────┘

    出力がこの例と同様であれば、ディスクは正しく設定されています。

手順3:ホット/コールドデータ分離の実装

既存テーブルの変更

  1. 次のコマンドを実行して、テーブルの現在のストレージポリシーを確認します。

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

    ここで、<yourDatabaseName> はデータベース名、<yourTableName> はテーブル名です。

    コマンドが default を返した場合、テーブルはデフォルトのポリシーを使用しています。次の手順でこのポリシーを拡張できます。

    <default>
      <volumes>
        <single>
          <disk>disk1</disk>
          <disk>disk2</disk>
          <disk>disk3</disk>
          <disk>disk4</disk>
        </single>
      </volumes>
    </default>
  2. 現在のストレージポリシーを拡張します。

    EMR コンソールで、ClickHouse の設定で default ストレージポリシーにリモートボリュームを追加します。

    <default>
      <volumes>
        <single>
          <disk>disk1</disk>
          <disk>disk2</disk>
          <disk>disk3</disk>
          <disk>disk4</disk>
        </single>
        <!-- 以下は新規のリモートボリューム -->
        <remote>
          <disk>disk_oss</disk>
        </remote>
      </volumes>
      <!-- 複数のボリュームがある場合は move_factor を指定する必要があります -->
      <move_factor>0.2</move_factor>
    </default>
  3. 次のコマンドを実行して、古いデータを remote ボリュームに移動する TTL ルールを設定します。

    ALTER TABLE <yourDatabaseName>.<yourTableName>
      MODIFY TTL toStartOfMinute(addMinutes(t, 5)) TO VOLUME 'remote';
  4. 次のコマンドを実行して、ディスク間でのデータパーツの分散を確認します。

    select partition,name,path from system.parts where database='<yourDatabaseName>' 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.
    説明

    出力がこの例と同様の場合、データは時間に基づいてホット層とコールド層に分離されます。ホットデータはローカルディスクに保存され、コールドデータは OSS に保存されます。

    出力では、/var/lib/clickhouse/disks/disk_oss はコールドデータ (metadata_path パラメーターに対応) のパスです。/mnt/disk{1..4}/clickhouse のようなパスは、ローカルディスク (ホットデータ) を指します。

新規テーブルの作成

  • 構文

    CREATE TABLE <yourDatabaseName>.<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='oss_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='oss_ttl';
    説明

    この例では、テーブルは過去 5 分以内に生成されたデータをローカルディスクに保存します。5 分後、ClickHouse はデータをリモートボリュームである OSS に移動します。

関連設定

  • server-config

    merge_tree.allow_remote_fs_zero_copy_replication:true に設定すると、リモートストレージ (DiskOSS など) 上の Replicated*MergeTree テーブルがデータパーツを共有できるようになります。レプリカ間でデータをコピーする代わりに、各レプリカは OSS 上の共有データを指す独自のメタデータのみを保存します。

  • server-users

    • profile.${your-profile-name}.s3_min_upload_part_size:OSS へのマルチパートアップロードにおける単一パーツの最小サイズです。

    • profile.${your-profile-name}.s3_max_single_part_upload_size:書き込みバッファー内のデータ量がこの値を超えると、ClickHouse はマルチパートアップロードを使用します。詳細については、「」をご参照ください。