Amazon Web Services ブログ

HDFSからAmazon S3へApache HBaseを移行するためのヒント

Amazon EMR 5.2.0以降、Amazon S3上でApache HBaseを実行することができます。 S3上でHBaseを実行すると、コストの削減、データ耐久性の向上、スケーラビリティの向上など、いくつかの利点が追加されます。

HBaseには、HBaseテーブルの移行およびバックアップに使用できるいくつかのオプションがあります。 S3のHBaseに移行する手順は、Apache Hadoop分散ファイルシステム(HDFS)のHBaseの手順と似ていますが、細かな違いといくつかの「落とし穴」を認識していれば、移行がより簡単になります。

この記事では、一般的なHBase移行オプションのいくつかを使用してS3のHBaseを開始する方法を説明します。

HBaseの移行オプション

正しい移行方法とツールを選択することは、HBaseテーブルの移行を成功させる上で重要なステップです。しかし、正しいものを選ぶことは、必ずしも簡単な作業ではありません。

次のHBaseの機能が、S3のHBaseに移行するのに役立ちます:

  • スナップショット
  • エクスポートとインポート
  • CopyTable

次の図は、各オプションの手順をまとめたものです。

さまざまな要因によって、使用するHBaseの移行方法が決まります。たとえば、EMRでは、S3で実行できる最初のバージョンとしてHBaseバージョン1.2.3が提供されています。したがって、移行元のHBaseバージョンが、移行方法を決決めるのに役立つ重要な要素になります。 HBaseのバージョンと互換性の詳細については、Apache HBaseリファレンスガイドのHBaseのバージョン番号と互換性のマニュアルを参照してください。

旧バージョンのHBase(HBase 0.94など)から移行する場合は、アプリケーションをテストして、新しいHBase APIバージョンと互換性があることを確認する必要があります。アプリケーションとAPIにHBaseバージョンの違いによる問題があることを確認するためだけに、大きなテーブルを移行して数時間を費やすことは望ましくありません。

良い知らせとしては、HBaseはテーブルの一部だけを移行するために使用できるユーティリティを提供していることです。これにより、HBaseテーブル全体を完全に移行することなく、既存のHBaseアプリケーションをテストすることができます。たとえば、Export、Import、またはCopyTableユーティリティを使用して、テーブルの一部分をS3のHBaseに移行できます。アプリケーションが新しいHBaseバージョンで動作することを確認したら、HBaseスナップショットを使用してテーブル全体を移行することができます。

オプション1:スナップショットを使用してS3のHBaseに移行する

HBaseスナップショットを使用すると、テーブルバックアップを簡単に作成できます。 HBaseはまた、S3などの別の場所にスナップショットをエクスポートできるExportSnapshotユーティリティも提供しています。このセクションでは、ExportSnapshotとスナップショットを組み合わせてS3のHBaseにテーブルを移行する方法について説明します。

HBaseスナップショットを使用してテーブルのバックアップを実行する方法の詳細については、Amazon EMRリリースガイドのHBaseスナップショットの使用、および、Apache HBaseリファレンスガイドのHBaseスナップショットを参照してください。これらのリソースは、スナップショットとExportSnapshotで使用できる追加の設定と構成を提供します。

次の例は、スナップショットを使用してHBaseテーブルをS3のHBaseに移行する方法を示しています。

注意:以前のHBaseバージョン(HBase 0.94など)は、移行先のHBase 1.xとは異なるスナップショット構造を持っています。スナップショットを使用してHBase 0.94から移行する場合は、テーブルを復元しようとするとTableInfoMissingExceptionエラーが発生します。スナップショットを使用したHBase 0.94からの移行の詳細については、HBase 0.94からの移行を参照してください。

  1. ソースHBaseクラスタから、テーブルのスナップショットを作成します:
    $ echo "snapshot '<table_name>', '<snapshot_name>'" | hbase shell
  2. スナップショットをS3バケットにエクスポートする:
    $ hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot <snapshot_name> -copy-to s3://<HBase_on_S3_root_dir>/

    ExportSnapshotユーティリティの-copy-toパラメータには、EMRクラスタのHBaseルートディレクトリに使用するS3の場所を指定します。クラスタが起動して実行中の場合は、EMRコンソールでクラスタの設定を表示するか、AWS CLIを使用して、S3 hbase.rootdir値を確認できます。その値を見つけるコマンドは次のとおりです:

    $ aws emr describe-cluster --cluster-id <cluster_id> | grep hbase.rootdir
  3. HBaseのS3ストレージオプションを使用するEMRクラスタを起動します(既に起動している場合はこの手順をスキップしてください)。詳細な手順については、Amazon EMRリリースガイドのコンソールを使用したHBaseクラスターの作成を参照してください。クラスタを起動するときは、HBaseのルートディレクトリが、エクスポートされたスナップショットと同じS3の場所(前の手順で-copy-toパラメータで使用された場所)に設定されていることを確認してください。
  4. そのスナップショットからHBaseテーブルを復元または複製します。
    • テーブルを復元し、ソーステーブルと同じテーブル名を保持するには、restore_snapshotを使用します:
      $ echo "restore_snapshot '<SNAPSHOT_NAME>'"| hbase shell
    • テーブルを別のテーブル名に復元するには、clone_snapshotを使用します:
      $ echo "clone_snapshot '<snapshot_name>', '<table_name>'" | hbase shell

スナップショットを使用したHBase 0.94からの移行


スナップショット方式を使用してHBaseバージョン0.94から移行する場合、スナップショットから復元しようとするとエラーが発生します。これは、HBase 0.94のスナップショットの構造がHBase 1.xのスナップショットの構造と異なるためです。

次の手順では、HBase 0.94スナップショットを修正してS3のHBaseテーブルに復元できるようにする方法を示します。

  1. 前の例の手順1〜3を実行して、スナップショットを作成してエクスポートします。
  2. コピー先のクラスタから、次の手順に従ってスナップショットを修復します:
    • s3-dist-cpを使用して、スナップショットデータ(アーカイブ)ディレクトリを新しいディレクトリにコピーします。アーカイブディレクトリには、スナップショットデータが格納されます。テーブルのサイズによっては、大きくなることがあります。この手順を速くするには、s3-dist-cpを使用します:
      $ s3-dist-cp --src s3://<HBase_on_S3_root_dir>/.archive/<table_name> --dest s3://<HBase_on_S3_root_dir>/archive/data/default/<table_name>
    • スナップショットデスクリプターファイルを作成して修正します:
      $ hdfs dfs -mkdir s3://<HBase_on_S3_root_dir>/.hbase-snapshot/<snapshot_name>/.tabledesc
      
      $ hdfs dfs -mv s3://<HBase_on_S3_root_dir>/.hbase-snapshot/<snapshot_name>/.tableinfo.<*> s3://<HBase_on_S3_root_dir>/.hbase-snapshot/<snapshot_name>/.tabledesc
  3. スナップショットを復元する:
    $ echo "restore_snapshot '<snapshot_name>'" | hbase shell

オプション2:エクスポートとインポートを使用してS3のHBaseに移行する

前のセクションで説明したように、HBaseのスナップショットとExportSnapshotは、テーブルの移行に最適なオプションです。ただし、テーブルの一部だけを移行する場合があるため、別のツールが必要になることがあります。このセクションでは、HBaseのエクスポートおよびインポートユーティリティの使用方法について説明します。

エクスポートとインポートを使用してS3上のHBaseにテーブルを移行する手順は、HBaseのドキュメントに記載されている手順とほとんど変わりません。これらのドキュメントでは、テーブルの一部を移行するための方法など、詳細な情報を見つけることもできます。

次の手順では、エクスポートとインポートを使用してS3上のテーブルをHBaseに移行する方法を示します。

  1. ソースクラスタから、HBaseテーブルをエクスポートします:
    $ hbase org.apache.hadoop.hbase.mapreduce.Export <table_name> s3://<table_s3_backup>/<location>/
  2. 宛先クラスタで、データをインポートするターゲット表を作成します。ターゲット表のカラムファミリーがエクスポート/ソース表の列ファミリーと同一であることを確認してください。
  3. 宛先クラスタから、インポートユーティリティを使用してテーブルをインポートします:
    $ hbase org.apache.hadoop.hbase.mapreduce.Import '<table_name>' s3://<table_s3_backup>/<location>/

通常HBaseテーブルを移行するには、HBaseスナップショットを使用することをお勧めします。ただし、エクスポートおよびインポートユーティリティは、テーブルの一部分のみを移行してアプリケーションをテストするなどのテストのユースケースに役立ちます。また、HBaseスナップショット機能を持たないHBaseクラスタから移行する場合にも便利です。

オプション3:CopyTableを使用してS3のHBaseに移行する

エクスポートおよびインポートユーティリティと同様に、CopyTableはHBaseテーブルの一部をコピーするために使用できるHBaseユーティリティです。ただし、互換性のないHBaseバージョン間で表をコピーまたは移行する場合(HBase 0.94からHBase 1.xへのコピーなど)には、CopyTableは機能しません。

詳細と例については、HBaseのドキュメントのCopyTableを参照してください。

まとめ

この記事では、一般的なHBaseバックアップユーティリティを使用して、S3でテーブルをHBaseに簡単に移行する方法を示しました。 HBaseのスナップショットを使用すると、テーブル全体をS3のHBaseに移行できます。テーブルの一部のみを移行またはコピーしてS3のHBaseをテストするには、HBase Export、Import、またはCopyTableユーティリティを使用します。

ご質問やご提案がありましたら、ぜひご意見をお寄せ下さい。

原文:Tips for Migrating to Apache HBase on Amazon S3 from HDFS(翻訳:半場光晴)