EMR上のApache AtlasにAWS Glueのデータカタログ情報をインポートしてみた

Hiveのメタデータ管理ができるApache Atlasですが、こちらのブログを参考にGlueのカタログ情報もインポートしてみました。

aws.amazon.com

EMRのHiveメタストアとしてGlueを使うための設定を準備

こちらを参考に設定ファイルの準備

$ cat <<EOF > ./glue_settings.json
[
  {
    "Classification": "hive-site",
    "Properties": {
      "hive.metastore.client.factory.class": "com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory"
    }
  }
]
EOF

EMRクラスタの起動

上で作った設定ファイルを指定してEMRクラスタを起動します。

CLUSTER_NAME=EMR-Atlas
INSTANCE_TYPE=m4.large
INSTANCE_VOL_SIZE=80
KEY_NAME=privatekey
SUBNET_ID=subnet-xxxxxxxxxxx
S3_EMR_LOGDIR=s3://otomo-log/atlas_log

aws emr create-cluster --applications Name=Hive Name=HBase Name=Hue Name=Hadoop Name=ZooKeeper \
  --tags Name=${CLUSTER_NAME} \
  --release-label emr-5.16.0 \
  --ec2-attributes SubnetId=${SUBNET_ID},KeyName=${KEY_NAME} \
--use-default-roles \
--ebs-root-volume-size ${INSTANCE_VOL_SIZE}\
  --instance-groups InstanceGroupType=MASTER,InstanceType=${INSTANCE_TYPE},InstanceCount=1 InstanceGroupType=CORE,InstanceType=${INSTANCE_TYPE},InstanceCount=1 \
  --log-uri ${S3_EMR_LOGDIR} \
  --configurations file://./glue_settings.json \
--steps Name='Run Remote Script',Jar=command-runner.jar,Args=[bash,-c,'curl https://s3.amazonaws.com/aws-bigdata-blog/artifacts/aws-blog-emr-atlas/apache-atlas-emr.sh -o /tmp/script.sh; chmod +x /tmp/script.sh; /tmp/script.sh']

クラスタのIDが表示されるのでメモします。

{
    "ClusterId": "j-1AN6UT664VLL8"
}

クラスタが起動して以下のステータスになるのを待ちます。

$ aws emr list-clusters --active
{
    "Clusters": [
        {
            "Id": "j-1AN6UT664VLL8",
            "Name": "Development Cluster",
            "Status": {
                "State": "WAITING",
                "StateChangeReason": {
                    "Message": "Cluster ready after last step completed."
                },
                "Timeline": {
                    "CreationDateTime": 1549354811.405,
                    "ReadyDateTime": 1549355397.746
                }
            },
            "NormalizedInstanceHours": 0
        }
    ]
}

EMRクラスタへ接続

MASTERノードのパブリックIPを取得します。

$ aws emr list-instances --cluster-id j-1AN6UT664VLL8 --instance-group-types MASTER --query 'Instances[].PublicIpAddress' --output text
3.112.83.1

hadoopユーザで接続します。

$ ssh -i ~/.ssh/otomoy.pem hadoop@3.112.83.1

EEEEEEEEEEEEEEEEEEEE MMMMMMMM           MMMMMMMM RRRRRRRRRRRRRRR
E::::::::::::::::::E M:::::::M         M:::::::M R::::::::::::::R
EE:::::EEEEEEEEE:::E M::::::::M       M::::::::M R:::::RRRRRR:::::R
  E::::E       EEEEE M:::::::::M     M:::::::::M RR::::R      R::::R
  E::::E             M::::::M:::M   M:::M::::::M   R:::R      R::::R
  E:::::EEEEEEEEEE   M:::::M M:::M M:::M M:::::M   R:::RRRRRR:::::R
  E::::::::::::::E   M:::::M  M:::M:::M  M:::::M   R:::::::::::RR
  E:::::EEEEEEEEEE   M:::::M   M:::::M   M:::::M   R:::RRRRRR::::R
  E::::E             M:::::M    M:::M    M:::::M   R:::R      R::::R
  E::::E       EEEEE M:::::M     MMM     M:::::M   R:::R      R::::R
EE:::::EEEEEEEE::::E M:::::M             M:::::M   R:::R      R::::R
E::::::::::::::::::E M:::::M             M:::::M RR::::R      R::::R
EEEEEEEEEEEEEEEEEEEE MMMMMMM             MMMMMMM RRRRRRR      RRRRRR

[hadoop@ip-10-2-1-122 ~]$

Glue接続確認

HiveのメタストアとしてGlueが設定されているか確認します。

show databases; を実行してみて、Glueのデータベースが表示されればOKです。

$ hive
Logging initialized using configuration in file:/etc/hive/conf.dist/hive-log4j2.properties Async: false

hive> show databases;
OK
default
elblogsample
time
trial
yellow
Time taken: 1.859 seconds, Fetched: 5 row(s)
hive >

AtlasへHive(Glue)のデータをインポート

/apache/atlas/bin/import-hive.sh というインポート用のバッチが準備されていますので、少し修正して使います。

具体的にはJavaのクラスパスに /usr/lib/hive/auxlib を追加しています。

これが無いと以下のようなエラーが出ます。

2019-02-05T11:58:19,541 ERROR [main] hive.ql.metadata.Hive - Unable to instantiate a metastore client factory com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory due to: java.lang.ClassNotFoundException: Class com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory not found
java.lang.ClassNotFoundException: Class com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory not found

では追加します。

$ sudo cp -ai /apache/atlas/bin/import-hive.sh{,.org}
$ sudo vim /apache/atlas/bin/import-hive.sh
$ $ diff -U0 /apache/atlas/bin/import-hive.sh{.org,}
--- /apache/atlas/bin/import-hive.sh.org        2018-05-30 06:31:07.000000000 +0000
+++ /apache/atlas/bin/import-hive.sh    2019-02-05 12:05:51.817829495 +0000
@@ -110 +110 @@
-CP="${ATLASCPPATH}:${HIVE_CP}:${HADOOP_CP}"
+CP="${ATLASCPPATH}:${HIVE_CP}:${HADOOP_CP}:/usr/lib/hive/auxlib/aws-glue-datacatalog-hive2-client.jar"

AtlasへGlueのデータカタログのインポート

修正したスクリプトを実行してAtlasへGlueのメタデータをインポートします。

ユーザ admin のとパスワードは admin です。

$ /apache/atlas/bin/import-hive.sh
#---- <省略>

Enter username for atlas :- admin
Enter password for atlas :-

#---- <省略>

2019-02-05T10:58:58,466 INFO [main] org.apache.atlas.hive.bridge.HiveMetaStoreBridge - Successfully imported 5 tables from database yellow
Hive Meta Data imported successfully!!!

Atlasへ接続

ローカルからSSHトンネルを構築します。

$  ssh -i .ssh/privatekey  -vnNT -L 21000:localhost:21000  hadoop@3.112.83.1

接続できたら以下のURLにアクセスします。

http://localhost:21000

以下のようにログイン画面が表示されるので、ユーザ admin パスワード admin でログオンします。

f:id:yomon8:20190205211635p:plain

hive_tableで検索かけてみるとGlueのカタログ情報が表示されます。

f:id:yomon8:20190205211619p:plain

以上です。