← 학습 카테고리

Learn

Spark

38개 모듈 · 현재 28번째

Spark 모듈 28/38 spark-learn-28

로컬 Spark 세션과 파티션의 실체 — 코어 개수가 아니라 파티션 개수가 병렬성을 정한다

PySpark Tutorial: Build a Real Pipeline and Read the Spark UI — Darshil Parmar PySpark Tutorial: Build a Real Pipeline and Read the Spark UI — Setup, SparkSession, Partitions (문서 상단부)

이 모듈을 다 읽으면

  • SparkSession.builder.master('local[*]')로 실행한 세션에서 spark.sparkContext.uiWebUrl이 왜 필요한지 설명할 수 있다
  • 작은 CSV 파일 하나가 왜 파티션 1개, 태스크 1개로만 처리되어 코어를 낭비하는지 설명할 수 있다
  • 실습에서 사용한 messy CSV의 네 가지 결함 유형을 나열할 수 있다

로컬 모드(local[*])로 SparkSession을 만들면 드라이버와 익스큐터가 한 프로세스 안에서 동작하며 사용 가능한 모든 코어를 쓰지만, 실제 병렬성은 코어 개수가 아니라 데이터가 몇 개의 파티션으로 나뉘어 있는지에 좌우된다. 165KB짜리 CSV 하나는 파티션 1개로 읽혀 코어 8개 중 7개가 놀게 되는데, 이는 튜토리얼이라 무해하지만 실제 잡이 예상보다 느릴 때 가장 먼저 점검해야 할 지점이다. 이 실습은 order_id/customer_id/order_ts/amount/status 다섯 컬럼의 주문 데이터에 결측 customer_id, 천 단위 구분 쉼표가 섞인 금액, 대소문자가 뒤섞인 status 값 같은 실제 소스 시스템에서 흔히 나타나는 결함을 의도적으로 심어 두고 파이프라인 전 구간에서 Spark UI로 확인하며 진행한다.

SparkSession 생성과 Spark UI 접속

SparkSession.builder.appName(...).master("local[*]").getOrCreate()로 세션을 만들면 spark.version과 spark.sparkContext.uiWebUrl을 확인할 수 있다. master("local[*]")는 드라이버와 익스큐터를 모두 이 하나의 프로세스 안에서 실행하고 머신이 가진 모든 코어를 사용하겠다는 뜻이다. uiWebUrl은 머신의 LAN 주소로 나오지만 http://localhost:4040으로 접속해도 동일한 Spark UI에 닿는다 — 파이프라인을 짜는 내내 이 탭을 열어두고 각 단계 후 실제로 무슨 일이 일어났는지 확인하는 것이 이 실습의 핵심 습관이다.

핵심 포인트

  • master("local[*]")는 드라이버·익스큐터를 한 프로세스에 두고 가용한 모든 코어를 사용한다
  • spark.sparkContext.uiWebUrl로 Spark UI 주소를 확인할 수 있고 http://localhost:4040으로도 동일하게 접속된다
  • 코드를 실행할 때마다 Spark UI를 열어 실제 동작을 확인하는 습관이 문제 진단의 출발점이다

파티션이 병렬성을 결정한다 — 코어 개수가 아니라

165KB 크기의 CSV 하나를 읽으면 Spark는 이를 파티션 1개로 취급하고, 그 결과 태스크도 1개만 생성된다. 머신에 코어가 8개 있어도 파티션이 1개면 나머지 7개 코어는 그대로 놀게 된다. 이는 작은 파일을 다루는 튜토리얼에서는 문제가 되지 않지만, 실제 운영 잡이 기대보다 느릴 때 가장 먼저 점검해야 할 지점이라는 걸 보여준다 — 코어를 더 준다고 느린 잡이 빨라지는 것이 아니라, 데이터가 충분히 많은 파티션으로 나뉘어 있어야 그 코어들을 실제로 활용할 수 있다.

핵심 포인트

  • 작은 CSV 하나는 파티션 1개로 읽혀 태스크도 1개만 생성되고, 나머지 코어는 유휴 상태가 된다
  • 병렬성은 파티션 개수에 좌우되며 코어 개수만 늘리는 것은 해결책이 아니다
  • 잡이 예상보다 느리면 파티션 수부터 확인하는 것이 튜닝의 출발점이다

실습 데이터에 심어둔 네 가지 결함

실습에 쓰인 raw_orders.csv(3,384행)에는 실제 소스 시스템에서 흔히 나타나는 네 가지 손상 유형이 섞여 있다: (1) customer_id가 비어 있는 행, (2) amount 컬럼에 "1,104.25"처럼 천 단위 구분 쉼표가 포함된 값, (3) status 값이 "Delivered"처럼 대문자로 시작하는 등 대소문자가 뒤섞인 값, 그리고 뒤에서 다룰 (4) 같은 주문이 두 번 들어오는 중복이다. customers.csv(400행, 고객 차원 테이블)는 상대적으로 깨끗하다. 이런 결함은 인위적으로 만든 것이 아니라 실제 운영 시스템에서 매일 발생하는 유형이라는 점이 이 실습의 포인트다.

핵심 포인트

  • 결측 customer_id, 쉼표 포함 금액, 대소문자 혼재 status, 중복 주문 네 가지 결함이 실습 데이터에 의도적으로 섞여 있다
  • 이는 실제 소스 시스템에서 매일 나타나는 손상 유형을 재현한 것이다