주로 변형을 적용시키는 작업들
이번강의에서는 Action이 분산된 환경에서 작동하는 원리
대부분의 Spark의 Action은 Reduction
요소들을 모아서 하나로 합치는 작업
많은 Spark의 연산들이 reduction
병렬/분산된 환경에서의 Reduction 작업
복습
- Transformations & Actions
- 지연 실행으로 인한 성능 최적화
- Cache() & persist()
- Cluster Topology
대부분의 Action은 Reduction
Reduction:
근접하는 요소들을 모아서 하나의 결과로 만드는 일
Parallel Reduction
사용자가 지정하는 function을 받아서 여러개의 값을 줄여주는 역할을 함
>>> sc.parallelize([1,2,3,4]).reduce(lambda x,y: (x*2)+y)
26
>>> sc.parallelize([1,2,3,4], 1).reduce(lambda x,y: (x*2)+y)
26
>>> sc.parallelize([1,2,3,4], 2).reduce(lambda x,y: (x*2)+y)
18
>>> sc.parallelize([1,2,3,4], 3).reduce(lambda x,y: (x*2)+y)
18
>>> sc.parallelize([1,2,3,4], 4).reduce(lambda x,y: (x*2)+y)
26
* (1,2,3,4) -> ((1*2+2)*2+3)*2+4=26
* (1,2) (3,4) -> ((1*2+2)*2 + (3*2)+4)=18
파티션이 어떻게 나뉠지 프로그래머가 정확하게 알기 어렵다
>>> from operatior import add
>>> sc.parallelize([1,2,3,4,5]).fold(0,add)
15
rdd = sc.paraelleize([2,3,4], 4)
rdd.reduce(lambda x, y: x*y)
# 24
rdd.fold(lambda x, y: x*y)
# 24
rdd.reduce(lambda x, y: x+y)
# 9
rdd.fold(1, lambda x, y: x*y)
# 14
>>> rdd = sc.parallelize([1,1,2,3,5,8])
>>> result = rdd.groupBy(lambda x: x%2).collect()
>>> sorted([(x, sorted(y)) for (x, y) in result])
[(0, [2,8]), (1, [1,1,3,5]))]
>>> seqOp = (lambda x, y: (x[0] + y, x[1] + 1))
>>> combOp = (lambda x, y: (x[0] + y[0], x[1] + y[1]))
>>> sc.parallelize([1,2,3,4]).aggregate((0,0), seqOp, combOp)
(10,4)
>>> sc.parallelize([]).aggregate((0,0), seqOp, combOp)
(0,0)
x[0]=0, x[1]=0 (zeroValue)
x[0]+y = (0+1), x[1]+1=(0+1)->(1,1)
x[0]+y = (1+2), x[1]+1=(1+1)->(3,2)
x[0]=0, x[1]=0 (zeroValue)
x[0]+y = (0+3), x[1]+1=(0+1)->(3,1)
x[0]+y = (3+4), x[1]+1=(1+1)->(7,2)