Data Engineering/python
EP24 | 고급 Python 활용 #13 | Spark GraphX를 활용한 그래프 데이터 분석
ygtoken
2025. 3. 19. 23:13
728x90
이 글에서 다루는 개념
Apache Spark의 GraphX는 대용량 그래프 데이터를 분석하는 라이브러리입니다.
이번 글에서는 다음 내용을 학습합니다.
- Spark GraphX 개념 및 아키텍처
- PySpark GraphFrames 설치 및 환경 설정
- 그래프 데이터 생성 및 시각화
- PageRank 알고리즘을 활용한 중요 노드 분석
- 연결된 컴포넌트(Connected Components) 분석
1️⃣ Spark GraphX란?
📌 Spark GraphX란?
- 그래프 데이터를 병렬 분산 처리하는 Spark 라이브러리
- SNS 네트워크 분석, 추천 시스템, 웹 페이지 랭킹(PageRank) 계산 등에 활용
- RDD 기반의 GraphX와 DataFrame 기반의 GraphFrames 제공
📌 GraphX 주요 개념
개념 | 설명 |
Vertex (노드) | 그래프의 개체 (예: 사용자, 웹페이지) |
Edge (간선) | 노드 간의 관계 (예: 친구 관계, 링크) |
Graph | 노드와 간선으로 구성된 전체 그래프 |
PageRank | 노드의 중요도를 계산하는 알고리즘 |
Connected Components | 그래프 내 연결된 그룹 찾기 |
2️⃣ PySpark GraphFrames 환경 설정
📌 GraphFrames 설치 (pyspark와 함께 사용)
pip install graphframes
📌 SparkSession 생성 (GraphFrames 사용을 위한 설정)
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName("GraphXExample").getOrCreate()
print("Spark GraphFrames 환경 설정 완료!")
📌 GraphFrames 사용을 위해 추가 패키지 등록 필요
spark.conf.set("spark.sql.shuffle.partitions", "4")
3️⃣ 그래프 데이터 생성 및 시각화
📌 Vertex(노드)와 Edge(간선) 데이터 생성
from pyspark.sql import Row
from graphframes import GraphFrame
# 노드 생성
vertices = spark.createDataFrame([
("1", "Alice"),
("2", "Bob"),
("3", "Charlie"),
("4", "David"),
("5", "Eve")
], ["id", "name"])
# 간선 생성 (노드 간 관계)
edges = spark.createDataFrame([
("1", "2"),
("2", "3"),
("3", "4"),
("4", "5"),
("5", "1"),
("2", "5")
], ["src", "dst"])
# 그래프 생성
graph = GraphFrame(vertices, edges)
📌 그래프 데이터 출력
graph.vertices.show()
graph.edges.show()
📌 출력 예시
+---+-------+
| id| name |
+---+-------+
| 1| Alice |
| 2| Bob |
| 3|Charlie|
+---+-------+
+---+---+
|src|dst|
+---+---+
| 1| 2|
| 2| 3|
+---+---+
4️⃣ PageRank 알고리즘을 활용한 중요 노드 분석
📌 PageRank 실행
page_rank = graph.pageRank(resetProbability=0.15, maxIter=10)
page_rank.vertices.select("id", "pagerank").show()
📌 출력 예시
+---+------------------+
| id| pagerank|
+---+------------------+
| 1| 0.3275 |
| 2| 0.4752 |
| 3| 0.2231 |
+---+------------------+
- PageRank 값이 높을수록 중요도가 높은 노드
5️⃣ 연결된 컴포넌트(Connected Components) 분석
📌 Connected Components 실행
components = graph.connectedComponents()
components.select("id", "component").show()
📌 출력 예시
+---+---------+
| id|component|
+---+---------+
| 1| 0|
| 2| 0|
| 3| 0|
| 4| 0|
| 5| 0|
+---+---------+
- 같은 component 값을 가진 노드는 연결된 그룹
📌 실전 문제: Spark GraphFrames 연습하기
✅ 문제 1: GraphFrame을 생성하고 노드와 간선을 출력하기
📌 노드(Vertex)와 간선(Edge) 데이터를 생성하고 출력하세요.
from graphframes import GraphFrame
# 🔽 여기에 코드 작성
from graphframes import GraphFrame
vertices = spark.createDataFrame([
("1", "Alice"),
("2", "Bob"),
("3", "Charlie")
], ["id", "name"])
edges = spark.createDataFrame([
("1", "2"),
("2", "3"),
("3", "1")
], ["src", "dst"])
graph = GraphFrame(vertices, edges)
graph.vertices.show()
graph.edges.show()
✅ 문제 2: PageRank 실행 및 결과 출력
📌 그래프에서 PageRank를 실행하고 상위 3개 노드를 출력하세요.
# 🔽 여기에 코드 작성
page_rank = graph.pageRank(resetProbability=0.15, maxIter=10)
page_rank.vertices.orderBy("pagerank", ascending=False).show(3)
✅ 문제 3: 연결된 컴포넌트 찾기
📌 연결된 노드 그룹을 식별하세요.
# 🔽 여기에 코드 작성
components = graph.connectedComponents()
components.select("id", "component").show()
✅ 문제 4: 친구 추천 시스템 구현 (Triangle Count 활용)
📌 각 노드의 삼각 관계 개수를 계산하세요.
# 🔽 여기에 코드 작성
triangles = graph.triangleCount()
triangles.select("id", "count").show()
728x90