既定の Hive メタストア DB を外部メタストア DB に移行する

この記事では、Hive の既定のメタストア DB から HDInsight 上の外部 SQL Database にメタデータを移行する方法について説明します。

外部メタストア DB に移行する理由

  • 既定のメタストア DB は Basic SKU に限定されており、運用スケールのワークロードを処理することはできません。

  • 外部メタストア DB を使用すると、同じメタストア DB を共有する新しい HDInsight クラスターを追加することで、Hive コンピューティング リソースを水平方向にスケーリングできます。

  • HDInsight 3.6 から 4.0 への移行では、Hive スキーマのバージョンをアップグレードする前に、外部メタストア DB にメタデータを移行することが必須です。 Hdinsight 3.6 から HDInsight 4.0 へのワークロードの移行に関する記事を参照してください。

既定のメタストア DB のコンピューティング能力は限られているため、メタデータの移行中にクラスター上の他のジョブの使用率を低くすることをお勧めします。

ソースとターゲットの DB で、同じバージョンの HDInsight と同じストレージ アカウントを使用する必要があります。 HDInsight のバージョンを 3.6 から 4.0 にアップグレードする場合は、最初にこの記事の手順を完了してください。 その後、こちらに記載されている公式のアップグレード手順に従います。

前提条件

次のスクリプト アクションを実行して、これらの場所を他のクラスターに移植できるようにします。 「実行中のクラスターに対するスクリプト アクション」を参照してください。

アクションは、シンボリック リンクを完全なパスに置き換えるのと似ています。

プロパティ
Bash スクリプト URI https://hdiconfigactions.blob.core.windows.net/linuxhivemigrationv01/hive-adl-expand-location-v01.sh
ノード タイプ Head
パラメーター ""

sqlpackage を使用してエクスポートとインポートにより移行する

Hive の既定のメタストア DB の sqlpackage を使用した SQL のエクスポートとインポートがサポートされているのは、2020 年 10 月 15 日より後に作成された HDInsight クラスターだけです。

  1. sqlpackage をクラスターにインストールします。

  2. 次のコマンドを実行して、既定のメタストア DB を BACPAC ファイルにエクスポートします。

    wget "https://hdiconfigactions.blob.core.windows.net/linuxhivemigrationv01/hive_metastore_tool.py"
    SQLPACKAGE_FILE='/home/sshuser/sqlpackage/sqlpackage'  # replace with sqlpackage location
    TARGET_FILE='hive.bacpac'
    sudo python hive_metastore_tool.py --sqlpackagefile $SQLPACKAGE_FILE --targetfile $TARGET_FILE
    
  3. BACPAC ファイルを保存します。

    hdfs dfs -mkdir -p /bacpacs
    hdfs dfs -put $TARGET_FILE /bacpacs/
    
  4. こちらに記載されている手順に従って、BACPAC ファイルを新しいデータベースにインポートします。

  5. 新しいデータベースを新しい HDInsight クラスターで外部メタストア DB として構成する準備ができました。

Hive スクリプトを使用して移行する

2020 年 10 月 15 日より前に作成されたクラスターでは、既定のメタストア DB のエクスポートとインポートはサポートされていません。

そのようなクラスターの場合は、ストレージ アカウント間での Hive テーブルのコピーに関するガイドに従い、外部 Hive メタストア DB が含まれる第 2 のクラスターを使用します。 第 2 のクラスターでは同じストレージ アカウントを使用できますが、新しい既定のファイル システムを使用する必要があります。

"簡易" コピーのオプション

ガイドを使用してテーブルの "ディープ" コピーを行うと、ストレージの消費量が 2 倍になります。 ソース ストレージ コンテナー内のデータを手動で消去する必要があります。 代わりに、テーブルが非トランザクションである場合は、テーブルを "簡易" コピーすることができます。 HDInsight 3.6 ではすべての Hive テーブルが既定で非トランザクションですが、HDInsight 4.0 では外部テーブルのみが非トランザクションです。 トランザクション テーブルはディープ コピーする必要があります。 非トランザクション テーブルを簡易コピーするには、次の手順のようにします。

  1. ソース クラスターのプライマリ ヘッドノードでスクリプト hive-ddls.sh を実行して、すべての Hive テーブルの DDL を生成します。
  2. DDL は、/tmp/hdi_hive_ddls.hql という名前のローカル Hive スクリプトに書き込まれます。 これを、外部 Hive メタストア DB を使用するターゲット クラスターで実行します。

すべての Hive テーブルがインポートされたことを確認する

次のコマンドを実行すると、メタストア DB での SQL クエリを使用して、すべての Hive テーブルとそのデータの場所が出力されます。 新しいクラスターと古いクラスターの出力を比較し、新しいメタストア DB に足りないテーブルがないことを確認します。

SCRIPT_FNAME='hive_metastore_tool.py'
SCRIPT="/tmp/$SCRIPT_FNAME"
wget -O "$SCRIPT" "https://hdiconfigactions.blob.core.windows.net/linuxhivemigrationv01/$SCRIPT_FNAME"
OUTPUT_FILE='/tmp/hivetables.csv'
QUERY="SELECT DBS.NAME, TBLS.TBL_NAME, SDS.LOCATION FROM SDS, TBLS, DBS WHERE TBLS.SD_ID = SDS.SD_ID AND TBLS.DB_ID = DBS.DB_ID ORDER BY DBS.NAME, TBLS.TBL_NAME ASC;"
sudo python "$SCRIPT" --query "$QUERY" > $OUTPUT_FILE

関連項目