使用 Cloud Bigtable 运行 JanusGraph

本教程介绍如何在 Google Cloud (GCP) 上运行 JanusGraph。 JanusGraph 是一个图表数据库,支持处理大量数据。图表数据库可为数据实体及其之间的关系建模,从而帮助您发掘洞见。在图表术语中,实体称为“节点”或“顶点”,它们之间的关系称为“边”。顶点和边都可以具有关联的属性。

属性图表示例

图 1. 属性图表示例

图表数据库可帮助您为各种网域和活动建模:

  • 社交网络
  • 欺诈分析
  • 物理网络

创建图表数据库时,有时会创建数百万甚至数十亿个顶点和边。当您使用 JanusGraph 并将 Bigtable 作为底层存储层时,您可以执行快速查询并根据所需的大小和吞吐量独立扩缩存储层。按照本教程的说明,部署使用 Bigtable 的可扩缩的 JanusGraph 基础架构,您就可以用它遍历任意图表数据库中存在的关系。

在 GKE 上部署使用 Bigtable 的 JanusGraph

图 2. 在 GKE 上部署使用 Bigtable 的 JanusGraph

目标

  • 创建 Bigtable 实例
  • 创建 GKE 集群。
  • 安装 Helm(一个 Kubernetes 软件包管理器)。
  • 使用 Helm 图表部署 JanusGraph 和 Elasticsearch
  • 使用 Gremlin 并连接到 JanusGraph。
  • 加载并查询数据。

费用

本教程使用 Google Cloud 的以下收费组件:

  • Compute Engine,由 GKE 使用
  • Bigtable

您可使用价格计算器根据您的预计使用量来估算费用。 Google Cloud 新用户可能有资格申请免费试用

准备工作

  1. 登录您的 Google Cloud 帐号。如果您是 Google Cloud 新手,请创建一个帐号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
  2. 在 Google Cloud Console 的项目选择器页面上,选择或创建一个 Google Cloud 项目。

    转到“项目选择器”

  3. 确保您的 Cloud 项目已启用结算功能。 了解如何确认您的项目是否已启用结算功能

  4. 启用 Bigtable, 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 地区设置为要创建 Bigtable 集群和 GKE 集群的地区。本教程使用 us-central1-f

    gcloud config set compute/zone us-central1-f
  3. 创建一个 GKE 集群来部署 JanusGraph:

    gcloud container clusters create janusgraph-tutorial \
        --cluster-version=1.15 \
        --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 -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3
    chmod 700 get_helm.sh
    ./get_helm.sh
    

创建 Bigtable 实例

对于 JanusGraph 存储后端,本教程使用 Bigtable,它可以快速扩缩以满足您的需求。本教程使用单节点开发集群,它足以完成本教程的目标且经济实惠。您可以先在开发集群中启动您的项目,并在准备好处理生产数据时迁移到更大的生产集群。Bigtable 文档中包含有关性能和扩缩的详细讨论,可帮助您根据自己的工作选择集群大小。

按照以下步骤创建您的 Bigtable 实例。

  1. 在 Cloud Console 中,转到创建实例页面:

    转到“创建实例”页面

  2. 实例名称框中,为实例输入一个名称。您可以选择使用 janusgraph 或其他小写名称。该页面会自动设置实例 ID。点击 Continue

  3. 对于选择存储类型,请选择 HDD。点击 Continue

  4. 系统会自动设置集群 ID节点。对于区域,请选择 us-central1。对于可用区,请选择 us-central1-f 或之前创建 GKE 集群的可用区。

  5. 点击创建以创建实例。

记下实例 ID,因为您将在后面的步骤中使用。

配置 Helm

使用 Helm 将应用部署到 Kubernetes 集群。创建集群后,初始化 Helm 图表代码库

  1. 将以下命令粘贴到 Cloud Shell 中:

    helm repo add stable https://charts.helm.sh/stable
    

使用 Helm 安装 JanusGraph 和 Elasticsearch

除了使用 Bigtable 作为其存储后端之外,JanusGraph 还将使用 Elasticsearch 作为索引后端

在本部分中,您将使用 Helm 图表JanusGraphElasticsearch 部署到 Kubernetes 集群。安装 JanusGraph 图表时,Elasticsearch 已作为依赖项包含在内,从而简化了流程。

  1. 在 Cloud Shell 中,设置环境变量以保存您之前记下的 Bigtable 实例 ID 的值。将 [YOUR_INSTANCE_ID] 替换为您之前指定的实例 ID。

    export INSTANCE_ID=[YOUR_INSTANCE_ID]

    例如,如果您为 Bigtable 实例 ID 使用了默认的 janusgraph 建议,则可以运行:

    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 upgrade --install --wait --timeout 600s 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 shell:

    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 shell 中,输入以下命令:

    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 帐号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。

  1. 在 Cloud Console 中,转到管理资源页面。

    转到“管理资源”

  2. 在项目列表中,选择要删除的项目,然后点击删除
  3. 在对话框中输入项目 ID,然后点击关闭以删除项目。

后续步骤