2016-12-27 7 views
6

Spark Graphframes를 사용하여 largish (?) 그래프 (6 천만 개의 정점과 95 억 개의 에지)로 작업하고 있습니다. 기본 데이터는 크지 않습니다. 정점은 디스크에서 약 500MB를 취하고 가장자리는 약 40GB입니다. 내 컨테이너가 자주 메모리 문제로 인해 자바 힙 때문에 종료되지만 근본적인 문제는 그래프 프레임이 계속 데이터를 뒤섞어 놓는다는 것입니다 (최대 150GB의 읽기/쓰기가 있음을 알 수 있습니다). 그래픽 프레임이나 기본 에지/정점을 효율적으로 분할하여 셔플을 줄이는 방법이 있습니까?Spark Graphframes로 파티셔닝

답변

6

TLGraphframe을 효율적으로 파티션 할 수 없습니다.

Graphframe 알고리즘은 두 가지로 나눌 수있다

  • 방법있는 델리게이트 처리 GraphX 대응한다. GraphX는 여러 가지 분할 방법을 지원하지만 이들은 Graphframe API를 통해 공개되지 않습니다. 이 중 하나를 사용하는 경우 GraphX을 직접 사용하는 것이 좋습니다.

    불행하게도 GraphX의 개발은 지난 2 년간 소수의 작은 수정으로 거의 완전히 중단되었으며 전체 성능은 인 코어 라이브러리와 out-of-core libraries에 비해 실망 스럽습니다.

  • Spark Datasets을 사용하여 기본적으로 구현되는 방법으로 제한된 프로그래밍 모델과 단일 분할 모드 만 고려하면 복잡한 그래프 처리에는 적합하지 않습니다.

    효율적인 그래프 처리를 위해 관계형 기둥 저장소를 사용할 수 있지만 순진한 반복 join 접근 방식은 Graphframes으로 적용됩니다 (단 하나 또는 두 개의 홉을 사용하는 얕은 탐색에는 적합 함).

    당신은 각각 idsrc에 의해 verticesedgesDataFrames를 다시 파티션 시도 할 수 있습니다 :

    val nPart: Int = ??? 
    
    GraphFrame(v.repartition(nPart, v("id")), e.repartition(e(nPart, "src"))) 
    

    경우에 어떻게 도움이 될 것이다.

전반적으로 현재의 (12 월, 2016) 상태에서 Spark는 집중적 인 그래프 분석에 적합하지 않습니다.

+1

통찰력을 고맙게 여기십시오. GraphX ​​[파티션 스키마] (http://note.yuhc.me/2015/03/graphx-partition-strategy/)를 사용하여 가장자리 데이터 프레임에 사용자 지정 열을 만들고 파티셔닝하여 성능을 향상시킬 수 있음을 발견했습니다. – John

+0

@ 존 나는 그것을 이해할 수 없었습니다. 사용자 정의 컬럼에서 파티셔닝하는 방법에 대한 예제가 있습니까? –

+0

@ 존이 성능 문제를 해결 한 방법에 대한 업데이트를 공유 할 수 있습니까? –