既定の 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 クラスターだけです。
sqlpackage をクラスターにインストールします。
次のコマンドを実行して、既定のメタストア 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
BACPAC ファイルを保存します。
hdfs dfs -mkdir -p /bacpacs hdfs dfs -put $TARGET_FILE /bacpacs/
こちらに記載されている手順に従って、BACPAC ファイルを新しいデータベースにインポートします。
新しいデータベースを新しい HDInsight クラスターで外部メタストア DB として構成する準備ができました。
Hive スクリプトを使用して移行する
2020 年 10 月 15 日より前に作成されたクラスターでは、既定のメタストア DB のエクスポートとインポートはサポートされていません。
そのようなクラスターの場合は、ストレージ アカウント間での Hive テーブルのコピーに関するガイドに従い、外部 Hive メタストア DB が含まれる第 2 のクラスターを使用します。 第 2 のクラスターでは同じストレージ アカウントを使用できますが、新しい既定のファイル システムを使用する必要があります。
"簡易" コピーのオプション
ガイドを使用してテーブルの "ディープ" コピーを行うと、ストレージの消費量が 2 倍になります。 ソース ストレージ コンテナー内のデータを手動で消去する必要があります。 代わりに、テーブルが非トランザクションである場合は、テーブルを "簡易" コピーすることができます。 HDInsight 3.6 ではすべての Hive テーブルが既定で非トランザクションですが、HDInsight 4.0 では外部テーブルのみが非トランザクションです。 トランザクション テーブルはディープ コピーする必要があります。 非トランザクション テーブルを簡易コピーするには、次の手順のようにします。
- ソース クラスターのプライマリ ヘッドノードでスクリプト hive-ddls.sh を実行して、すべての Hive テーブルの DDL を生成します。
- 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