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

E-MapReduce:EMR HBase クラスタのデータをオンラインで移行する

最終更新日:Jun 10, 2025

このソリューションは、HBase スナップショットと HBase レプリケーションの技術を組み合わせて、ソース HBase クラスタがサービス中のまま既存データと増分データの両方をオンラインで移行し、移行プロセス中のデータ損失を防ぎます。

ソリューション概要

スナップショットベースのアプローチは HBase からのオフライン移行のみをサポートし、ソースクラスタをオンラインに保つことはできません。移行中もソースクラスタは引き続き実行されるため、以下のエラーが発生する可能性があります。

  • 増分データの損失: スナップショットのエクスポートとリストア中に、ソースクラスタで生成された書き込みまたは更新操作がターゲットクラスタに同期されない可能性があります。

  • データ整合性の問題: スナップショットのみに依存すると、移行中のリアルタイムの増分データを処理できません。

以下のソリューションでこれらの問題を解決できます。

  1. レプリケーション関係 (ピア) を確立する:

    • HBase レプリケーションを使用して、ソースクラスタとターゲットクラスタの間にテーブルレベルのレプリケーション関係を確立します。レプリケーション中は自動同期を無効にします。

    • ソースクラスタはテーブルのリアルタイムの書き込みおよび更新操作を記録しますが、ターゲットクラスタにはすぐに同期しません。

  2. 既存データを移行する:

    • HBase スナップショットを使用して、ソースクラスタから既存データをエクスポートします。

    • ソースクラスタとターゲットクラスタのストレージシステム (HDFS や OSS-HDFS など) が相互接続されている場合は、スナップショットをターゲットクラスタにエクスポートします。そうでない場合は、最初にソースクラスタの中間パスにエクスポートしてから、ターゲットクラスタに同期します。

  3. 増分データを同期する: 既存データのリストアが完了したら、レプリケーションピアの自動同期機能を有効にします。移行中に生成された増分データが再生され、ソースとターゲット間のデータ整合性が確保されます。

これらの手順により、このソリューションはソースクラスタの継続的な運用を確保しながら、既存データと増分データの両方を完全に移行し、データ損失を回避します。

注意事項

  • HBase バージョンの互換性:

    • HBase 1.x バージョン: hbase.replication=true を設定し、プライマリクラスタとバックアップクラスタを再起動して、レプリケーション機能を有効にします。

    • HBase 2.x バージョン: hbase.replication パラメータはデフォルトで削除されています。追加の設定は必要ありません。

  • レプリケーション構成: HBase はカラムファミリーに基づいてレプリケーションを構成します。特定のカラムファミリーのデータを移行する必要がある場合は、レプリケーションプロパティが正しく構成されていることを確認してください。

  • ネットワーク接続:

    • CEN、専用回線、または VPN を介して、ソース HBase クラスタとターゲット HBase クラスタ間のネットワーク接続を確保します。

    • 事前にソースクラスタとターゲットクラスタ間のネットワーク接続を確立し、以下のポートがソースクラスタに対して開かれていることを確認します。

      • Zookeeper サービスポート: Zookeeper のターゲットクラスタの ECS インスタンスのポート 2181 です。

      • HBase サービスポート: EMR HBase のターゲットクラスタがある ECS インスタンスのポート 1601016020、および 16030 です。

手順

ステップ 1: ピア (レプリケーション関係) を作成する

ソースクラスタとターゲットクラスタの間にテーブルレベルのレプリケーション関係を確立し、既存のスナップショットデータの同期が完了するまで自動同期を一時的に無効にします。

  1. ソースクラスタのマスターノードにログオンします。詳細については、「クラスタにログオンする」をご参照ください。

  2. 次のコマンドを実行して、HBase シェルに入ります。

    hbase shell
  3. ピア (レプリケーション関係) を追加します。

    HBase シェルで次のコマンドを実行して、ターゲットクラスタにピアを追加します。移行するテーブルを指定します。

    add_peer '${peer_name}', CLUSTER_KEY => "${slave_zk}:${port}:/hbase", TABLE_CFS => { "${table_name}" => [] }

    パラメータ:

    • ${peer_name}: レプリケーション関係の名前。カスタマイズできます。この例では、peer1 です。

    • ${slave_zk}: ターゲットクラスタ ZooKeeper のアドレス。これは通常、複数の ZooKeeper ノードの内部 IP アドレスまたはホスト名です。その形式は {slave_zk1}:2181,{slave_zk2}:2181,{slave_zk3}:2181 です。

    • ${port}: ターゲットクラスタ ZooKeeper のポート。デフォルトポートは 2181 です。

    • ${table_name}: 移行するテーブルの名前。この例では、t1 です。

  4. テーブルレベルのレプリケーションを有効にします。

    テーブルレベルのレプリケーションを有効にして、指定されたテーブルが書き込まれたデータをターゲットクラスタに同期できるようにします。

    enable_table_replication 't1'
  5. 自動同期を一時的に無効にします。

    このコマンドは、指定されたピアのデータレプリケーションプロセスを一時停止するために使用されます。無効にすると、ソースクラスタは新しいデータ更新をターゲットクラスタに送信しなくなります。既存のデータは削除または影響を受けません。

    disable_peer 'peer1'

ステップ 2: スナップショットを作成する

ソースクラスタの HBase シェルで次のコマンドを実行して、スナップショットを作成します。移行するテーブルの既存データがエクスポートされます。

snapshot '${table_name}', '${snapshot_name}'
  • パラメータ:

    • ${table_name}: 移行するテーブルの名前。この例では t1 です。

    • ${snapshot_name}: カスタムスナップショット名。この例では t1-snapshot です。

  • 例:

    snapshot 't1', 't1-snapshot'

ステップ 3: スナップショットをターゲットクラスタにエクスポートする

シナリオ 1: ソースクラスタとターゲットクラスタのストレージシステムが相互接続されている

ソースクラスタとターゲットクラスタのストレージシステムが相互接続されている場合は、ソースクラスタで次のコマンドを実行します。スナップショットはターゲットクラスタに直接エクスポートされます。

hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot ${snapshot_name} -copy-to ${target_rootdir_path}
  • パラメータ:

    • ${snapshot_name}: カスタムスナップショット名。この例では t1-snapshot です。

    • ${target_rootdir_path}: ターゲットクラスタ HBase のルートディレクトリパス。実際の状況に応じて置き換えてください。

      • OSS-HDFS: コンソールからターゲットクラスタの [HBase] サービスを確認し、[hbase-site.xml] ファイルの [hbase.rootdir] 設定項目を表示して、詳細なパス情報を取得できます。

        image

      • HDFS: コンソールからターゲットクラスタの [Hadoop-Common] サービスを確認し、[core-site.xml][fs.defaultFS] 設定項目を表示して、詳細なパス情報を取得できます。

  • 例:

    hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot t1-snapshot -copy-to oss://xxx.cn-hangzhou.oss-dls.aliyuncs.com/hbase/c-9d34bc8fxxx

シナリオ 2: ソースクラスタとターゲットクラスタのストレージシステムが相互接続されていない

ソースクラスタがターゲットクラスタのストレージパスに直接アクセスできない場合は、最初にスナップショットをソースクラスタの中間パス (HDFS や OSS など) にエクスポートする必要があります。次に、ターゲットクラスタに同期します。この例では、HDFS から OSS-HDFS にデータを移行する方法を示します。

  1. スナップショットを中間パスにエクスポートします。

    ソース HBase クラスタで次のコマンドを実行して、スナップショットをソースクラスタの中間パスにエクスポートします。

    hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot ${snapshot_name} -copy-to ${src_temp_path}/${table_name}
    • パラメータ:

      • ${snapshot_name}: カスタムスナップショット名。この例では t1-snapshot です。

      • ${src_temp_path}: ソースクラスタの中間パス。たとえば、ソースクラスタが HDFS を使用している場合は、HDFS パスを中間パスとして選択できます。

      • ${table_name}: 移行するテーブルの名前。この例では t1 です。

    • 例:

      hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot t1-snapshot -copy-to hdfs:///tmp/hbase-snapshot/t1
  2. データをターゲットパスに移行します。

    次のコマンドを実行して、JindoDistCp ツールを使用して、ソースクラスタの中間パスからターゲットクラスタのパスにデータを移行します。JindoDistCp の詳細については、「JindoDistCp ユーザーガイド」をご参照ください。

    1. E-MapReduce (EMR) コンソールにログオンし、OSS または OSS-HDFS にアクセスするために使用する AccessKey ペアを指定します。

      使用時に何度も入力する必要がないように、[Hadoop-Common] サービスの [core-site.xml] タブに次の設定項目を追加します。設定項目の追加に関する具体的な操作については、「設定項目を管理する」をご参照ください。

      パラメータ

      説明

      fs.oss.accessKeyId

      OSS/OSS-HDFS の AccessKey ID。

      fs.oss.accessKeySecret

      OSS/OSS-HDFS の AccessKey Secret。

    2. ソース HBase クラスタで、jindo-distcp-tool-*.jar があるディレクトリに移動します。

      cd /opt/apps/JINDOSDK/jindosdk-current/tools
      説明
      • EMR クラスタ: EMR-5.6.0 以降のバージョン、EMR-3.40.0 以降のバージョンには JindoDistCp がデプロイされており、/opt/apps/JINDOSDK/jindosdk-current/tools ディレクトリに jindo-distcp-tool-*.jar としてあります。

      • EMR 以外のクラスタ: JindoSDK (JindoDistCp ツールを含む) を自分でダウンロードできます。詳細については、「JindoSDK をダウンロード、インストール、およびアップグレードする」をご参照ください。

    3. 次のコマンドを実行して、スナップショットをターゲット HBase クラスタに移行します。

      hadoop jar jindo-distcp-tool-*.jar --src ${src_temp_path}/${table_name} --dest ${target_temp_path}/${table_name} --disableChecksum --parallelism 10 
      • パラメータ:

        • ${src_temp_path}: ソースクラスタの中間パス。

        • ${target_temp_path}: ターゲットクラスタの中間パス。

        • ${target_bucket}: ターゲットバケット名。

      • 例:

        hadoop jar jindo-distcp-tool-4.6.11.jar --src hdfs:///tmp/hbase-snapshot/t1 --dest oss://hbase-test.cn-hangzhou.oss-dls.aliyuncs.com/hbase/recv/t1 --disableChecksum --parallelism 10
    4. スナップショットをターゲット HBase クラスタにインポートします。

      ターゲット HBase クラスタで次のコマンドを実行して、ターゲットパスから HBase ルートディレクトリにスナップショットをインポートします。

      hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot ${snapshot_name} -copy-from ${target_temp_path} -copy-to ${target_rootdir_path}
      • パラメータ:

        • ${target_temp_path}: ターゲットクラスタの一時パス。

        • ${target_rootdir_path}: ターゲット HBase クラスタのルートディレクトリパス。

          コンソールからターゲットクラスタの [HBase] サービスを確認し、[hbase-site.xml] ファイルの [hbase.rootdir] 設定項目を表示して、詳細なパス情報を取得できます。

      • 例:

        hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot t1-snapshot -copy-from oss://hbase-test.cn-hangzhou.oss-dls.aliyuncs.com/hbase/recv/t1 -copy-to oss://hbase-target.cn-hangzhou.oss-dls.aliyuncs.com/hbase/c-5418ce2a4xxx
  3. 移行結果を確認します。

    移行後、次のコマンドを使用して、ターゲットパスのデータが完全かどうかを確認できます。

    hdfs dfs -ls ${target_rootdir_path}

ステップ 4: スナップショットを使用して既存データをリストアする

  1. ターゲットクラスタのマスターノードにログオンします。詳細については、「クラスタにログオンする」をご参照ください。

  2. 次のコマンドを実行して HBase シェルに入ります。

    hbase shell
  3. 次のコマンドを実行して、スナップショットをリストアし、ターゲットクラスタでテーブルを有効にします。

    restore_snapshot '${snapshot_name}'
    enable '${table_name}'
    • パラメータ:

      • ${snapshot_name}: カスタムスナップショット名。

      • ${table_name}: 移行するテーブルの名前。

    • 例:

      restore_snapshot 't1-snapshot'
      enable 't1'

ステップ 5: 増分データ同期を有効にする

ソースクラスタの HBase シェルで次のコマンドを実行して、ピア同期を有効にします。

enable_peer '${peer_name}'

例:

enable_peer 'peer1'

ステップ 6: データを確認する

移行後にデータが完全かどうかを確認します。

  • 小規模データ量: 確認には Scan を使用します。

    scan '${table_name}'

    例:

    scan 't1'
  • 中規模データ量: 確認には count を使用します。

    count '${table_name}'
  • 大規模データ量: サンプル確認には get を使用します。

    get '${table_name}', '${rowkey}'

    コード内の ${rowkey} は、HBase テーブルの各行の一意の識別子です。

ステップ 7: スナップショットを削除する

確認後、次のコマンドを実行して、ターゲットテーブルに関連するすべてのスナップショットを削除し、ストレージ容量を解放します。

delete_table_snapshots '${table_name}'

例:

delete_table_snapshots 't1'

ステップ 8: ピアをクリーンアップする

増分データ同期が完了したら、すべての読み取りおよび書き込みリクエストがターゲット HBase クラスタに切り替えられるように、アプリケーションに対してデュアルライトまたはカットオーバー操作を実行する必要があります。データの重複同期を避けるため、切り替え後にソースクラスタとターゲットクラスタ間のレプリケーション関係 (ピア) を削除する必要があります。

  1. クライアントを移行します。

    HBase クラスタに関連するアップストリームおよびダウンストリームアプリケーション (API またはコマンドラインを介して HBase を読み書きするアプリケーションを含む) をターゲット HBase クラスタに切り替えます。これを行うには、次の操作を実行します。

    • 接続構成を更新する: アプリケーションの設定ファイルまたはコードを変更して、HBase 接続情報 (Zookeeper アドレス、ポートなど) をソースクラスタからターゲットクラスタに切り替えます。

    • 機能を確認する: アプリケーションがターゲットクラスタに正常に読み書きできることを確認します。必要な機能テストとデータ検証を実行します。

    • デュアルランまたはカットオーバー: ビジネス要件に基づいて、デュアルラン (ソースクラスタとターゲットクラスタの両方に同時に読み書き) するか、ターゲットクラスタに直接カットオーバーするかを選択します。

  2. ピアの自動同期機能を無効にします。

    ソースクラスタの HBase シェルで、指定されたピアの自動同期機能を無効にします。データ同期がすぐに停止することを確認します。

    disable_peer '${peer_name}'

    例:

    disable_peer 'peer1'
  3. ピアを削除します。

    ピアを無効にした後、ピアを削除して、ソースクラスタとターゲットクラスタ間のレプリケーション関係を完全に切断します。

    remove_peer '${peer_name}'

    例:

    remove_peer 'peer1'
  4. ピアが正常に削除されたかどうかを確認します。

    次のコマンドを実行して、現在のすべてのピアをリストし、この例の peer1 が削除されていることを確認します。

    list_peers

FAQ

ExportSnapshot がエラーを報告するのはなぜですか?

HBase ExportSnapshot ツールを使用してスナップショットを移行する場合、-copy-from-copy-to のパスを正しく設定します。パスが正しく構成されていない場合、転送が中断されるか、パスの解析に失敗してタスクが失敗する可能性があります。

考えられる原因

  • パスの形式エラー:

    • プロトコル ヘッダー (hdfs:// または oss:// など) がありません。

    • パスに完全なアドレス情報 (NameNode アドレスまたはバケット名など) が含まれていません。

  • ストレージ サービスの違い: 異なるストレージ サービス (HDFS、OSS-HDFS、OSS など) では、パスの形式に異なる要件があります。

  • 権限の問題: ソース パスまたはターゲット パスのアクセス権限が不十分なため、データの読み取りまたは書き込みができません。

解決策

シナリオ

説明

パス形式

OSS-HDFS → OSS-HDFS

Alibaba Cloud OSS-HDFS サービス間でスナップショットを移行します。

  • ソースパス: oss://<bucket>.<region>.oss-dls.aliyuncs.com/<path>

  • ターゲットパス: ソースパスと同じ形式。

説明

パスには、完全なプロトコルヘッダーとバケット名が含まれていることを確認してください。

HDFS → HDFS

HDFS 間でスナップショットを移行します。

  • ソースパス: hdfs://<namenode-host>:<port>/<path>

  • ターゲットパス: ソースパスと同じ形式。

HDFS → OSS-HDFS

HDFS から Alibaba Cloud OSS-HDFS にスナップショットを移行します。

  • ソースパス: hdfs://<namenode-host>:<port>/<path>

  • ターゲットパス: oss://<bucket>.<region>.oss-dls.aliyuncs.com/<path>

OSS → OSS

Alibaba Cloud OSS (標準 OSS) 間でスナップショットを移行します。

  • ソースパス: oss://<bucket>.oss-<region>.aliyuncs.com/<path>

  • ターゲットパス: ソースパスと同じ形式。