본 내용은 러닝스파크 책 참고
Accumulator
- Spark의 map()이나 조건 지정을 위해 filter()에 함수를 넘길 때, 보통 Driver Program에 정의된 변수를 사용
(Driver Program과 Worker Node) - 해당 내용은 kkn1220.tistory.com/131에서 참고
- 하지만, 클러스터에서 실행 중인 각각의 작업들은 변수의 복사본을 받아 작업하게 되므로, 업데이트된 내용이 다시 드라이버 프로그램으로 리턴 해주지는 않는다. 이에 Accumulator 변수는 이러한 제한을 풀어준다.
- Accumulator: Worker Node에서 Driver Program으로 보내는 값의 집합 연산에 대해 문법 제공. 가장 흔한 사용 방법 중 하나는, 작업 수행 중에 발생하는 일에 대한 개수를 디버깅 목적으로 헤아림
-> 각 Worker node에 복사본을 전달하고, 어플리케이션 종료 시점에 각 worker node로부터 수집하여 결과를 생성
- 빈 라인수 세기 예제
- 해당 예제에서 Transformation 계산이 끝난 후, 카운터의 값을 출력
- 올바른 값은 반드시 saveAsTextFile이 실행된 다음에 얻을 수 있음. 그 위의 map()은 lazy execution 방식을 따르기 때문에 수반되는 accumulator 값 증가는 반드시 map()이 실제로 실행 되는 시점인 saveAs~ 액션이 수행되어야만 강제하기 때문
요약하면, Accumulator는 다음과 같이 동작함
1) Driver Program에서 SparkContext.accumulator(IV) 메소드를 호출하여 초기 값을 가진 Accumulator 를 만든다.
2) 반환 타입은 Accumulator[T] 객체이며, T는 초기 값의 타입이다.
3) Spark Closure의 작업 노드 코드에서 Accumulator에 += 메소드를 써서 값을 더한다.
4) Driver Program에서 value 속성을 불러 Accumulator 값에 접근한다.
여기에서 Worker node의 task에서는 Accumulator의 Value()에 접근하지 못하는 것을 유념! 즉 이 task의 관점에서
Accumulator는 “쓰기 전용” 변수인 셈. 이는 Accumulator가 매 업데이트마다 통신할 필요가 없도록 효율적으로 구현되어 있기 때문
'기타 > 분산 컴퓨팅' 카테고리의 다른 글
Spark Cluster 운영 (0) | 2017.04.07 |
---|---|
Spark Data 불러오기/저장하기 (0) | 2017.04.07 |
SparkContext, Reduce/Group By Key (0) | 2017.04.07 |
Spark Pair RDD 개념 (0) | 2017.04.07 |
Spark RDD 개념 및 예제 (0) | 2017.04.07 |