Google Cloud 上の HBase から移行する

このページでは、Dataproc や Compute Engine などの Google Cloud サービスでホストされている Apache HBase クラスタから Bigtable に移行する際の考慮事項とプロセスについて説明します。

外部の Apache HBase 環境から Bigtable への移行のガイダンスについては、HBase から Bigtable へのデータの移行をご覧ください。オンライン移行の詳細については、HBase から Bigtable へのレプリケーションをご覧ください。

Google Cloud 上の HBase から Bigtable に移行する理由

この移行パスを選択する理由は次のとおりです。

  • クライアント アプリケーションは現在デプロイされているままにし、接続構成のみを変更できます。
  • データは Google Cloud エコシステムに残ります。
  • 必要に応じて、HBase API を引き続き使用できます。Java 用 Cloud Bigtable HBase クライアントは、Java 用 Apache HBase ライブラリで完全にサポートされている拡張機能です。
  • データの保存にマネージド サービスを活用できます。

考慮事項

このセクションでは、移行の開始前に確認し、検討すべき事項について説明します。

Bigtable のスキーマ設計

ほとんどの場合、Bigtable では HBase と同じスキーマ設計を使用できます。スキーマを変更する場合やユースケースを変更する場合は、データを移行する前にスキーマの設計で説明されているコンセプトを確認してください。

準備とテスト

データを移行する前に、HBase と Bigtable の違いを理解しておいてください。アプリケーションを Bigtable に接続するように接続を構成する方法を確認しておく必要があります。また、移行前にシステムテストと機能テストを実施し、アプリケーションとサービスを検証することもできます。

移行手順

HBase から Bigtable にデータを移行するには、HBase スナップショットを取得し、HBase クラスタから Bigtable に直接データをインポートします。次の手順は単一の HBase クラスタを対象としたものです。以降のセクションで詳しく説明します。

  1. HBase への書き込みの送信を停止します。
  2. Bigtable に宛先テーブルを作成します。
  3. HBase スナップショットを取得して Bigtable にインポートする。
  4. インポートされたデータを検証します。
  5. Bigtable に読み取りと書き込みを送信するようにアプリケーションを更新します。

画像

始める前に

  1. Google Cloud CLI をインストールするか、Cloud Shell を使用します。

  2. Cloud Storage バケットを作成して、検証用の出力データを保存します。Dataproc ジョブを実行するロケーションにバケットを作成します。

  3. 移行元の Hadoop クラスタを特定します。移行ジョブは、HBase クラスタの Namenode と Datanode とのネットワーク接続のある Dataproc 1.x クラスタで実行する必要があります。HBase クラスタの ZooKeeper Quorum アドレスNamenode URI をメモします。これらは移行スクリプトで必要になります。

  4. 移行元の HBase クラスタと同じネットワーク上に Dataproc クラスタを作成します(クラスタのバージョンは 1.x)。このクラスタを使用して、インポート ジョブと検証ジョブを実行します。

  5. Bigtable インスタンスを作成して新しいテーブルを保存します。また、Bigtable インスタンス内の少なくとも 1 つのクラスタが、Dataproc クラスタと同じリージョンに存在する必要があります。例: us-central1

  6. スキーマ Translation ツールを取得します。

    wget BIGTABLE_HBASE_TOOLS_URL
    

    BIGTABLE_HBASE_TOOLS_URL は、ツールの Maven リポジトリで利用可能な最新の JAR with dependencies の URL に置き換えます。ファイル名は https://repo1.maven.org/maven2/com/google/cloud/bigtable/bigtable-hbase-1.x-tools/2.6.0/bigtable-hbase-1.x-tools-2.6.0-jar-with-dependencies.jar のようになります。

    URL を確認する方法や JAR を手動でダウンロードする方法は、以下のとおりです。

    1. リポジトリに移動します
    2. [Browse] をクリックして、リポジトリ ファイルを表示します。
    3. 最新のバージョン番号をクリックします。
    4. JAR with dependencies file を特定します(通常は先頭にあります)。
    5. URL を右クリックしてコピーするか、ファイルをクリックしてダウンロードします。
  7. インポート ジョブと検証ジョブに使用する MapReduce ツールを取得します。

    wget BIGTABLE_MAPREDUCE_URL
    

    BIGTABLE_MAPREDUCE_URL は、ツールの Maven リポジトリで利用可能な最新の shaded-byo JAR の URL に置き換えます。 ファイル名は https://repo1.maven.org/maven2/com/google/cloud/bigtable/bigtable-hbase-1.x-mapreduce/2.6.0/bigtable-hbase-1.x-mapreduce-2.6.0-shaded-byo-hadoop.jar のようになります。

    URL を確認する方法や JAR を手動でダウンロードする方法は、以下のとおりです。

    1. リポジトリに移動します
    2. 最新のバージョン番号をクリックします。
    3. [ダウンロード] をクリックします。
    4. shaded-byo-hadoop.jar にカーソルを合わせます。
    5. URL を右クリックしてコピーするか、ファイルをクリックしてダウンロードします。
  8. 次の環境変数を設定します。

    #Google Cloud
    
    export PROJECT_ID=PROJECT_ID
    export REGION=REGION
    
    ##Cloud Bigtable
    
    export BIGTABLE_INSTANCE_ID=BIGTABLE_INSTANCE_ID
    
    ##Dataproc
    
    export DATAPROC_CLUSTER_ID=DATAPROC_CLUSTER_NAME
    
    #Cloud Storage
    
    export BUCKET_NAME="gs://BUCKET_NAME"
    export STORAGE_DIRECTORY="$BUCKET_NAME/hbase-migration"
    
    #HBase
    
    export ZOOKEEPER_QUORUM=ZOOKEPER_QUORUM
    export ZOOKEEPER_PORT=2181
    export ZOOKEEPER_QUORUM_AND_PORT="$ZOOKEEPER_QUORUM:$ZOOKEEPER_PORT"
    export MIGRATION_SOURCE_NAMENODE_URI=MIGRATION_SOURCE_NAMENODE_URI
    export MIGRATION_SOURCE_TMP_DIRECTORY=${MIGRATION_SOURCE_NAMENODE_URI}/tmp
    export MIGRATION_SOURCE_DIRECTORY=${MIGRATION_SOURCE_NAMENODE_URI}/hbase
    
    #JAR files
    
    export TRANSLATE_JAR=TRANSLATE_JAR
    export MAPREDUCE_JAR=MAPREDUCE_JAR
    
    

    プレースホルダは、移行で使用する値に置き換えます。

    Google Cloud:

    • PROJECT_ID: Bigtable インスタンスが存在する Google Cloud プロジェクト。
    • REGION: インポート ジョブと検証ジョブを実行する Dataproc クラスタを含むリージョン。

    Bigtable:

    • BIGTABLE_INSTANCE_ID: データのインポート先の Bigtable インスタンスの識別子

    Dataproc:

    • DATAPROC_CLUSTER_ID: インポート ジョブと検証ジョブを実行する Dataproc クラスタの ID

    Cloud Storage:

    • BUCKET_NAME: スナップショットを保存する Cloud Storage バケットの名前

    HBase:

    • ZOOKEEPER_QUORUM: ツールで接続する ZooKeeper ホスト(host1.myownpersonaldomain.com 形式)
    • MIGRATION_SOURCE_NAMENODE_URI: HBase クラスタの Namenode の URI(形式は hdfs://host1.myownpersonaldomain.com:8020

    JAR ファイル

    • TRANSLATE_JAR: Maven からダウンロードした bigtable hbase tools JAR ファイルの名前とバージョン番号。値は bigtable-hbase-1.x-tools-2.6.0-jar-with-dependencies.jar のようになります。
    • MAPREDUCE_JAR: Maven からダウンロードした bigtable hbase mapreduce JAR ファイルの名前とバージョン番号。値は bigtable-hbase-1.x-mapreduce-2.6.0-shaded-byo-hadoop.jar のようになります。
  9. (省略可)変数が正しく設定されていることを確認するには、printenv コマンドを実行して、すべての環境変数を表示します。

HBase への書き込みの送信を停止する

HBase テーブルのスナップショットを取得する前に、HBase クラスタへの書き込み送信を停止します。

Bigtable に宛先テーブルを作成します

次のステップでは、移行する HBase テーブルごとに、Bigtable インスタンスに宛先テーブルを作成します。インスタンスに対する bigtable.tables.create 権限を持つアカウントを使用します。

このガイドでは、Bigtable スキーマ変換ツールを使用してテーブルを自動的に作成します。ただし、Bigtable スキーマと HBase スキーマを完全一致させたくない場合は、cbt CLI または Google Cloud コンソールでテーブルを作成してかまいません。

Bigtable スキーマ変換ツールは、テーブル名、列ファミリー、ガベージ コレクション ポリシー、スプリットなど、HBase テーブルのスキーマをキャプチャします。次に、Bigtable に同様のテーブルを作成します。

インポートするテーブルごとに、次のコマンドを実行して HBase から Bigtable にスキーマをコピーします。

java \
 -Dgoogle.bigtable.project.id=$PROJECT_ID \
 -Dgoogle.bigtable.instance.id=$BIGTABLE_INSTANCE_ID \
 -Dgoogle.bigtable.table.filter=TABLE_NAME \
 -Dhbase.zookeeper.quorum=$ZOOKEEPER_QUORUM \
 -Dhbase.zookeeper.property.clientPort=$ZOOKEEPER_PORT \
 -jar $TRANSLATE_JAR

TABLE_NAME は、インポートする HBase テーブルの名前に置き換えます。スキーマ変換ツールは、この名前を新しい Bigtable テーブルに使用します。

必要に応じて、TABLE_NAME を、作成するテーブルをキャプチャする正規表現(「.*」など)に置き換え、このコマンドを 1 回だけ実行します。

HBase のテーブル スナップショットを取得し、Bigtable にインポートする

Bigtable に移行するテーブルごとに、次の手順を行います。

  1. 次のコマンドを実行します。

    echo "snapshot 'HBASE_TABLE_NAME', 'HBASE_SNAPSHOT_NAME'" | hbase shell -n
    

    以下のように置き換えます。

    • HBASE_TABLE_NAME: Bigtable に移行する HBase テーブルの名前
    • HBASE_SNAPSHOT_NAME: 新しいスナップショットの名前
  2. 次のコマンドを実行して、スナップショットをインポートします。

    gcloud dataproc jobs submit hadoop \
        --cluster $DATAPROC_CLUSTER_ID \
        --region $REGION \
        --project $PROJECT_ID \
        --jar $MAPREDUCE_JAR \
        -- \
        import-snapshot \
        -Dgoogle.bigtable.project.id=$PROJECT_ID \
        -Dgoogle.bigtable.instance.id=$BIGTABLE_INSTANCE_ID \
        HBASE_SNAPSHOT_NAME \
        $MIGRATION_SOURCE_DIRECTORY \
        BIGTABLE_TABLE_NAME \
        $MIGRATION_SOURCE_TMP_DIRECTORY
    

    以下のように置き換えます。

    • HBASE_SNAPSHOT_NAME: インポートするテーブルのスナップショットに割り当てた名前
    • BIGTABLE_TABLE_NAME: インポート先の Bigtable テーブルの名前

    このコマンドを実行すると、移行元クラスタの HBase スナップショットが復元され、インポートされます。スナップショットのサイズによっては、この復元プロセスが完了するまで数分かかることがあります。

データをインポートするときに、次の追加オプションを使用できます。

  • バッファに格納されるミューテータ リクエストにクライアント ベースのタイムアウトを設定します(デフォルトは 600,000 ミリ秒)。次の例をご覧ください。

    -Dgoogle.bigtable.rpc.use.timeouts=true
    -Dgoogle.bigtable.mutate.rpc.timeout.ms=600000
    
  • レイテンシベースのスロットリングを検討してください。これにより、インポート バッチジョブが他のワークロードに与える影響を軽減できます。移行のユースケースに対してスロットリングをテストする必要があります。次の例をご覧ください。

    -Dgoogle.bigtable.buffered.mutator.throttling.enable=true
    -Dgoogle.bigtable.buffered.mutator.throttling.threshold.ms=100
    
  • 単一の HBase リージョンを読み取るマップタスクの数を変更します(デフォルトではリージョンごとに 2 つのマップタスク)。次の例をご覧ください。

    -Dgoogle.bigtable.import.snapshot.splits.per.region=3
    
  • 追加の MapReduce 構成をプロパティとして設定します。次の例をご覧ください。

    -Dmapreduce.map.maxattempts=4
    -Dmapreduce.map.speculative=false
    -Dhbase.snapshot.thread.pool.max=20
    

インポートする際には、次の点に留意してください。

  • データの読み込みパフォーマンスを改善するには、マップのインポート タスクを同時に実行するのに十分な Dataproc クラスタ ワーカーを確保します。デフォルトでは、n1-standard-8 Dataproc ワーカーは 8 つのインポート タスクを実行します。ワーカー数が十分にあれば、Bigtable インスタンスを圧迫するほどではないものの、インポート ジョブを妥当な時間内に完了するのに十分なコンピューティング能力を使用できるようになります。
    • 別のワークロードで Bigtable インスタンスを使用していない場合は、Bigtable インスタンス内のノード数に 3 を掛けてから 8(n1-standard-8 dataproc ワーカーで実行されるタスク数)で割ります。この結果を Dataproc ワーカーの数として使用します。
    • HBase データのインポートと同時に別のワークロードにインスタンスを使用する場合は、Dataproc ワーカーの値を減らすか、ワークロードの要件を満たすために Bigtable ノードの数を増やします。
  • インポート中は、Bigtable インスタンスの CPU 使用率をモニタリングする必要があります。Bigtable インスタンス全体の CPU 使用率が高すぎる場合は、ノードの追加が必要になる可能性があります。ノードを追加すると CPU 使用率はすぐに向上しますが、ノードの追加後、クラスタが最適なパフォーマンスを達成するまでに最大で 20 分ほどかかることがあります。

Bigtable インスタンスのモニタリングの詳細については、Bigtable インスタンスのモニタリングをご覧ください。

Bigtable にインポートされたデータを検証する

次に、ソーステーブルと宛先テーブルのハッシュ比較を実行してデータの移行を検証し、移行されたデータの整合性を確認します。まず、hash-table ジョブを実行して、ソーステーブルの行範囲のハッシュを生成します。次に、sync-table ジョブを実行して Bigtable のハッシュを計算してソースと照合し、検証を完了します。

  1. 検証に使用するハッシュを作成するには、移行するテーブルごとに次のコマンドを実行します。

    gcloud dataproc jobs submit hadoop \
      --project $PROJECT_ID \
      --cluster $DATAPROC_CLUSTER_ID \
      --region $REGION \
      --jar $MAPREDUCE_JAR \
      -- \
      hash-table \
      -Dhbase.zookeeper.quorum=$ZOOKEEPER_QUORUM_AND_PORT \
      HBASE_TABLE_NAME \
      $STORAGE_DIRECTORY/HBASE_TABLE_NAME/hash-output/
    

    HBASE_TABLE_NAME は、スナップショットを作成した HBase テーブルの名前に置き換えます。

  2. コマンドシェルで次のコマンドを実行します。

    gcloud dataproc jobs submit hadoop \
      --project $PROJECT_ID \
      --cluster $DATAPROC_CLUSTER_ID \
      --region $REGION \
     --jar $MAPREDUCE_JAR \
     -- \
     sync-table \
     --sourcezkcluster=$ZOOKEEPER_QUORUM_AND_PORT:/hbase \
     --targetbigtableproject=$PROJECT_ID \
     --targetbigtableinstance=$BIGTABLE_INSTANCE_ID \
     $STORAGE_DIRECTORY/HBASE_TABLE_NAME/hash-output/ \
     HBASE_TABLE_NAME \
     BIGTABLE_TABLE_NAME
    

    以下のように置き換えます。

    • HBASE_TABLE_NAME: インポートする HBase テーブルの名前
    • BIGTABLE_TABLE_NAME: インポート先の Bigtable テーブルの名前

ハッシュ範囲を分散させるため、コマンドに --dryrun=false を追加して、ソースとターゲットの同期を有効にすることもできます。

sync-table ジョブが完了すると、ジョブを実行した Google Cloud コンソールにジョブのカウンタが表示されます。インポート ジョブですべてのデータが正常にインポートされると、HASHES_MATCHED に値が表示され、HASHES_NOT_MATCHED は 0 になります。

HASHES_NOT_MATCHED に値が表示されている場合は、sync-table をデバッグモードで再実行して、さまざまな範囲とセルレベルの詳細(Source missing cellTarget missing cellDifferent values など)を出力できます。デバッグモードを有効にするには、--properties mapreduce.map.log.level=DEBUG を構成します。ジョブの実行後、Cloud Logging を使用して jsonPayload.class="org.apache.hadoop.hbase.mapreduce.SyncTable" の式を検索し、さまざまなセルを確認します。

インポート ジョブを再試行することも、dryrun=false を設定して、SyncTable でソーステーブルとターゲット テーブルを同期することもできます。続行する前に、HBase SyncTable と追加の構成オプションを確認します。

Cloud Logging での SyncTable の結果

Bigtable に読み取りと書き込みを送信するようにアプリケーションを更新する

クラスタ内の各テーブルのデータを検証したら、すべてのトラフィックを Bigtable にルーティングするように アプリケーションを構成し、HBase クラスタを非推奨にします。

移行が完了したら、スナップショットを削除できます。

次のステップ