← 학습 카테고리

Learn

Spark

38개 모듈 · 현재 15번째

Spark 모듈 15/38 spark-learn-15

결과 개수 제한, 파티셔닝(repartition/coalesce), 드라이버로 결과 수집

Spark: The Definitive Guide (Excerpts, Databricks Preview, 2017) — Chapters 2-6 — Bill Chambers & Matei Zaharia Chapter 5: Limit, Repartition and Coalesce, Collecting Rows to the Driver 절 (PDF pp.81-84)

이 모듈을 다 읽으면

  • repartition과 coalesce의 셔플 발생 여부 차이와 각각을 언제 써야 하는지 설명할 수 있다
  • collect/take/show가 드라이버에 미치는 영향과 각각의 용도를 구분해 설명할 수 있다

limit은 상위 N개 행만 남기며 orderBy와 자주 결합된다. repartition은 항상 전체 셔플을 일으켜 파티션 수·기준 컬럼을 재분배하는 반면, coalesce는 셔플 없이 기존 파티션을 합쳐 파티션 수를 줄인다. collect/take/show는 모두 결과를 Spark 드라이버로 가져오는 연산 계열이며 각각 전체 수집, 상위 N개, 보기 좋은 출력을 담당한다.

limit

limit 메서드는 DataFrame에서 상위 N개 행만 취한다. orderBy와 결합하면 "정렬 기준 상위 N개"라는 흔한 요구를 간단히 표현할 수 있다(예: `orderBy(desc("count")).limit(6)`으로 count가 가장 큰 6개 행을 가져오기).

핵심 포인트

  • limit은 DataFrame에서 지정한 개수만큼의 행만 남기며, orderBy와 결합해 상위 N개를 뽑는 패턴으로 자주 쓰인다

repartition과 coalesce

자주 필터링하는 컬럼을 기준으로 데이터를 파티셔닝해 두는 것은 물리적 데이터 배치(파티셔닝 스킴과 파티션 개수)를 제어하는 중요한 최적화 기회다.

repartition은 필요 여부와 무관하게 항상 전체 셔플(full shuffle)을 일으킨다. 따라서 일반적으로는 앞으로의 파티션 수가 현재보다 늘어나야 하거나, 특정 컬럼 기준으로 재파티셔닝해야 하는 경우에만 사용하는 것이 권장된다. `df.rdd.getNumPartitions()`로 현재 파티션 개수를 확인할 수 있고, `repartition(n)`으로 파티션 개수를, `repartition(컬럼)`으로 기준 컬럼을 지정할 수 있으며, `repartition(n, 컬럼)`처럼 둘 다 동시에 지정할 수도 있다.

반면 coalesce는 전체 셔플을 일으키지 않고 기존 파티션들을 그대로 합치기만 하므로, 파티션 수를 줄이는 경우에는 repartition보다 더 저렴한 선택지다. 예를 들어 `df.repartition(5, col("DEST_COUNTRY_NAME")).coalesce(2)`는 먼저 지정한 컬럼 기준으로 셔플해 5개 파티션으로 나눈 뒤, 셔플 없이 이를 2개로 합친다.

핵심 포인트

  • repartition은 필요 여부와 무관하게 항상 전체 셔플을 일으키므로, 파티션 수를 늘리거나 특정 컬럼 기준 재분배가 필요할 때만 쓰는 것이 권장된다
  • coalesce는 전체 셔플 없이 기존 파티션을 합치므로 파티션 수를 줄일 때 더 저렴한 선택지다
  • repartition(n, 컬럼).coalesce(m) 패턴으로 셔플 재분배 후 셔플 없는 병합을 조합할 수 있다

드라이버로 결과 수집하기

Spark의 드라이버는 클러스터 정보를 유지하고 사용자 코드를 실행하는 주체다. 데이터를 수집하는 메서드를 호출하면 그 결과는 이 드라이버로 모인다.

collect는 DataFrame 전체 데이터를 드라이버로 가져오고, take는 처음 N개 행만 선택하며, show는 지정한 개수의 행을 보기 좋게 화면에 출력한다(값이 잘리는지 여부도 옵션으로 지정할 수 있다, 예: `show(5, false)`로 잘림 없이 출력). 세 메서드 모두 궁극적으로 결과를 Spark 드라이버로 가져온다는 점에서 같은 계열의 연산이다.

핵심 포인트

  • collect/take/show는 모두 결과를 Spark 드라이버로 가져오는 연산 계열이며, collect는 전체, take는 상위 N개, show는 보기 좋게 포맷된 출력을 담당한다