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 접근도 함께 고려하세요.