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