IT/Spark
Spark - Reduction In Parallel
물통꿀꿀이
2020. 2. 1. 20:02
먼저 Reduction은 값을 더 작은 값으로 변형한다는 의미이다.
보다 쉬운 이해를 위해 아래에 Scala에서 reduction 관련 예시를 추가하였다. 그렇지만 언어를 떠나서 reduction은 입력받은 값을 최종적으로 단일 값으로 변경한다는 것이다.
val collection = List(1, 3, 2, 5, 4, 7, 6)
val res = collection.reduce((x, y) => x max y)
val collection = List(1, 3, 2, 5, 4, 7, 6)
val res = collection.fold(11)((x, y) => x max y)
그런데 모든 Scala의 reduction 메소드가 Spark에서 동작하는 것은 아니다. 그 이유는 바로 Parallelizable 때문이다.
Scala의 fold 계열 메소드 중 foldLeft를 바탕으로 생각해보자.
val collection = List(1, 2, 3, 4)
val res = collection.foldLeft(1)((x, y) => x + y)
해당 예시의 결과는 11로, foldLeft의 초기값으로 부터 순차적으로 값을 계산해나간다.
(1, 1) => 2
(2, 2) => 4
(4, 3) => 7
(7, 4) => 11
즉, 앞의 결과에 종속적이다. 일반적으로 Parallelizable 할 수 있도록 하기 위해서는 각각의 계산이 독립적으로 수행되어야 한다. 때문에 Spark에서는 이전 값에 종속이 발생하지 않는 fold 메소드를 사용한다.
def fold(zeroValue: T)(op: (T, T) ⇒ T): T |
이 밖에 여러 메소드는 아래 표를 확인하면 된다.
Scala |
Spark |
|
fold | O |
O |
foldLeft, foldRight | O |
X |
reduce | O |
O |
aggregate | O | O |
(Spark에서는 foldLeft, foldRight 대신에 aggregate를 사용한다.)