Cloud Bigtable로 JanusGraph 실행

이 가이드에서는 Google Cloud(GCP)에서 JanusGraph를 실행하는 방법을 보여줍니다. JanusGraph는 대용량 데이터를 다룰 수 있는 그래프 데이터베이스입니다. 그래프 데이터베이스를 사용하면 데이터 항목 및 항목 간의 관계를 모델링하여 유용한 정보를 발견할 수 있습니다. 그래프 관련 용어에서는 항목을 노드 또는 꼭지점이라고 하고, 관계를 모서리라고 합니다. 꼭지점과 모서리에는 속성이 연결됩니다.

속성 그래프의 예시

그림 1. 속성 그래프의 예시

그래프 데이터베이스를 사용하면 다양한 분야와 활동을 모델링할 수 있습니다.

  • 소셜 네트워크
  • 사기 행위 분석
  • 물리적 네트워크

그래프 데이터베이스를 만들 때는 경우에 따라 꼭지점과 모서리의 개수가 수백만 내지 수십억에 이르기도 합니다. JanusGraph와 Bigtable을 내부 스토리지 계층으로 함께 사용하면 필요한 크기 및 처리량과 무관하게 빠른 쿼리를 실행하고 스토리지 계층을 확장할 수 있습니다. 이 가이드에 따라 확장 가능한 JanusGraph 인프라를 Bigtable과 함께 배포하여 임의의 그래프 데이터베이스에 있는 관계를 순회할 수 있습니다.

GKE의 JanusGraph 및 Bigtable 배포

그림 2. GKE의 JanusGraph 및 Bigtable 배포

목표

  • Bigtable 인스턴스를 만듭니다.
  • GKE 클러스터를 만듭니다.
  • Kubernetes 패키지 관리자인 Helm을 설치합니다.
  • Helm 차트를 사용하여 JanusGraph 및 Elasticsearch를 배포합니다.
  • Gremlin을 사용하여 JanusGraph에 연결합니다.
  • 데이터를 로드한 후 쿼리합니다.

비용

이 가이드에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.

  • GKE에서 사용하는 Compute Engine
  • Bigtable

프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요. Google Cloud를 처음 사용하는 사용자는 무료 체험판을 사용할 수 있습니다.

시작하기 전에

  1. Google 계정으로 로그인합니다.

    아직 계정이 없으면 새 계정을 등록하세요.

  2. Cloud Console의 프로젝트 선택기 페이지에서 Cloud 프로젝트를 선택하거나 만듭니다.

    프로젝트 선택기 페이지로 이동

  3. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다. 프로젝트에 결제가 사용 설정되어 있는지 확인하는 방법을 알아보세요.

  4. Bigtable, Bigtable Admin, Compute Engine, and GKE API를 사용 설정합니다.

    API 사용 설정

이 가이드를 마친 후에 계속 비용이 청구되지 않도록 하려면 만든 리소스를 삭제하면 됩니다. 자세한 내용은 삭제를 참조하세요.

환경 준비

이 가이드에서는 Cloud Shell을 사용하여 명령어를 입력합니다. Cloud Shell은 Cloud Console의 명령줄에 대한 액세스 권한을 제공하고 Cloud SDK 및 GCP에서 개발에 필요한 기타 도구를 포함합니다. 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. 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
    

Bigtable 인스턴스 만들기

이 가이드에서는 JanusGraph 스토리지 백엔드로 요구사항에 맞게 빠르게 확장될 수 Bigtable을 사용합니다. 이 가이드에서 사용하는 단일 노드 개발 클러스터는 경제적이며 이 가이드를 진행하는 데 충분한 성능을 제공합니다. 개발 클러스터에서 프로젝트를 시작한 후 프로덕션 데이터로 작업할 준비가 되면 대규모 프로덕션 클러스터로 이동할 수 있습니다. 작업에 맞는 클러스터 크기를 선택하는 데 도움이 되는 성능 및 확장 관련 정보는 Bigtable 문서를 참조하세요.

다음 단계에 따라 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... 출력이 몇 번 표시될 수 있지만, 중지되면 Helm을 Kubernetes 클러스터에 사용할 수 있습니다.

Helm을 사용하여 JanusGraph 및 Elasticsearch 설치

JanusGraph에서 Bigtable을 스토리지 백엔드로 사용할 뿐 아니라 Elasticsearch를 색인 생성 백엔드로 사용하려고 합니다.

이 섹션에서는 Helm 차트를 사용하여 Kubernetes 클러스터에 JanusGraphElasticsearch를 배포합니다. JanusGraph 차트를 설치하면 Elasticsearch가 종속 항목으로 포함되므로 프로세스가 간소화됩니다.

  1. Cloud Shell에서 앞에서 기록한 Bigtable 인스턴스 ID의 값을 보유할 환경 변수를 설정합니다. [YOUR_INSTANCE_ID]를 앞에서 지정한 인스턴스 ID로 바꿉니다.

    export INSTANCE_ID=[YOUR_INSTANCE_ID]

    예를 들어 기본값으로 제시된 janusgraph를 Bigtable 인스턴스 ID로 사용한 경우 다음을 실행합니다.

    export INSTANCE_ID=janusgraph
  2. JanusGraph를 설치할 때 사용할 구체적인 구성을 Helm에 제공하는 values.yaml 파일을 만듭니다.

    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에 함께 포함된 샘플 데이터 세트인 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
    

이 신들의 그래프 데이터 세트에서 실행 가능한 순회 탐색 쿼리에 더 익숙해지고 싶다면 JanusGraph 문서의 다른 샘플 쿼리를 사용해 보세요.

삭제

이 가이드에서 사용한 리소스 비용이 Google Cloud Platform 계정에 청구되지 않도록 하려면 다음의 방법을 따르세요.

  1. Cloud Console에서 리소스 관리 페이지로 이동합니다.

    리소스 관리 페이지로 이동

  2. 프로젝트 목록에서 삭제할 프로젝트를 선택하고 삭제 를 클릭합니다.
  3. 대화상자에서 프로젝트 ID를 입력한 다음 종료를 클릭하여 프로젝트를 삭제합니다.

다음 단계