더북(TheBook)

4.4.1 RDD 의존 관계와 스파크 동작 메커니즘

 

2.3절에서 언급했듯이 스파크의 실행 모델은 방향성 비순환 그래프(Directed Acyclic Graph, DAG)에 기반한다. 이미 잘 알겠지만, 그래프는 정점(노드)과 두 정점을 잇는 간선으로 구성된다. 방향성 그래프는 간선이 한 정점에서 다른 정점을 가리키는 방향성이 있는 그래프를 의미한다(물론 양방향성(bidirectional) 간선도 가능하다). 그중 방향성 비순환 그래프는 간선의 방향을 따라 이동했을 때 같은 정점에 두 번 이상 방문할 수 없도록 연결된 그래프를 의미한다(이름 그대로 순환(cycle)하지 않는 그래프다).

스파크의 DAG는 RDD를 정점으로 RDD 의존 관계를 간선으로 정의한 그래프를 의미한다. RDD의 변환 연산자를 호출할 때마다 새로운 정점(RDD)과 새로운 간선(의존 관계)이 생성된다. 변환 연산자로 생성된 새 RDD가 이전 RDD에 의존하므로 간선 방향은 자식 RDD(새 RDD)에서 부모 RDD(이전 RDD)로 향한다. 이러한 RDD 의존 관계 그래프를 RDD 계보(lineage)라고 한다.

RDD 의존 관계는 크게 두 가지 기본 유형으로 나눌 수 있는데, 좁은(narrow) 의존 관계와 넓은(wide)(또는 셔플(shuffle)) 의존 관계가 그것이다. 의존 관계의 유형에 따라 셔플링 실행 여부가 결정되며, 의존 관계의 유형은 4.2.2절에서 설명한 셔플링 발생 규칙을 따른다. 다시 말해 데이터를 다른 파티션으로 전송할 필요가 없는 변환 연산은 좁은 의존 관계를 형성한다. 넓은 의존 관계는 그 반대로, 즉 셔플링을 수행할 때 형성된다. 참고로 RDD를 조인하면 셔플링이 항상 발생한다.

좁은 의존 관계는 다시 1-대-1(one-to-one) 의존 관계와 범위형(range) 의존 관계로 나눌 수 있다. 범위형 의존 관계는 여러 부모 RDD에 대한 의존 관계를 하나로 결합한 경우로 union 변환 연산자만 해당한다. 1-대-1 의존 관계는 셔플링이 필요하지 않은 모든 변환 연산자에 사용한다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.