Glueの使い方的な⑨(Data Catalogのバックアップリストア)

# Glue Data Catalogのバックアップとリストアをしてみる
### 概要

https://github.com/awslabs/aws-glue-samples/tree/master/utilities/Hive_metastore_migration

githubで公開している上記ツールを使うと以下ができます。

* "Hive on EMRかHive on EC2のメタストア"を"RDSやEC2のMySQL"に保存しているデータ <==> Glue Data Catalog上のメタストアのデータ<br>
(MySQLに直接接続パターンとS3に一度出力するパターンがあります)
* Data Catalogを他のAWSアカウントのData Catalogに移行

よくあるケースとしては、既存のEMRのHiveメタ情報をGlue Data Catalogに移行やその逆方向で使うのですが、
Glue Data CatalogからS3にデータ出力ができるので、これはバックアップにも使えるではないかと思い試してみました。

### このツールの制約
* データベース、テーブル、およびパーティションだけを移行できます。列統計、特権、ロール、ファンクション、トランザクションなどの他のエンティティは移行できません。
* レプリみたいな使い方はできない
* バックアップ時に静止点は取れない

### ジョブ名
* se2_bk
(se2のデータベースをS3にバックアップ)
* se2_restore
(S3に取得したse2のデータベースのバックアップをリストア)

### バックアップリストア対象Database名
* se2

# 全体の流れ

* 事前準備
* バックアップジョブ作成と実行
* リストアジョブ作成と実行

# 前準備

### 現在のテーブルの内容を確認

以下のような情報です
Database:se2
Table:se2_out0

この状態でバックアップを取得し、Schema情報に修正を加え、バックアップからのリストアで復元できることを確認します。

![スクリーンショット 0030-02-08 11.18.03.png](https://qiita-image-store.s3.amazonaws.com/0/27932/25ddc717-8523-2fa7-4b6f-28f1ed7433a2.png)

### コードをS3にアップしておく

https://github.com/awslabs/aws-glue-samples/tree/master/utilities/Hive_metastore_migration
ここにある以下のコードをS3の任意の場所にアップロードしておきます。

```
export_from_datacatalog.py
hive_metastore_migration.py
import_into_datacatalog.py
```

git cloneしてスクリプトをアップ

```bash:code_upload
$ git clone https://github.com/awslabs/aws-glue-samples.git
$ cd aws-glue-samples/utilities/Hive_metastore_migration/src
$ ls
__init__.py			hive_metastore_migration.py
export_from_datacatalog.py	import_into_datacatalog.py
$ aws s3 cp ./ s3://test-glue00/script/  --exclude "*" --include "*.py" --recursive
```

# バックアップジョブの作成と実行

GlueメニューのJobsから"Add job"をクリックし

ジョブ名をse2_bk
IAMロールは権限があるものを選択。なければ作成しておく。
※不明な場合は以下参考ください
https://qiita.com/pioho07/items/c9ce1d0677777f974ffe
This job runsを"An existing script that you provide"にチェックを入れ、
アップロードしたコードで、以下のData Catalogからエクスポートするコードのパスを入力
s3://test-glue00/se2/script/export_from_datacatalog.py

![スクリーンショット 0030-02-08 11.44.59.png](https://qiita-image-store.s3.amazonaws.com/0/27932/37148349-2c82-9d95-2e46-3329c0cdf5a3.png)

画面下部の"Script libraries and job parameters (optional)"をクリックし、
Python library pathに以下のパスを入力
s3://test-glue00/se2/script/hive_metastore_migration.py

ジョブ実行時の引数を付ける
--mode: to-s3
--region: ap-northeast-1
--database-names: se2
--output-path: s3://test-glue00/se2/bk_catalog/

こちらは補足としてオプションの内容

```
--mode set to to-s3, which means the migration is to S3.
--region the AWS region for Glue Data Catalog, for example, us-east-1. You can find a list of Glue supported regions here: http://docs.aws.amazon.com/general/latest/gr/rande.html#glue_region. If not provided, us-east-1 is used as default.
--database-names set to a semi-colon(;) separated list of database names to export from Data Catalog.
--output-path set to the S3 destination path that you configured with cross-account access.
```

![スクリーンショット 0030-02-08 11.52.25.png](https://qiita-image-store.s3.amazonaws.com/0/27932/29471162-832f-5db7-99e3-ceb4cfdc677e.png)

"Next"->"Next"->"Finish"、これでジョブ実行します。

ジョブ成功

![スクリーンショット 0030-02-08 12.03.08.png](https://qiita-image-store.s3.amazonaws.com/0/27932/c746fe29-9d4f-35d4-8be8-d34f5abb2b90.png)

S3出力確認
![スクリーンショット 0030-02-08 12.02.27.png](https://qiita-image-store.s3.amazonaws.com/0/27932/fc657f70-7302-4a21-ce39-cb87f5598e49.png)

![スクリーンショット 0030-02-08 12.02.42.png](https://qiita-image-store.s3.amazonaws.com/0/27932/e6fc619d-bddc-c0f0-c7b3-23959b93fe2c.png)

# リストアジョブ作成と実行

リストアを確認するためにスキーマの一部を変更しておきます。
Database:se2
Table:se2_out0

hourのカラムをbitint->intに変更しました。

![スクリーンショット 0030-02-08 12.06.10.png](https://qiita-image-store.s3.amazonaws.com/0/27932/499d68d4-a21f-84ab-d3c7-f7d92f37a115.png)

![スクリーンショット 0030-02-08 12.06.20.png](https://qiita-image-store.s3.amazonaws.com/0/27932/34981399-c5a8-60bc-6fe4-476433dcb7aa.png)

### リストアジョブ作成

GlueメニューのJobsから"Add job"をクリックし

ジョブ名をse2_restore
IAMロールは権限があるものを選択。なければ作成しておく。
※不明な場合は以下参考ください
https://qiita.com/pioho07/items/c9ce1d0677777f974ffe
This job runsを"An existing script that you provide"にチェックを入れ、
アップロードしたコードで、以下のData Catalogからエクスポートするコードのパスを入力
s3://test-glue00/se2/script/import_into_datacatalog.py
![スクリーンショット 0030-02-08 12.08.07.png](https://qiita-image-store.s3.amazonaws.com/0/27932/c5b05edc-6fb1-bef5-cb78-ba61e74fbe4f.png)

画面下部の"Script libraries and job parameters (optional)"をクリックし、
Python library pathに以下のパスを入力
s3://test-glue00/se2/script/hive_metastore_migration.py

ジョブ実行時の引数を付ける
--mode: from-s3
--region: ap-northeast-1
--database-input-path: s3://test-glue00/se2/bk_catalog/2018-02-08-02-59-25/databases/
--partition-input-path: s3://test-glue00/se2/bk_catalog/2018-02-08-02-59-25/partitions/
--table-input-path: s3://test-glue00/se2/bk_catalog/2018-02-08-02-59-25/tables/

こちらは補足としてオプションの内容

```
--mode set to from-s3
--region the AWS region for Glue Data Catalog, for example, us-east-1. You can find a list of Glue supported regions here: http://docs.aws.amazon.com/general/latest/gr/rande.html#glue_region. If not provided, us-east-1 is used as default.
--database-input-path set to the S3 path containing only databases.
--table-input-path set to the S3 path containing only tables.
--partition-input-path set to the S3 path containing only partitions.
```

![スクリーンショット 0030-02-08 12.12.14.png](https://qiita-image-store.s3.amazonaws.com/0/27932/15082ebe-726f-ef1b-64df-3040d50075f4.png)

"Next"->"Next"->"Finish"、これでジョブ実行します。

ジョブ成功

![スクリーンショット 0030-02-08 12.18.00.png](https://qiita-image-store.s3.amazonaws.com/0/27932/bfaae0d5-e1be-9d25-3319-bfcc68512ecc.png)

### 確認

hourの型がintからbigintに戻っていてリストアが成功しています。パパっとできたわりになんだかうれしいです。

![スクリーンショット 0030-02-08 12.18.34.png](https://qiita-image-store.s3.amazonaws.com/0/27932/e08a5e7f-0135-a04c-058f-299c12ab7b56.png)

こういう時は"Compare versions"で

![スクリーンショット 0030-02-08 12.18.54.png](https://qiita-image-store.s3.amazonaws.com/0/27932/2e451968-c4bf-8e42-3bdd-f7eed64a9cd9.png)

![スクリーンショット 0030-02-08 12.19.12.png](https://qiita-image-store.s3.amazonaws.com/0/27932/77fc77ae-d823-4e2a-3c15-96bd6d2a19f1.png)

Databaseのse2ごと消しても問題なくリストアできました

## To Be Continue
TODO

## 参考資料

https://github.com/awslabs/aws-glue-samples/tree/master/utilities/Hive_metastore_migration

Glueの使い方まとめ
https://qiita.com/pioho07/items/32f76a16cbf49f9f712f