Cloud Bigtable を使用した JanusGraph の実行

このチュートリアルでは、Google Cloud(GCP)で JanusGraph を実行する方法を説明します。JanusGraph は、大量のデータを扱うことをサポートするグラフ データベースです。グラフ データベースは、データ エンティティとその間の関係をモデリングすることで、分析情報を得るために役立ちます。グラフ用語では、エンティティは「節点(node)」または「点(vertex)」と呼ばれ、関係は「辺(edge)」と呼ばれます。点と辺のどちらにも、プロパティを関連付けることができます。

プロパティ グラフの例

図 1: プロパティ グラフの例

グラフ データベースは、さまざまなドメインとアクティビティをモデル化するのに役立ちます。

  • ソーシャル ネットワーク
  • 不正行為分析
  • 物理ネットワーク

グラフ データベースを作成する際は、数百万、場合によっては数十億の点と辺を作成することがあります。Cloud Bigtable をストレージ層の基礎として JanusGraph を使用する場合は、高速クエリの実行と、ストレージ層の個別拡張の両方を行うことで、必要なサイズとスループットを得ることができます。このチュートリアルを使用すると、Cloud Bigtable でスケーラブルな JanusGraph インフラストラクチャをデプロイできます。そのインフラストラクチャは、グラフ データベースに存在する関係を走査するために使用できます。

GKE での Cloud Bigtable による JanusGraph のデプロイ

図 2:GKE での Cloud Bigtable による JanusGraph のデプロイ

目標

  • Cloud Bigtable インスタンスを作成する。
  • GKE クラスタを作成する。
  • Kubernetes パッケージ マネージャー Helm をインストールする。
  • Helm チャートを使用して JanusGraph と Elasticsearch をデプロイする。
  • Gremlin を使用し、JanusGraph に接続する。
  • クエリデータを読み込んで実行する。

料金

このチュートリアルでは、課金対象である次の Google Cloud コンポーネントを使用します。

  • GKE で使用される Compute Engine
  • Cloud Bigtable

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。新しい Google Cloud ユーザーは無料トライアルをご利用いただけます。

始める前に

  1. Google アカウントにログインします。

    Google アカウントをまだお持ちでない場合は、新しいアカウントを登録します。

  2. Cloud Console のプロジェクト セレクタページで、Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタのページに移動

  3. Google Cloud プロジェクトに対して課金が有効になっていることを確認します。プロジェクトに対して課金が有効になっていることを確認する方法を学習する

  4. Cloud Bigtable, Cloud Bigtable Admin, Compute Engine, and GKE API を有効にします。

    API を有効にする

このチュートリアルの終了後は、作成したリソースを削除するとそれ以上の請求が発生しなくなります。詳細については、クリーンアップをご覧ください。

環境の準備

このチュートリアルでは、Cloud Shell を使用してコマンドを入力します。Cloud Shell では Cloud Console のコマンドラインにアクセスできます。また、GCP で開発を行うために必要な Cloud SDK やその他のツールも含まれています。Cloud Shell は、Cloud Console の下部にウィンドウとして表示されます。初期化が完了するまでに数分かかることもありますが、ウィンドウはすぐに表示されます。

  1. Cloud Shell をアクティブにします。

    Cloud Shell をアクティブにする

  2. Cloud Shell では、デフォルトの Compute Engine ゾーンを、Cloud Bigtable クラスタと GKE クラスタを作成するゾーンに設定します。このチュートリアルでは us-central1-f を使用します。

    gcloud config set compute/zone us-central1-f
  3. JanusGraph をデプロイする GKE クラスタを作成します。

    gcloud container clusters create janusgraph-tutorial --machine-type n1-standard-4 \
        --scopes "https://www.googleapis.com/auth/bigtable.admin","https://www.googleapis.com/auth/bigtable.data"
    
  4. Cloud Shell 環境に Helm をインストールします。

    curl https://raw.githubusercontent.com/kubernetes/helm/master/scripts/get | bash
    

Cloud Bigtable インスタンスの作成

JanusGraph ストレージのバックエンドとして、このチュートリアルではニーズに合わせてすぐにスケーリングできる Cloud Bigtable を使用します。このチュートリアルでは単一ノードの開発クラスタを使用します。経済的で、このチュートリアルに十分対応できます。開発クラスタでプロジェクトを開始し、本番環境データを処理する準備ができたら、規模を大きくした本番環境クラスタに移行してください。作業用のクラスタサイズを選択する際の参考としては、Cloud Bigtable のドキュメントに記載されているパフォーマンスとスケーリングに関する詳細な説明をご覧ください。

次の手順に従って、Cloud Bigtable インスタンスを作成します。

  1. Cloud Console で [インスタンスの作成] ページに移動します。

    [インスタンスの作成] ページに移動

  2. [インスタンス名] ボックスに、インスタンスの名前を入力します。janusgraph または任意の小文字の名前を使用できます。インスタンスの名前を入力すると、このページの [インスタンス ID] フィールドと [クラスタ ID] フィールドに自動的に値が設定されます。

  3. [インスタンスのタイプ] を [開発] に設定します。

  4. [ゾーン] で、[us-central1-f] または以前に GKE クラスタを作成したゾーンを選択します。

  5. [作成] をクリックしてインスタンスを作成します。

以降のステップで使用するので、インスタンス ID を記録しておきます。

Helm の構成

Helm を使用して、アプリケーションを Kubernetes クラスタにデプロイします。クラスタの作成後は、Helm がクラスタで動作するよう構成します。

  1. 次のコマンドを Cloud Shell に貼り付けます。

    kubectl create serviceaccount tiller --namespace kube-system
    kubectl create clusterrolebinding tiller-cluster-rule --clusterrole=cluster-admin \
        --serviceaccount=kube-system:tiller
    helm init --service-account=tiller
    until (timeout 7 helm version > /dev/null 2>&1); do echo "Waiting for tiller install..."; done
    

    Waiting for tiller install... という出力が何回か表示されることがありますが、それが表示されなくなると、Kubernetes クラスタで Helm を使用できるようになります。

Helm を使用した JanusGraph と Elasticsearch のインストール

JanusGraph は Cloud Bigtable をストレージ バックエンドとして使用するだけでなく、Elasticsearch をインデックス バックエンドとして使用します。

このセクションでは、Helm チャートを使用して、JanusGraphElasticsearch を Kubernetes クラスタにデプロイします。JanusGraph チャートをインストールすると、依存関係として Elasticsearch が組み込まれてプロセスが簡素化されます。

  1. Cloud Shell で、以前メモした Cloud Bigtable のインスタンス ID の値を保持する環境変数を設定します。[YOUR_INSTANCE_ID] は、前に指定したインスタンス ID に置き換えます。

    export INSTANCE_ID=[YOUR_INSTANCE_ID]

    たとえば、Cloud Bigtable のインスタンス ID に janusgraph というデフォルトの候補を使用する場合は、次のように実行します。

    export INSTANCE_ID=janusgraph
  2. values.yaml ファイルを作成します。このファイルは、JanusGraph のインストール時に使用する構成を Helm に提供します。

    cat > values.yaml << EOF
    replicaCount: 3
    service: type: LoadBalancer serviceAnnotations: cloud.google.com/load-balancer-type: "Internal"
    elasticsearch: deploy: true
    properties: storage.backend: hbase storage.directory: null storage.hbase.ext.google.bigtable.instance.id: $INSTANCE_ID storage.hbase.ext.google.bigtable.project.id: $GOOGLE_CLOUD_PROJECT storage.hbase.ext.hbase.client.connection.impl: com.google.cloud.bigtable.hbase1_x.BigtableConnection index.search.backend: elasticsearch index.search.directory: null cache.db-cache: true cache.db-cache-clean-wait: 20 cache.db-cache-time: 180000 cache.db-cache-size: 0.5
    persistence: enabled: false EOF
  3. 作成した values.yaml ファイルを使用して、JanusGraph に Helm チャートをデプロイします。

    helm install --wait --timeout 600 --name janusgraph stable/janusgraph -f values.yaml
    

    すべてのリソースが準備できるまで待ってからインストールが行われます。このプロセスには数分かかることがあります。

JanusGraph のデプロイの確認

helm install コマンドが終了すると、最初の操作を説明した NOTES セクションが出力されます。Cloud Shell で NOTES セクションに概要が示された手順に従い、JanusGraph 環境が機能しているかどうかテストします。

  1. JanusGraph を実行している Kubernetes Pod の名前を環境変数に設定します。

    export POD_NAME=$(kubectl get pods --namespace default -l "app=janusgraph,release=janusgraph" -o jsonpath="{.items[0].metadata.name}")
    
  2. ポッドに接続して Gremlin シェルを実行します。

    kubectl exec -it $POD_NAME -- /janusgraph-0.2.0-hadoop2/bin/gremlin.sh
    
  3. Gremlin コンソールで、Apache TinkerPop サーバーに接続します。

    :remote connect tinkerpop.server conf/remote.yaml session
    :remote console
    

    出力は次のようになります。

    gremlin> :remote connect tinkerpop.server conf/remote.yaml session
    ==>Configured localhost/127.0.0.1:8182-[b08972f2-a2aa-4312-8018-bcd11bc9812c]
    gremlin> :remote console
    ==>All scripts will now be sent to Gremlin Server - [localhost/127.0.0.1:8182]-[b08972f2-a2aa-4312-8018-bcd11bc9812c] - type ':remote console' to return to local mode
    gremlin>
    
  4. 次の Gremlin コマンドを実行して、2 つの点と 1 つの辺を作成します。

    v1 = graph.addVertex(label, 'hello')
    v2 = graph.addVertex(label, 'world')
    v1.addEdge('followedBy', v2)
    graph.tx().commit()
    

    出力は次のようになります。

    gremlin> v1 = graph.addVertex(label, 'hello')
    ==>v[4344]
    gremlin>  v2 = graph.addVertex(label, 'world')
    ==>v[40964152]
    gremlin>  v1.addEdge('followedBy', v2)
    ==>e[17j-3co-4fmd-oe054][4344-followedBy->40964152]
    gremlin>
    
  5. Gremlin クエリを発行して、hello というラベルの付いた点から辺 out 経由でつながる点のラベルを調べます。

    g.V().has(label, 'hello').out('followedBy').label()
    

    クエリの構文については、次のセクションで説明します。現時点では、クエリの出力として「world」という単語が表示されます。

    gremlin> g.V().has(label, 'hello').out('followedBy').label()
    ==>world
    

サンプル データセットの読み込みとクエリ

JanusGraph をデプロイし、Gremlin を使用して JanusGraph に接続できたので、独自のデータの読み込みとクエリを開始できます。そのプロセスがどのようなものであるかを示すため、JanusGraph にバンドルされているサンプル データセットを読み込みます。読み込むのは、神話の神々とその場所のプロパティを表す Graph of the Gods です。

  1. 前のセクションの Gremlin シェルを開いた状態のまま、次のコマンドを入力します。

    GraphOfTheGodsFactory.load(graph)
    

    コマンドが完了すると null が返されます。

    gremlin> GraphOfTheGodsFactory.load(graph)
    ==>null
    
  2. サンプルグラフを読み込んだ状態で、グラフ走査クエリを発行します。たとえば、Jupiter のすべての兄弟を見つけるには、次のクエリを入力します。

    g.V().has('name', 'jupiter').out('brother').values('name')
    

    走査するステップをよく見ていくと、このクエリを分解して理解できます。

    走査ステップ 説明
    g.V() 最初に点の集合を調べます。
    has('name', 'jupiter') プロパティ name の値が jupiter となっている点を探します。
    out('brother') そこから、brother というラベルを持つすべての辺に沿って移動します。
    values('name') この辺につながる点の name プロパティを取得します。

    クエリの出力は次のようになります。

    gremlin> g.V().has('name', 'jupiter').out('brother').values('name')
    ==>neptune
    ==>pluto
    

この Graph of the Gods データセットに発行可能な走査クエリをよりよく理解できるよう、JanusGraph のドキュメントで他のサンプルクエリを試してみてください。

クリーンアップ

このチュートリアルで使用したリソースについて、Google Cloud Platform アカウントに課金されないようにする手順は次のとおりです。

  1. Cloud Console で [リソースの管理] ページに移動します。

    [リソースの管理] ページに移動

  2. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
  3. ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。

次のステップ