더북(TheBook)

4.5.2 공유 변수로 실행자에 데이터 전송

 

3장에서도 설명했듯이 공유 변수는 누적 변수와 마찬가지로 여러 클러스터 노드가 공동으로 사용할 수 있는 변수다. 하지만 공유 변수는 누적 변수와 달리 실행자가 수정할 수 없다. 오직 드라이버만이 공유 변수를 생성하며, 실행자에서는 읽기 연산만 가능하다.

실행자 대다수가 대용량 데이터를 공통으로 사용할 때는 이 데이터를 공유 변수로 만드는 것이 좋다. 보통은 드라이버에서 생성한 변수를 태스크에서 사용하면 스파크는 이 변수를 직렬화하고 태스크와 함께 실행자로 전송한다. 하지만 드라이버 프로그램은 동일한 변수를 여러 잡에 걸쳐 재사용할 수 있고 잡 하나를 수행할 때도 여러 태스크가 동일한 실행자에 할당될 수 있으므로, (어쩌면 대용량일지도 모를) 변수를 필요 이상으로 여러 번 직렬화해 네트워크로 전송하는 상황이 발생할 수 있다. 이때는 데이터를 더욱 최적화된 방식으로 단 한 번만 전송하는 공유 변수를 사용하는 편이 좋다.

공유 변수는 Broadcast 타입의 객체를 반환하는 SparkContext.broadcast(value) 메서드로 생성한다. value 인수에는 직렬화 가능한 모든 종류의 객체를 전달할 수 있다. 실행자는 Broadcast.value 메서드로 생성된 공유 변수를 참조한다. 실행자는 공유 변수 값을 읽어 들이기 전에 먼저 공유 변수를 실행자에 로드했는지 확인한다. 아직 공유 변수를 로드하지 않았다면 실행자는 드라이버에 공유 변수의 데이터를 청크(chunk) 단위로 나누어 전송해 줄 것을 요청한다. 스파크는 이러한 풀링 기반(pull-based) 방식을 이용해 잡 시작 과정에서 발생할 수 있는 네트워크 정체 현상을 방지한다.

공유 변수 값을 참조할 때는 항상 value 메서드를 사용해야 한다. 그렇지 않고 공유 변수에 직접 접근하면 스파크는 이 변수를 자동으로 직렬화해 태스크와 함께 전송한다. 이렇게 하면 공유 변수를 사용하는 이유, 즉 성능상 이득을 완전히 잃어버리게 된다.

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