- 스파크의 두 가지 오퍼레이션인 트랜스포메이션(Transformations)과 액션(Actions)을 코드를 통해 알아볼 것이다.
트랜스포메이션(Transformations)
- 결과값으로 새로운 RDD를 반환한다.
- 지연 실행(Lazy Execution)이 된다는 특징이 있다.
- 트랜스포메이션은 네로우(Narrow)와 와이드(Wide)로 나눌 수 있다.
네로우(Narrow) 트랜스포메이션
- 1대 1로 변환된다는 특정이 있다.
- 대표적으로
filter()
,map()
,flatMap()
,sample()
,union()
등이 있다. - 1열을 조작하기 위해 다른 열과 파티션의 데이터를 끌어다 쓸 필요가 없다.
- 정렬 같은 경우 새로운 RDD를 만들 때 다른 열을 참고해야 하는데 이는 많은 통신이 일어나며, 그렇기에 네로우 트랜스포메이션은 빠르다고 볼 수 있다.
와이드(Wide) 트랜스포메이션
- 셔플링을 한다는 특징이 있다.
- 대표적인 예로
intersection
andjoin
,distinct
,cartesial
,reduceByKey()
,groupByKey()
등의 함수가 있다. - 아웃풋 RDD의 파티션에 다른 파티션의 데이터가 들어갈 수 있다.
- 데이터가 나뉘어진 파티션을 왔다 갔다하면, 통신이 많이 필요하기 때문에 성능 상 많은 리소스를 요구한다. 이를 최소화하거나 최적화하여야 성능을 끌어내기 좋다.
함수
map()
flatMap()
filter()
distinct()
reduceByKey()
groupByKey()
mapValues()
flatMapValues()
sortByKey()
코드
- 프로그램이 트랜스포메이션을 만날 때 새로운 알디디를 만들지 않고 액션을 만나야 연산을 시작하면서 만들어진다.
- 트랜스포메이션을 만나게 되면 신텍스를 체크 한 다음에 기억을 하고 넘어간다.
- 트랜스포메이션을 여러번 거치면 순서대로 변환 과정을 기억해놓으며 하나의 DAGs를 만들게 된다.
1 |
|
액션(Actions)
- 결과값을 연산하여 리스트나 파이썬 오브젝트를 출력하거나 저장한다.
- 즉시 실행(Eager Execution)이 된다는 특징이 있다.
함수
collect()
count()
countByValue()
take()
top()
reduce()
fold()
foreach()
코드
1 |
|
Key-Value RDD의 트랜스포메이션과 액션
- 대표적인 트랜스포메이션으로,
- groupByKey
- reduceByKey
- mapValues
- keys
- join(leftOuterJoin, rightOuterJoin) 등이 있다.
- 액션에는 countByKey가 있다.
- 대부분의 오퍼레이션이 트랜스포메이션인 경우가 많은데, 키 벨류 RDD 처리 과정의 결과값이 파티션이 유지가 안되더라도 값이 굉장히 큰 경우가 많기 때문이다.
groupByKey
- 주어지는 키를 기준으로 그룹핑한다.
RDD.groupByKey(numPartitions=None, partitionFunc=<function portable_hash>)
1 |
|
- len을 넣는다면 갯수, list를 넣는다면 리스트를 반환해준다.
groupBy 예제
1 |
|
groupByKey 예제
1 |
|
reduceByKey
- Key를 기준으로 그룹을 만들고 합친다.
- RDD.reduceByKey(func, numPartitions=None, partitionFunc=
)
1 |
|
- 개념적으로는 groupByKey에 리덕션을 한 것과 같지만, groupByKey보다 훨씬 빠르다는 장점이 있다.
1 |
|
mapValues
- 사용자가 정의한 함수를 값에 적용할 때 사용된다.
- 파티션과 키가 그대로 있다는 장점이 있다.
- 파티션과 키가 왔다 갔다 할 때 네트워크 코스트가 크기 때문에 성능을 향상시킬 수 있다.
1 |
|
countByKey
- 각 키가 가진 요소들을 센다.
1 |
|
keys
- 하나의 트랜스포메이션이며 모든 키를 가진 RDD를 생성한다.
1 |
|
1 |
|
Joins
- 트랜스포메이션으로 작동하며 여러개의 RDD를 합치는데 사용된다.
- 대표적으로 두가지의 Join 방식이 존재한다.
- Inner Join(join)
- Outer Join(left outer, right outer)
Inner Join
- 서로 연관된 데이터만 가져온다.
Outer Join
- 한쪽에는 데이터가 있고 다른쪽에 없는 경우, 데이터가 있는 쪽의 데이터를 출력한다.
leftOuterJoin
: 왼쪽에 있는 데이터를 모두 출력, 반대편에 데이터가 없는 경우 NonerightOuterJoin
: 오른쪽에 있는 데이터를 모두 출력, 반대편에 데이터가 없는 경우 None
1 |
|