Spark/BASIC

Spark 기초1

개구리는 개꿀개꿀 2020. 12. 8. 18:09

 

기본과정

- 특정 함수 없이 스파크를 이용하면 어떤 일을 할 수 있는지?

- Hadoop, Spart, Data Engineering

 

실습과정

- 제공 함수 RDD, DataFrame 함수 활용

 

심화과정

- 함수 호출 시 스파크 내부 동작 구조

 

---

스파크

- 대용량 데이터 분산 처리 SW

- 별도의 App 없이 대용량 쿼리 수행

- App 구현을 위한 API 제공

 

spark.apache.org/

 

Apache Spark™ - Unified Analytics Engine for Big Data

Ease of Use Write applications quickly in Java, Scala, Python, R, and SQL. Spark offers over 80 high-level operators that make it easy to build parallel apps. And you can use it interactively from the Scala, Python, R, and SQL shells.

spark.apache.org

Spark Components

장점

  • Speed(과장)
  • Ease of Use(최고)
  • Generality
  • Runs Everywhere

예제

  • SELECT col_A, col_B, col_C FROM my_table WHERE col_A ...
  • col_D를 보고싶다면? 하둡은 Build/Deploy 후 모든 분산 저장소를 다시 전부 조회 해야됨
  • MapReduce를 이용해서 orderBy, distinct, join, pivot, takeSample, countApproxyDistinct 를 구현함
  • 대용량 데이터 중복 제거 - 정렬을 해서 메모리 부하가 가지 않게 잘 처리 해야됨
  • SQL방식(Hive), 프로그래밍 방식 두가지 방법을 제공

 

공식 정의

  • Apache Spark™ is a unified analytics engine for large-scale data processing.
  • 데이트 크기와 상관 없이, 어떤 요구사항도 다 처리할 수 있는 (통합) 데이터 분석 엔진
  • 아주 잘 만든 분산처리 스칼라(자바) 어플리케이션 프레임워크
  • 단순 데이터 처리에 사용하기에는 아까울 정도로 잘 만들어졌다.

 

데이터 처리 업무 -> 스파크
다양한 도메인, 다양한 도구

빅데이터 분야의 모호한 부분.. 너무 범위가 추상적이다.

  • 데이터 처리?
  • 데이터를 읽어와서 원하는 작업을 수행하고
  • 그 결과를 저장하거나 외부 프로세스에 전달
  • MYSQL(Connection -> Query Execute -> Extract Result Data)와 원리는 동일
  • Why Spark?
    • 특정 광고가 하루 몇번 노출됐는지 알아보기
    • 특정 광고를 본 사용자가 몇명인지 알아보기
    • 최근 한달간 당일 첫 방문 시 A업종의 광고에 노출된 횟수가 5회 이상인 사용자중에 최근 1주일 사이 B업종 광고에 3회 이상 연속 노출되면서 최초 클릭을 수행한 사용자 수-> 사용자 * 시간(ms) * 광고 수 : 매우 큰 데이터
    • 조금 더 특화된 기능

다양한 라이브러리 지원 및 통합 런타임 환경, 비즈니스 로직 구현 집중(RDD, DF)

 

 

아키텍처와 주요 컴포넌트

spark.apache.org/docs/latest/cluster-overview.html

 

Cluster Mode Overview - Spark 3.0.1 Documentation

Cluster Mode Overview This document gives a short overview of how Spark runs on clusters, to make it easier to understand the components involved. Read through the application submission guide to learn about launching applications on a cluster. Components

spark.apache.org

 

간단한 예제(단어 수 세기 : word counting)

  1. 파일 경로 입력으로 전달
  2. 결과를 저장할 컬렉션 준비(키:단어, 값:count)
  3. 파일을 한 줄씩 읽으면서
  4. 각 줄을 공백 문자를 기준으로 단어로 분리한다.
  5. 분리된 모든 단어에 대해
  6. 아직 등록되지 않은 단어면 count 1로 등록하고, 이미 등록된 단어면 1을 증가시킨다.

왜 자꾸 단어를 세라는건지?

  • 가장 간단하고 -> 전형적인 입력 데이터 포맷(정제되지 않은, 날것(컨텐츠, 저장형식, 저장위치, 크기 다양한) 그대로의 파일)
  • 가장 기본적, 자주 활용되는 문법 
  • 런타임 환경의 정상 여부를 확인

단어 수 예제 다시 보기

  • 읽고
  • 처리하고(파싱 -> 단어수 세기)
  • 결과를 전달(출력)
  • 데이터 처리 == (Read -> Process -> R -> PRPRP..)

단어 수 세기 고도화(스파크는 어떻게 했을까?)

  • 간단한 예제이지만, 파일의 크기가 매우 커지면 동작하지 못하는 단점이 있다.
  • 파일을 나눠서 여러 서버에서 나눠서 처리하면 됨(불변의 진리)

MAP & REDUCE

스파크가 없으면 어떻게 할까?

  • 서버 준비
  • 실행 환경 구성(OS, Java, 환경변수 등)
  • 파일 분할(전용 유틸리티 사용)
  • 분할한 파일을 여러 서버에 복사
  • 프로그램 빌드
  • 빌드 프로그램 여러 서버에 복사
  • 여러 서버에서 프로그램 실행
  • 각 서버별로 실행 결과를 기록
  • 모두 더해서 최종 결과 계산
  • 단어 수 세는 용도로만 활용 가능

이 일을 범용 프로그램으로 발전 시켜보자

  • 변하지 않는 것 -> 재사용 가능한 공통 모듈
    • 파일분할 유틸리티
    • 파일을 서버에 복사스크립트
      • 잘못된 가정.. 파일이 한 서버에 못들어 갈 정도로 크다면?
      • 유틸리티로 스플릿 불가능, 파일 복사시 서버 다운될 수도 있음..
      • 분산 파일 시스템이 결국 필요해짐.. Not Easy
      • 대용량 파일 저장은 스파크의 영역이 아니다..
      • HDFS API(업계 De Facto)
      • pros : 호환성, 안정성, 편의성
      • cons : 하둡 라이브러리 의존성(Not CM)
      • 하둡이 필수는 아니지만 클래스 패스에만 하둡 라이브러리가 잡혀있음(for build)
      • CDH : 하둡 계열의 빅데이터 솔루션 중에 자주 사용하는 것들을 모아둔 번들 툴
  • 변하는 것 -> 구현을 통해 확장 가능하도록 추상화
    • 프로그램 빌드/복사/실행
    • 프로그램
      • 비즈니스 로직은 도메인에 따라 바뀐다
      • Input -> 불변
      • map/transform -> 변화
        • map(파일) -> return 단어수 맵
        • map(이미지) -> return JSON_Object
        • map(각 서버에서 취합한 파일들) -> return 단어수 맵
        • 추상화 레벨이 너무 높다(각 서버별로 실행하는 맵, 모든 서버의 결과를 통합하는 맵) -> 그룹화 + 구분
        • 함수 분리
          • map
          • reduce
          • anotherFunction
        • 타입(인터페이스, 클래스) 분리
          • class Mapper
          • class Reducer
          • class AwesomeCalculator
        • Case of Spart -> 둘다 분리
          • class Mapper { map() }
          • RDD(abstract class)
            • HadoopRDD, CheckPointRDD, JdbcRDD, UnionRDD, ShuffleRDD, PartioningPruningRDD....etc
      • Output -> 불변

사람이 했던 역할 - 클러스터매니저(CM)

  • 여러 서버들을 제어
  • 여러 서버에서 구동중인 프로그램 제어
  • 결과 취합 후 최종 프로그램 실행
  • HDFS -> 분산 처리를 제어하는 부분을 포기?
    • 자체 클러스터 제공 하지만
    • 기존 클러스터 활용할수 있게 배려 해줌(하둡 범용)
  • 자체 런타임 실행 모델 구축
    • Driver(App 실행에 필요한 백그라운드 프로세스, 정보 관리) <-> Executor(Yarn, Mesos, K8s)(Task를 할당받아 실행하는 역할 수행)
    • Driver : 마스터 역할을 하는 수많은 백그라운드 프로스세의 집합
    • 클러스터별 익스큐터 실행코드 -> spark-submit(spart shell) -> cluster manager 지정
    • 단일 프로그래밍 모델, CM Free
    • Unit Test, IDE Debugging

 

 

RDD(Resilient Distributed Dataset)

  • 분산 데이터 모델
  • Hadoop의 MapReduce API와 비슷한 역할
  • Map/Reduce -> How/Workflow
  • Dataset -> What/Data
  • 데이터 처리 프로그램 작성을 위한 스파크의 (General) 프로그래밍 모델
  • 이제 안쓰지 않나요?

최종 개념적 구조

 

SparkContext 생성 == Initialize Env

Spark가 사용하기 편한 이유

App 실행

  • rdd.show
    • DAG Scheduler (Workflow 로 변환)
    • POOL(Task)
    • Scheduler - CM
    • Executor