본문 바로가기
SPARK

[SPRAK] 스파크를 최대한 안쓰기 위한 방법 (Sampling,분할처리,Dask,자동화)

by yeah-12 2024. 7. 18.

회피기1: Sampling

  • 전체 데이터가 많다면, 일부씩 하면 된다.
  • 앞의 실습에서 본 것처럼 개발할 때만 샘플링 하는 방법도 있고, 데이터가 넉넉하다면 일부 데이터의 분석으로 충분할 수도 있다

Random sampling

  • 가장 쉽고 단순한 방법이지만, 여러가지 문제가 있다
  • 표본이 우연히 편향될 수도 있고 매번 결과가 달라진다.

Stratified sampling

  • 특정 집단으로의 편향을 줄이기 위한 층화추출입니다
  • ML하시는 분이라면, 특히 분류Classification 문제를 풀어보신 분께는 익숙하실 겁니다
  • 하지만 여전히 매번 결과가 달라진다는 문제가 있습니다

Systematic sampling

  • 추천!! 1,3,5,7을 한 클래스로 만드는 것
  • ID와 같이, 패턴이 없거나 순서의 영향을 받지 않는 칼럼을 기준으로 합니다
    • ID는 가입 순서이기 때문에 초기 가입 유저와 최근 가입 유저의 성질이 다를 수 있지만,
    • systematic sampling에 영향을 미칠만한 차이는 보통 없다
    • 그럼에도 불구하고 패턴이 있는지 검사해보는 것이 좋다
  • 건너뛰는 단위는 소수를 사용하는 것이 특정 패턴을 피하기에 좋다
    • 예를 들어 짝수를 사용할 경우, 짝/홀에 대한 패턴이 잡힐 수 있다

회피기2: 분할 처리

  • 샘플링과 궁합이 좋은 방법론
  • 내 컴퓨터의 메모리에 전체 데이터의 10%가 올라가는 것이 한계라면, 10%씩 나누어 10번 작업하면 된다는 것입니다
  • 단, 데이터가 완벽하게 분할되는 경우에 한해 가능
    • 소셜 네트워크와 같이 얽히고 섥힌 그래프 데이터는 그러한 분할이 어렵다

데이터 분할 설계하기

  • 위의 시나리오를 그대로 이어나가도록 하겠습니다
  • 10만 명의 데이터를 분석하는데, 단일 기기에서 최대 처리 가능한 유저의 수가 약 1만명이라고 하면
    • 조금 더 여유를 줘서 13(소수로 선택)으로 데이터를 분할partition
    • 13개의 파티션은 user_id를 기준으로 정의
      • i번째 파티션은 user_id를 13으로 나눈 나머지가 i인 유저의 집단
      • ex) 14 % 13 = 1이므로, user_id가 14인 user는 1번 파티션에 할당

집계 데이터 저장하기

  • 각 파티션의 데이터를 불러와, 필요한 연산을 수행한 뒤 최종 결과만을 집계하여 저장
    • 이 때 전체 데이터보다 집계된 데이터가 훨씬 작다는 가정
    • 위의 경우, 전체 데이터는 각 유저와 상품에 대한 모든 이벤트
    • 반면, 집계 결과는 각 유저에 대해 이벤트와 프로모션, 오가닉 3가지에 대한 단일한 숫자값(기여 매출)이므로 그 양이 훨씬 작다.

회피기3: Dask

  • Dask 또한 분산 처리 도구이지만, Spark보다는 비교적 가볍게 사용할 수 있다
  • 단, 여러 대의 컴퓨터를 사용하는 난이도는 크게 차이나지 않다

Dask란?

  • Dask를 사용하면 NumPy, Pandas 및 sklearn과 같은 Python 라이브러리를 쉽게 확장할 수 있다.
  • Dask Dataframe을 Pandas와 유사하게 사용할 수 있으며, 비교적 학습 난이도도 또한 낮다
  • Spark와 유사한 구조

회피기 패시브: 자동화

  • 이왕 기술적인 걸 보는 김에 자동화 파트까지 보겠다
  • 스파크를 쓸 때도, 주기적인 데이터 처리를 위해 스케쥴링 하는 경우가 많다

Batch vs Streaming

  • 주기적인 대규모 데이터에 대한 처리를 Batch job
  • 반대로, 실시간으로 발생하는 데이터에 대한 처리를 Streaming job
  • 데이터 분석가는 일반적으로 전자를 수행하는 경우가 많고, 이를 위해 자동화 역량이 필요한 경우도 있다
  •