JanusGraph/JanusGraph 이론

JanusGraph 기초 개념 ④ / Hadoop과 Spark

Severus Moriarty 2025. 4. 15. 16:49

지금까지 JanusGraph의 구조와 탐색 방식에 대해 살펴봤다면,

이번에는 대규모 그래프 데이터에서 어떻게 분석을 수행하는지 알아보도록 하겠습니다.
JanusGraph는 단순히 데이터를 저장하는 수준을 넘어, Hadoop·Spark와 통합하여 수백만 개 정점의 그래프 분석도 가능하도록 설계되어 있습니다.

 

✅ 왜 대규모 분석이 필요한가?

그래프 데이터는 작을 땐 눈으로도 확인할 수 있지만, 규모가 커지면 문제가 달라집니다:

  • 정점: 1,000,000개 이상
  • 간선: 수백만 개
  • 복잡한 연산: 예) 평균 나이, 커뮤니티 탐색, 추천 시스템, 최단 경로

이때는 단일 머신으로 처리할 수 없고, 분산 처리 프레임워크의 도움이 필요합니다.

 

✅ JanusGraph + Hadoop/Spark 아키텍처

JanusGraph는 내부적으로 TinkerPop의 OLAP(분산 분석) 기능을 이용해 Hadoop 기반의 그래프 연산을 수행할 수 있습니다.

 

🔧 구조 개요

[Gremlin 쿼리]
    ↓
[JanusGraph]
    ↓
[TinkerPop GraphComputer]
    ↓
[Hadoop / Spark 실행 엔진]
    ↓
[병렬 분석 결과]

=> Spark는 JanusGraph의 .compute() 기반 OLAP 분석을 위한 "분산 계산 엔진"!

✅ 그래서, 어떤 분석이 가능한가?

 
분석 유형설명
정점 속성 집계 전체 사용자의 평균 나이, 최대 수 등
연결 중심성 분석 누가 가장 많은 연결을 갖고 있는가?
페이지랭크 영향력 있는 노드 탐색
커뮤니티 탐지 서로 밀접한 사용자 집단 탐색
최단 경로 분석 두 지점 간 최소 경로 탐색(관련성)

 

✅ Spark 기반 분석 예시

      → 🧠 목표: PageRank로 노드의 중요도(연결 중심성) 계산하기

graph = JanusGraphFactory.open('conf/janusgraph-hadoop.properties')
graph.compute() // 그래프 분석 시작점
     .program(PageRankVertexProgram.build().create(graph)) // 실행할 알고리즘 등록
     .submit() // 분산 환경(Spark 등)에 작업 제출
     .get() // 분석이 끝난 후 결과 수집
  • PageRankVertexProgram노드 간 연결 구조를 분석하여
    "어떤 정점이 얼마나 영향력이 큰가?"를 수치로 평가해주는 알고리즘입니다.
    → 예: Google 검색 엔진에서 중요한 웹페이지 찾을 때 사용

- 메서드 설명

  • PageRankVertexProgram: 노드의 중요도를 계산하는 알고리즘
  • .compute(): 그래프 분석 시작
  • .submit(): 분산 작업 제출
  • .get(): 결과 수집
    메서드 설명 역할
    compute() 그래프 분석 시작점 Gremlin의 GraphComputer 실행 선언
    program(...) 실행할 알고리즘 등록 PageRank, ConnectedComponent 등
    submit() 분산 환경(Spark 등)에 작업 제출 병렬 처리 작업 큐에 등록
    get() 분석이 끝난 후 결과 수집 결과가 담긴 ComputerResult 반환

🎯 샘플 예시

정점 연결
A → B, C
B → C
C → A

→ 총 3개 노드의 순환 연결 구조


✅ 실제 코드 흐름과 결과

ComputerResult result = graph.compute()
                        .program(PageRankVertexProgram.build().create(graph))
                        .submit()
                        .get();

= > 결과 확인 방법:

GraphTraversalSource g = result.graph().traversal();

g.V().valueMap("name", "pageRank").toList();

🔢 출력 예시:

[
  { "name": ["A"], "pageRank": [0.33] },
  { "name": ["B"], "pageRank": [0.29] },
  { "name": ["C"], "pageRank": [0.38] }
]

🧩 각각의 함수는 어떤 값을 만드는가?

단계 생성되는 값 설명
.compute() GraphComputer 객체 그래프 분석 실행 선언. Spark or Hadoop 백엔드에 따라 내부 실행 엔진 설정됨
.program(...) PageRank 실행 설정 실제로 어떤 알고리즘을 적용할지 지정. 내부적으로 컴퓨팅 전략과 파라미터 정의
.submit() Future 작업 객체 분석 작업이 백그라운드에서 병렬 실행됨. 내부적으로는 Spark Job으로 분산됨
.get() ComputerResult 객체 모든 연산이 끝난 후, 메모리에 결과를 적재하여 리턴. 이후 .graph()로 탐색 가능

🛠 기타 결과 활용 예시

  • 가장 영향력 있는 사용자 상위 3명 출력:
// PageRank 계산이 완료된 결과 그래프에서 트래버설을 시작
result.graph().traversal()
    // 정점들(V)을 대상으로
    .V()
    // pageRank 값을 기준으로 내림차순 정렬 (decr = descending)
    .order().by("pageRank", decr)
    // 상위 3개의 정점만 선택 (가장 영향력 높은 노드 3개)
    .limit(3)
    // 각 정점에서 name과 pageRank 속성 값을 출력
    .valueMap("name", "pageRank")

이 쿼리는 PageRank 분석이 완료된 그래프에서
가장 영향력 높은 노드 3개의 이름(name)과 pageRank 점수를 출력하는 쿼리.

 

📌 핵심 정리

요소 의미 예시
PageRankVertexProgram 실행 알고리즘 정의 노드 중요도 측정
.compute() 분석 모드 진입 GraphComputer 생성
.submit() 병렬 작업 시작 Spark 클러스터로 분산
.get() 결과 수집 ComputerResult → g.V().valueMap()

 

💡 결과는 다시 JanusGraph에 저장하거나, 외부 시스템으로 전송 가능

 

✅ Hadoop 기반의 이점

요소 장점
HDFS 수 TB 단위의 대규모 그래프 저장 가능
MapReduce 느리지만 안정적인 병렬 처리
Spark 빠르고 메모리 기반 병렬 처리
GraphComputer TinkerPop 기반, 다양한 연산 지원

📌 JanusGraph의 확장성 핵심은 분산 처리

기술 역할
JanusGraph 그래프 저장 및 탐색 엔진
TinkerPop OLAP 대규모 그래프 분석 실행 구조
Hadoop / Spark 실제 분산 계산 수행 엔진

 

✅ 실무 적용 예시 + 분석 방법 + Gremlin 활용 방식

적용 분야 설명 활용 메서드 / 쿼리 예시
소셜 네트워크 분석 영향력 있는 인플루언서 탐색 (팔로워가 많은 사람, PageRank 높은 사람 등) g.V().order().by('pageRank', decr).limit(5).valueMap('name', 'pageRank')
→ PageRank 기반 상위 사용자 추출
사기 탐지
(Fraud Detection)
특정 노드가 비정상적으로 많은 연결을 가졌거나, 이상한 경로를 가질 경우 탐지 g.V().hasLabel('account').where(__.outE().count().is(gt(100)))
→ 연결이 지나치게 많은 계좌 탐지
지식 그래프 분석 다양한 관계를 기반으로 추론, 다단계 관계 연결 확인 g.V().has('concept','Person').repeat(out()).times(3).path()
→ 사람 → 조직 → 위치 등 간접 관계 탐색
추천 시스템 유사한 사용자 또는 아이템을 기준으로 콘텐츠 추천 g.V().has('user','id','U1').out('likes').in('likes').where(neq('U1')).dedup()
→ U1과 유사한 취향의 사용자 찾기

 

💡 위 예시에서 사용하는 메서드 요약:

메서드 용도
order().by() 랭킹 정렬 (예: PageRank 기준)
count().is(gt(n)) 특정 임계값 이상의 연결 수 필터링
repeat().times() 다단계 관계 추론 (연속 관계 탐색)
path() 관계 경로 시각화 및 분석
in(), out() 방향성 있는 탐색 (팔로우, 소속 등)
where(neq()), dedup() 추천 시 유사 사용자 중 중복 제거

추가 팁

  • JanusGraph에서의 분석적 질의(OLAP)는 .compute() 기반이고,
  • 위 예시들은 OLTP(Gremlin 실시간 탐색) 기반 쿼리입니다.
  • 대규모 네트워크 분석이 필요한 경우 GraphComputer + PageRankVertexProgram 등의 OLAP 접근도 함께 고려하세요.