Apache Atlas単独でdata-lineageを表示する

#はじめに
今回、所属しているチームでメタデータ管理[^1]のOSSについて調査する機会があり、lineageの描写と管理が良さそうなApache Atlasを見つけたので試してみました。（Apache Atlasとは何かについては[こちら](http://atlas.apache.org/index.html#/)）
調査を行っているとApache Atlasを単独で使用しているような記事はあまり見当たらなかったため、本記事ではApache Atlasの機能の内、起動からdata-lineageの簡単な作成・表示を行うまでを記載していこうと思います。 
__※本記事で実行するApache Atlasのバージョンは 2.0.0 です。__

#実行環境
* os：windows10 Home(64bit)

Apache Atlasを動かすために、以下のインストールが必要です。

* java：1.8.0_265
* python：2.7.7
* maven：3.6.3

※なお、プロキシを使用しない環境での動作確認になっています。

#Apache Atlasのビルドと実行
[公式](https://github.com/apache/atlas/tree/branch-2.0)の手順に沿ってApache Atlasを実行していきます。
gitでもzipでもどちらでも良いのでローカルにソースをダウンロードし、そのディレクトリ直下で以下のコマンドを実行します。

```bash
   $ export MAVEN_OPTS="-Xms2g -Xmx2g"
   $ mvn clean package -Pdist -DskipTests=true
```

ビルドが開始されるので3~40分程度待ち、以下の表示がされれば成功です。

```
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  27:17 min
[INFO] Finished at: 2020-08-31T01:19:29+09:00
[INFO] ------------------------------------------------------------------------
```

distroディレクトリ配下にtargetディレクトリが新たに作成され、その中にある「apache-atlas-2.2.0-SNAPSHOT-bin.tar.gz」（なぜ2.0.0ブランチで2.2.0なのかはわかりませんが）を任意の場所に解凍します。

解凍完了後binディレクトリ配下の「atlas_start.py」を実行することで、Apache Atlasが起動します。  
http://localhost:21000 にアクセスすると以下のようなログイン画面が表示されます。
初期ユーザとパスワードはどちらも「admin」です。

| ![login.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670502/37ce2b1a-d907-bc77-ed2a-420366009dc4.png)|
|:-:|

ログインに成功すると以下のような画面が表示され、晴れてApache Atlasを使用することができます。

| ![index.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670502/77d51fab-718e-70c6-6f5a-e977bb97f098.png)|
|:-:|

#data-lineageの作成

ようやくApache Atlasを起動することができたので、ここからは以下のようなdata-lineageを表示することを目標にします。

| ![lineagemoto.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670502/7e0a775b-5a38-a028-04ca-3556fb8743ff.png)|
|:-:|

今回は仮想シナリオとして

`INPUT_TEST_DATAという名前の入力データを`
↓
`TEST_JOBという加工するスクリプトを通し`
↓
`OUTPUT_TEST_DATAという名前のデータとして出力する`

といった形を想定しています。

##Typeの登録
Apache Atlasは、どういったデータなのかを表す箱を用意する必要があるため、今回は加工する部分のTypeを登録していきます。（上の画像では中央の歯車マークに相当します）
※Typeの説明は[こちらのページのTypes](http://atlas.apache.org/#/TypeSystem)を参照してください。  
以下のJsonが必要最低限入力した状態のデータで、これをRest APIを使用してApache Atlasに登録していきます。

```json
{
  "entityDefs" : [ {
    "category" : "ENTITY",
    "name" : "JOB",
    "superTypes" : [ "Process" ],
    "attributeDefs" : []
  } ]
}
```

Typeの登録で使用するRest APIは以下です。
※参考：[Typeの登録](http://atlas.apache.org/api/v2/resource_TypesREST.html#resource_TypesREST_createAtlasTypeDefs_POST)

```bash:POST
http://localhost:21000/api/atlas/v2/types/typedefs/
```

##Entityの登録
Typeの登録が完了した後は実データであるEntityを登録していきます。
画像では緑色で囲っている部分です。
※Entityの説明は[こちらのページのEntities](http://atlas.apache.org/#/TypeSystem)を参照してください。

| ![lineage-entity.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670502/b55b6ccb-5c45-7ff6-11ce-ee6ec03ecc43.png)|
|:-:|


Entityは接続できる組み合わせが決まっているため、「Dataset」と作成した「JOB」を使用します。

```json:INPUT_TEST_DATA
{
    "entity": {
        "typeName": "DataSet",
        "attributes": {
        "name": "INPUT_TEST_DATA",
            "qualifiedName": "INPUT_TEST_DATA"
        }
    }
}
```

```json:OUTPUT_TEST_DAT
{
    "entity": {
        "typeName": "DataSet",
        "attributes": {
        "name": "OUTPUT_TEST_DATA",
            "qualifiedName": "OUTPUT_TEST_DATA"
        }
    }
}
```

```json:TEST_JOB
{
    "entity": {
        "typeName": "JOB",
        "attributes": {
        "name": "TEST_JOB",
            "qualifiedName": "TEST_JOB"
        }
    }
}
```

Entityの登録で使用するRest APIは以下です。
※参考：[Entityの登録](http://atlas.apache.org/api/v2/resource_EntityREST.html#resource_EntityREST_createOrUpdate_POST)

```bash:POST
http://localhost:21000/api/atlas/v2/entity/
```

##Relationshipの登録
Entityの登録が完了した後は、Entity同士を紐づける矢印の部分のデータを登録していきます。
画像では水色で囲っている部分です。

| ![lineage-relationship.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670502/c0f68748-61d5-6a12-666f-cf3e53683626.png)|
|:-:|

```json:黄色の矢印（INPUT_TEST_DATA→TEST_JOB）
{
   "typeName": "dataset_process_inputs",
   "end1": {
     "typeName": "JOB",
     "uniqueAttributes": {
       "qualifiedName": "TEST_JOB"
     }
   },
  "end2": {
    "typeName": "DataSet",
    "uniqueAttributes": {
       "qualifiedName": "INPUT_TEST_DATA"
     }
   }
}
```

```json:赤色の矢印（TEST_JOB→OUTPUT_TEST_DATA）
{
   "typeName": "process_dataset_outputs",
   "end1": {
     "typeName": "JOB",
     "uniqueAttributes": {
       "qualifiedName": "TEST_JOB"
     }
   },
  "end2": {
    "typeName": "DataSet",
    "uniqueAttributes": {
       "qualifiedName": "OUTPUT_TEST_DATA"
     }
   }
}
```

Relationshipの登録で使用するRest APIは以下です。
※参考：[Relationshipの登録](http://atlas.apache.org/api/v2/resource_RelationshipREST.html#resource_RelationshipREST_create_POST)

```bash:POST
http://localhost:21000/api/atlas/v2/relationship/
```

##結果
全てのデータの登録が完了すると目標であった画像のdata-lineageが完成します。

| ![lineagetab.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670502/0846bb9e-a953-3798-ebe1-a1d770b0a042.png)|
|:-:|


#おわりに
Apache Atlasの起動からdata-lineageの表示まででしたが、いかがだったでしょうか？
実際に動かそうとすると、公式ページにも記載されていないことが多々あり調査には大分苦戦しました。
ただ、個人としてはApache Atlasはメタデータ管理の分野で有用なツールになりうる存在だと思います。
今回はApache Atlasの起動とdata-lineageの表示が目標だったため説明を省略した部分がありますが、各データの意味やその他にも機能があるので、次回以降そういった箇所にフォーカスした記事を記載していこうと思います。

[^1]: メタデータ管理について知りたい方は [こちらの記事](https://udemy.benesse.co.jp/marketing/howto/metadata.html) が分かりやすいです。