Resilient Distributed Dataset
RDD
from pyspark import SparkContext
sc = SparkContext(conf=conf)
Spark Operation = transform + action
Spark는 액션(action)을 할때까지 변환(transform)하지 않는다.
transformations | actions |
---|---|
결과값으로 새로운 RDD 반환 | 결과값을 연산하여 출력하거나 저장 |
지연실행(Lazy-execution) | 즉시실행(Eagar-execution) |
map() filter() distinct() groupby() orderBy() | collect() count() reduce() foreach() |
Key와 Value 쌍을 가지는 Key-Value RDD
pairs rdd
pairs = rdd.map(lambda x: (x, 1))
파티션에 대한 이해가 중요함
- Spark Partitioning == 일반 프로그래밍에서 자료구조를 선택하는 것
- input partition, output partition, shuffle partition이 있는데 shuffle partition이 가장 중요함
Hash 방식 | Range 방식 |
---|---|
데이터를 여러 파티션에 균일 분배하는 것 | 키의 순서와 집합에 따라 정렬된 파티셔닝 |
partitionBy()
- transformation
: persist를 해주면 더 효과적으로 활용할 수 있음repartition()
coalesce()
: 셔플링을 동반하여 매우 비싼 작업 # 새로운 파티션을 만들 수 있는 함수
join()
sort()
partitionBy()
filter()
최적화를 위해 아래와 같은 규칙을 기억하면 좋음
병렬처리를 하기 어려운 경우 Spark를 쓰는 의미가 퇴색되므로 Operation 특징을 잘 알고 써야 그 기능을 극대화할 수 있음
# Narrow Transformation
filter()
map()
flatMap()
sample()
union()
# Narrow Transformation
join()
distinct()
orderBy()
대부분의 Action은
Reduction
임
근접하는 요소들을 모아서 하나의 결과로 만드는 일
- (예외)
collect()
# reduce()
rdd.reduce(<function>)
# fold()
rdd.fold(zeroValue, <function>)
# groupby()
rdd.groupBy(<function>)
# aggregate()
rdd.aggregate(zeroValue, seqOp, combOp)
실시간 빅데이터 처리를 위한 Spark & Flink (패스트캠퍼스 강의)
카카오 테크 Spark Shuffle Partition