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

(Spark에서는 foldLeft, foldRight 대신에 aggregate를 사용한다.)