26년 4월 2주차 그래프 오마카세

GraphFrames, a major graph analysis library update

New GraphFrames release: Improved performance, new algorithms, and documentation | Sem Sinchenko posted on the topic | LinkedIn
On behalf of the GraphFrames maintainers, I am happy to announce the delivery of a new release. It is a significant improvement! It improves performance and memory management: The new release provides 3-50x faster performance for all algorithms. The x5 performance improvement in Connected Components is especially important, as it allows one to perform graph-based identity resolution much faster with the new GraphFrames. All Pregel-based algorithms, such as Shortest Paths and Label Propagation, received a boost of around 3x. The new release comes with its own internal fork of Apache #Spark GraphX due to its deprecation in upstream Spark. This allows us to improve the performance of GraphX-based Label Propagation by 50x and fix memory leaks. Now, it is usable for graph processing inside Structured Streaming. New algorithms were added: New algorithms for K-core centrality, cycle detection, and maximal independent set were added. All of them are based on advanced scientific papers and operate fully in a distributed manner. New APIs: A new API for computing vertex degrees based on edge types was added. The motifs finding API now supports undirected, bidirectional, and multi-hop patterns. The #PySpark API has all the recent improvements in the Scala Core, so there is feature parity between the core and Python. Documentation improvements: The documentation has been significantly expanded, especially the sections on the arguments and parameters of the algorithms. To simplify the onboarding process for new users, the documentation website now contains an llms.txt file in the root directory. Asking an LLM chatbot or coding assistant about how to use GraphFrames is now more efficient. It is already published in Maven Central and PyPi! Blog-post: https://lnkd.in/dU4kRmSD
GraphFrames 0.10.0 release
Scalable Graph Processing on top of Apache Spark

Keywords

  • Apache Spark
  • Distributed Graph Processing
  • Graph Embedding
  • PySpark
  • 그래프 분석을 대규모로 실행해야 할 때, 선택지는 생각보다 많지 않습니다. NetworkX는 단일 머신의 메모리 한계를 넘기 어렵고, Neo4j는 배치 처리보다는 OLTP 중심의 구조를 가집니다. 수백억 개의 노드와 엣지를 다뤄야 하는 환경이라면, 결국 Apache Spark 위에서 돌아가는 GraphFrames이 큰 주목을 받고 있습니다..
  • GraphFrames는 Spark DataFrame 위에서 그래프 알고리즘을 실행할 수 있도록 설계된 라이브러리입니다. 오랫동안 유지보수가 뜸했던 시기가 있었지만, 최근 빠르게 부활하며 0.10.0과 0.11.0 두 버전을 연달아 릴리즈했습니다. 두 릴리즈를 합쳐 살펴보면 꽤 묵직한 업데이트라고 생각이 됩니다.
  • 이번 오마카세에서는 이 두 버전에서 주목할 만한 변경 사항들을 정리한 릴리즈 노트 핵심을 가볍게 전달해드리고자 합니다. 대용량 그래프 데이터를 다루는 분들, 혹은 Spark 기반 파이프라인에 그래프 분석을 얹으려는 분들이라면 한 번쯤 살펴볼 만한 내용입니다.

GraphX 패치 중단

  • GraphX는 Apache Spark 4.0부터 공식적으로 Deprecated 처리되었고, 더 이상 패치를 받지 않습니다. GraphFrames 팀은 이에 대응해 GraphX의 내부 포크를 직접 관리하기로 결정했고, 그 첫 번째 결실이 바로 LabelPropagation 알고리즘의 전면 재작성입니다.
  • 기존 구현은 각 노드가 이웃 노드의 레이블을 'map<vertexID, Label>' 형태로 주고받는 방식이었는데, 이 과정의 시간복잡도가 최악의 경우 O(N²) 에 달했습니다. 새 구현에서는 이를 'Vector[Label]'로 대체하여 복잡도를 O(N) 으로 낮췄고, 메모리 사용량 역시 Scala 컬렉션 벤치마크 기준으로 Map 대비 약 5배 절감되었습니다.
  • 실측 결과는 더 인상적입니다. 200만 노드, 500만 엣지 규모의 Wiki-talk 그래프에서 기존 Spark 구현이 약 3,500초 걸리던 작업이 약 50초로 단축되었습니다. (약 70배의 속도 향상)

Connected Component 알고리즘 향상

  • Connected Components (연결 컴포넌트)는 GraphFrames에서 가장 많이 쓰이는 알고리즘 중 하나입니다. 특히 Identity Resolution(동일 사용자 식별)이나 데이터 중복 제거 문제에서 핵심적인 역할을 합니다.
    • 세션 > IP 또는 브라우저 같은 연결관계를 그래프로 표현한다면, 같은 사용자가 남긴 세션들은 하나의 연결 컴포넌트를 이룹니다. 여기서 동일 사용자 식별 문제란, 수천만개의 세션 로그에서 동일 사용자를 찾아내는 문제로 생각해보시면 좋습니다. 즉, 연결 컴포넌트를 찾는 것이 곧 사용자들을 하나로 묶는 것과 같은 문제입니다.
  • 0.10.0에서는 기존 Two Phase 알고리즘에서 발생하던 데이터 편중 문제를 해결하면서 Spark AQE(Adaptive Query Execution)와의 호환성을 확보했습니다. 'broadcastThreshold=-1'로 설정하면 수동 broadcasting을 완전히 비활성화하고 AQE가 skewness를 자동으로 처리하도록 위임할 수 있으며, 벤치마크 기준으로 기존 방식 대비 5~8배 빨라졌습니다.
  • 0.11.0에서는 알고리즘 선택지 자체가 늘었습니다. 이제 GraphX 기반, Two Phase, 그리고 새로 추가된 Randomized Contraction 중 하나를 선택할 수 있습니다. Randomized Contraction은 랜덤 선형 함수를 이용해 그래프를 반복적으로 축약하는 방식으로, 작은 그래프에서의 벤치마크 결과가 기대 이상이었다고 합니다.

그래프 임베딩 파이프라인 정식 탑재

  • 0.11.0에서 가장 눈에 띄는 업데이트 중 하나입니다. Random Walk 기반의 그래프 임베딩 파이프라인이 정식으로 추가되었습니다. 구체적으로는 RandomWalkWithRestart로 각 노드에서 랜덤 워크 시퀀스를 생성한 뒤, Word2Vec 또는 Hash2Vec으로 벡터화하는 흐름입니다.
  • 두 모델의 쓰임새는 명확하게 구분됩니다. Word2Vec은 임베딩 품질이 높지만 약 2,000만 노드 규모까지 적합하고, Hash2Vec은 명시적인 어휘 저장 없이 수십억 노드 규모까지 처리 가능한 경량 모델입니다.
  • 또한 aggregateNeighbors 옵션을 켜면 GraphSAGE 방식으로 이웃 임베딩을 평균 내어 해당 노드의 벡터와 이어 붙이는 연산이 추가됩니다. 생성된 임베딩은 노드 분류, 링크 예측, 커뮤니티 탐지, 이상 탐지 등 다양한 작업에 바로 활용할 수 있습니다.
    • 합성 벤치마크 기준으로 하위 태스크 성능이 20% 이상 개선되었다고 합니다.

Motif Finding 강화 & 신규 알고리즘 추가

  • 모티프 탐색(Motif Finding)은 그래프에서 특정 구조 패턴을 찾는 기능으로, GraphFrames의 차별화 포인트 중 하나입니다. 0.10.0부터 무방향 엣지, 양방향 엣지, 가변 길이 경로 등 더 복잡한 패턴을 표현할 수 있게 되었습니다.
  • 신규 알고리즘도 추가되었습니다. Cycle Detection, K-Core Decomposition, Maximal Independent Set(MIS)이 새롭게 도입되었습니다. Graphframes의 사이클 탐지는 금융 사기 탐지에서, K-Core는 네트워크 안정성 분석에서, MIS는 마케팅 인플루언서 선정 같은 비중복 노드 집합 추출 문제에 활용할 수 있습니다.

Property Graph API와 PySpark 지원 확대

  • 0.11.0에서는 PySpark용 PropertyGraphFrame API가 추가되었습니다. graphframes API를 사용하면 서로 다른 타입의 노드와 엣지를 하나의 그래프 구조 안에 통합해서 관리할 수 있습니다. 예를 들어 users 노드와 products 노드, 그리고 그 사이의 purchases 엣지를 하나의 PropertyGraphFrame으로 묶은 뒤, 표준 GraphFrame으로 변환해 알고리즘을 돌리는 식입니다.
  • 0.10.0에서는 Scala API와 PySpark Classic/Connect API 간의 기능 격차도 해소되어 PySpark 사용자도 최신 기능을 모두 쓸 수 있게 되었습니다.

  • LabelPropagation 70배 개선, 메모리 누수 해결, AQE 연동, 그래프 임베딩 파이프라인 탑재, Property Graph API까지, 이번 릴리즈 포인트는 단순한 기존 버그 픽스가 아니라 아키텍처 수준에서 재정비된 느낌을 주는 대규모 업데이트입니다.
  • 특히 Spark 4.0에서 GraphX가 Deprecated된 시점에 GraphFrames가 자체 포크를 들고 나온 것은 꽤 의미 있는 움직임입니다. 대규모 그래프 처리에서 Spark 생태계의 공백을 GraphFrames가 메우려는 의도가 보입니다.
  • 예고된 다음 릴리즈(0.12.0)에서는 GQL 쿼리 엔진과 가중치 기반 랜덤 워크, 시간 기반 랜덤 워크 등이 예고되어 있어 계속해서 지켜볼 만한 프로젝트입니다.
GitHub - graphframes/graphframes: GraphFrames is a package for Apache Spark which provides DataFrame-based Graphs
GraphFrames is a package for Apache Spark which provides DataFrame-based Graphs - graphframes/graphframes

[Contact Info]

Gmail: jhbae1184@akane.waseda.jp

Twitter (X): @jhbae1184

LinkedIn

Read more