使用 Cloud BigTable 執行 JanusGraph

本教學課程說明如何在 Google Cloud Platform (GCP) 上執行 JanusGraph。 JanusGraph 是一個支援處理大量資料的圖形資料庫。圖形資料庫透過針對資料實體及其之間的關係建立模型,來協助您發掘深入分析資料。在圖形術語中,實體稱為「節點」或「端點」,關係則稱為「邊線」。端點和邊線都可以有相關聯的屬性。

屬性圖的範例

圖 1。屬性圖的範例

圖形資料庫可協助您針對各種網域和活動建立模型:

  • 社交網路
  • 詐欺分析
  • 實體網路

建立圖形資料庫時,您有時會建立數百萬個甚至是數十億個端點和邊線。當您將 JanusGraph 和 Cloud BigTable 搭配使用來做為基礎儲存層時,您既可以執行快速查詢,也可以根據所需的大小和總處理量來獨立擴充儲存層。請使用本教學課程來利用 Cloud BigTable 部署可擴充的 JanusGraph 基礎架構,然後您便可以將其用於周遊任何圖形資料庫中存在的關係。

在 GKE 上使用 Cloud BigTable 進行 JanusGraph 部署

圖 2. 在 GKE 上使用 Cloud BigTable 進行 JanusGraph 部署

目標

費用

本教學課程使用下列 Google Cloud Platform 計費元件:

  • 供 GKE 使用的 Compute Engine
  • Cloud BigTable

您可以使用 Pricing Calculator 根據預測用量估算費用。初次使用 GCP 的使用者可能符合免費試用資格。

事前準備

  1. 登入您的 Google 帳戶。

    如果您沒有帳戶,請申請新帳戶

  2. 在 GCP Console 的專案選擇器頁面中,選取或建立 GCP 專案。

    前往專案選取器頁面

  3. 請確認您已啟用 Google Cloud Platform 專案的計費功能。瞭解如何確認您已啟用專案的計費功能

  4. 啟用Cloud Bigtable、Cloud Bigtable Admin、Compute Engine 和 GKE必要的 API。

    啟用 API

完成本教學課程後,您可以刪除已建立的資源以避免繼續計費。詳情請參閱清除所用資源一節。

準備環境

在本教學課程中,您將使用 Cloud Shell 輸入指令。Cloud Shell 可讓您在 GCP Console 中存取指令列,其中包括 Cloud SDK 以及在 GCP 中進行開發所需的其他工具。Cloud Shell 會在 GCP 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. 建立一個 GKE 叢集以部署 JanusGraph:

    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. 在 GCP Console 中,前往「Create Instance」(建立執行個體) 頁面:

    前往「CREATE INSTANCE」(建立執行個體) 頁面

  2. 在「Instance name」(執行個體名稱) 方塊中輸入執行個體的名稱。您可以使用 janusgraph,或是自行選擇使用其他小寫名稱。輸入執行個體名稱後,該頁面會自動設定「Instance ID」(執行個體 ID) 和「Cluster ID」(叢集 ID)

  3. 將「Instance type」(執行個體類型) 設定為「Development」(開發)。

  4. 在「Zone」(區域) 下,選取 us-central1-f 或您之前建立 GKE 叢集的區域。

  5. 按一下 [Create] (建立) 以建立執行個體。

記下執行個體 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... 輸出幾次,但當它停止時,您就可以將 Helm 與 Kubernetes 叢集搭配使用。

使用 Helm 安裝 JanusGraph 和 Elasticsearch

除了使用 Cloud BigTable 做為其儲存空間後端外,JanusGraph 也會使用 Elasticsearch 做為索引後端。 在本節中,您將使用 Helm 圖表將 JanusGraph 和 Elasticsearch 部署至 Kubernetes 叢集。安裝 JanusGraph 圖表時,Elasticsearch 會以依附元件的形式包含在內,進而簡化程序。

  1. 在 Cloud Shell 中,設定環境變數以保存您先前記下的 Cloud BigTable 執行個體 ID 的值。將 [YOUR_INSTANCE_ID] 改成您之前指定的執行個體 ID。

    export INSTANCE_ID=[YOUR_INSTANCE_ID]

    例如,如果您使用 janusgraph 的預設建議做為 Cloud BigTable 執行個體 ID,則可以執行:

    export INSTANCE_ID=janusgraph
  2. 建立 values.yaml 檔案,該檔案可為 Helm 提供在安裝 JanusGraph 時要使用的特定設定:

    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. 連線至該 pod 並執行 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 指令以建立兩個端點和一個邊線:

    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 組合在一起的範例資料集:眾神圖,其中描繪了神話中的神祇及其位置屬性。

  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
    

如要更熟悉可在此眾神圖資料集中進行的周遊查詢,請嘗試 JanusGraph 文件中的其他範例查詢。

清除所用資源

如何避免系統向您的 Google Cloud Platform 帳戶收取在本教學課程中使用資源的相關費用:

  1. 前往 GCP Console 中的「Manage resources」(管理資源) 頁面。

    前往「Manage resources」(管理資源) 頁面

  2. 在專案清單中選取您要刪除的專案,然後按一下「Delete」(刪除) 圖示
  3. 在對話方塊中輸入專案 ID,然後按一下 [Shut down] (關閉) 以刪除專案。

後續步驟