Spark 2. 빅데이터와 스파크

skh951225·2023년 8월 14일
0

Spark

목록 보기
2/4

1. 아파치 스파크란

Apache Spark의 철학

  • Spark는 데이터 저장 위치에 상관없이 처리에 집중하도록 만들어졌다.
  • 애플리케이션은 데이터가 저장된 위치를 신경 쓰지 않아도 된다.
  • Hadoop과 같은 빅데이터 플랫폼과 다르게 spark는 연산 기능에 초점을 맞췄다.

Spark의 등장 배경

  • 2005년경에 하드웨어의 성능향상은 멈췄다. 하지만 데이터를 저장하는데 드는 비용은 빠른속도로 감소하였다.
  • 데이터 수집에 필요한 기술 비용은 계속해서 저렴해지고 정밀도는 개선되었다.
  • 대용량 데이터를 처리하는 소프트웨어가 필요해졌다.

Spark의 역사

  • UC버클리 대학교에서 2009년 스파크 연구 프로젝트가 시작되었다.
  • 맵리듀스의 난이도와 효율성의 문제점을 개선하였다.
    • 맵리듀스는 매번 disk에서 읽어와야하고 저수준의 API였음
  • 애플리케이션을 간결하게 개발할 수 있는 함수형 프로그래밍 기반의 API를 설계

2. 스파크 간단히 살펴보기

스파크의 기본 아키텍쳐

  • 스파크는 기본적으로 클러스터의 데이터 처리 작업을 관리하고 조율함
  • cluster manager: 사용자가 submit한 작업을 토대로 애플리케이션 실행에 필요하는 자원을 할당하는 역할, 사용가능 자원을 파악
    • 하둡 YARN, 스파크 stand alone, MESOS
  • driver process: 클러스터 노드 중 하나에서 실행되며 main() 함수를 실행하며 드라이버 프로그램 멍령을 익스큐터에 실행할 책임을 가짐
    • 스파크 언어 API를 통해 다양한 언어로 실행할 수 있음.
    1. 스파크 애플리케이션 정보의 유지 관리
    2. 사용자 프로그램이나 입력에 대한 응답
    3. 전반적인 익스큐터 프로세스의 작업과 관련된 분서그 배포 그리고 스케줄링
  • executor process: 드라이버 프로세스가 할당한 작업을 수행
    1. 드라이버가 할당한 스파크 코드를 실행
    2. 진행 상황을 다시 드라이버 노드에 보고

스파크의 다양한 언어 API

  • 스파크 코드를 실행하기 위해서는 드라이버 프로세스의 SparkSession 객체를 진입점으로 사용할 수 있다.
  • Scala: 스파크의 기본 언어
  • JAVA: 스파크 창시자들은 애초에 자바를 고려해서 만듬
  • Python: 거의 모든 구조를 지원(Dataset API는 지원하지 않음 - 동적 타입 언어이기떄문)
  • R: SparkR과 sparklyr을 지원

스파크 API

  • 스파크는 저수준의 unstructured API와 고수준의 structured API를 지원함
  • unstructured API: RDD
  • structured API: Dataset, DataFrame, SQL

SparkSession

  • 스파크 애플리케이션은 SparkSession이라고 불리는 드라이버 프로세스가 제어함
  • SparkSession 인스턴스는 사용자가 정의한 처리 명령을 클러스터에서 실행함
  • 하나의 SparkSession은 하나의 스파크 애플리케이션에 대응
  • SparkSession은 DataFrame을 서로다른 익스큐터에 할당

DataFrame

  • 스프레드 시트와 유사하지만 스프레드 시트는 한 대의 컴퓨터에 있지만 DataFrame은 클러스터 전체에 고루 분산되어 있음
  • DataFrame 와 비슷한 개념은 파이썬과 R에도 존재 ( 내부 구현은 다르지만 형태는 유사함)

Partition

  • 스파크는 모든 익스큐터가 병렬로 작업을 수행할 수 있도록 파티션이라고 불리는 청크 단위로 데이터를 분할
  • 파티션은 물리적 머신에 존재하는 로우의 집합
  • DataFrame의 파티션은 실행중에 데이터가 클러스터에서 물리적으로 분산되는 방식을 나타냄
  • 만약 파티션이 하나라면 아무리 많은 익스큐터가 있더라도 병렬성은 1이 됨
  • DataFrame/RDD을 사용하면 파티션을 수동 혹은 개별적으로 처리할 필요가 없이 변환용 함수를 지정하면 스파크가 실제 처리 방법을 결정함

Transformation

  • 스파크의 핵심 데이터 구조는 불변성(Immutable)을 가짐. 즉, 한번 생성하면 변경할 수 없음
  • action을 호출하기 전까지는 transformation이 수행되지 않음
  • narrow dependency: 입력 파티션이 하나의 출력 파티션에만 영향을 미침
    • 이 경우 스파크에서 pieplining을 자동을 수행. 즉, 모든 작업이 메모리에서 일어남
  • wide dependency: 하나의 입력 파티션이 여러 출력 파티션에 영향을 미침
    • 이 경우 디스크에 저장을 하는 과정을 거침

Lazy evaluation

  • 스파크는 연산 명령이 내려진 즉시 데이터를 수정하지 않고 원시 데이터에 적용할 트랜스포메이션의 최적화된 물리적 실행계획을 생성
  • 아주 복잡한 스파크 잡이 원시 데이터에서 하나의 로우만 가져오는 필터를 가지고 있다면 스파크는 이 필터를 데이터 소스로 위임하는 최적화작업을 자동으로 수행

Action

  • 사용자는 트랜스포메이션을 사용해 논리적 실행 계획을 세울 수 있음
  • Action을 호출하면 논리적 실행 계획이 실제로 실행됨
  • Action을 지정하면 Spark job이 됨

Spark UI

  • Spark job의 진행 상황을 모니터링할 때 사용

종합예제

  • schema inference: 데이터를 조금 읽어서 schema를 자동으로 추론해주는 옵션
  • explain: DataFrame의 계보나 스파크의 쿼리 실행 계획을 확인할 수 있음
    • 스파크는 셔플 수행 시 기본적으로 200개의 셔플 파티션을 생성
    • 데이터가 적은 경우 액션을 수행하기전에 이 값을 적절하게 수정하는 것이 필요
    • 사용자는 물리적 데이터를 직접 다루지는 않지만 셔플 파티션 파라미터와 같은 물리적 실행특성은 제어할 수 있음

3. 스파크 기능 둘러보기

운영용 애플리케이션 실행하기

  • spark-submit 명령을 사용해 대화형 셸에서 개발한 프로그램을 운영용 애플리케이션으로 쉽게 전환할 수 있다.

Dataset

  • Dataset API는 타입의 안정성을 지원
  • Dataset은 자바와 스칼라의 정적 데이터 타입에 맞는 코드를 지원하기 위해 고안된 스파크의 구조적 API
  • 동적 타입 언어인 파이썬과 R에서는 사용할 수 없다.
  • 자바의 ArrayList 또는 스칼라의 Seq객체 등의 고정 타입형 컬렉션으로 다룰 수 있는 기능을 제공

저수준 API

  • RDD를 이용해 파티션과 같은 물리적 실행 특성을 결정할 수 있어 DataFrame보다 더 세밀한 제어를 할 수 있음
  • 드라이버 시스템의 메모리에 저장된 원시 데이터를 병렬처리하는데 RDD를 사용할 수 있음
  • 낮은 버전의 스파크 코드를 계속 사용해야 하는 상황이 아니라면 RDD를 사용할 필요는 없다.
  • 다만 비정형 데이터나 정제되지 않은 원시 데이터를 처리해야 한다면 RDD를 사용해야함

0개의 댓글