Spark Structure
Spark Structure
https://spark.apache.org/docs/latest/cluster-overview.html
Spark Components
- Open Source Ecosystem - Spark
Spark Stack Structure
- 스파크는 기본적으로 RDD로 연산을 수행한다
- 인프라 계층 : 먼저 스파크가 기동하기 위한 인프라는 스파크가 독립적으로 기동할 수 있는 Standalone Scheudler가 있고 (그냥 스팍만 OS위에 깔아서 사용한다고 생각하면 된다). 또는 하둡 종합 플랫폼인 YARN 위에서 기동될 수 있고 또는 Docker 가상화 플랫폼인 Mesos 위에서 기동될 수 있다.
Spark Core
- 메모리 기반의 분산 클러스터 컴퓨팅 환경 위에 스팍코어가 올라감
- 스파크 전체의 기초가 되는 기초 분산 작업 처리를 수행
- 장애복구(클러스터 구조),
- 네트워킹
- 보안
- 스케쥴링
- 데이터 셔플링(shuffling) 등 기본 기능을 제공
- RDD(Resilient Distributed Dataset)로 다양한 연산 및 변환(Transformation) 메소드를 제공
- 스파크 코어는 HDFS, GlusterFS, 아마존 S3 등 다양한 파일 시스템에 접근 가능
- 스파크 잡과 다른 스파크 컴포넌트에 필요한 기본 기능을 제공
Spark Library
- 스파크 코어를 이용하여 특정한 기능의 목적에 맞춰진 라이브러리가 지원 됨
- Spark SQL: 빅데이타를 SQL로 핸들링
- Spark Streaming: 실시간으로 들어오는 데이타에 대한 리얼타임 스트리밍 처리
- MLib: 머신러닝
- GraphX: 그래프 데이타 프로세싱
Spark SQL
- 스파크와 하이브 SQL이 지원하는 SQL을 사용해 대규모 분산 정형 데이터 처리
- JSON파일, Parquet파일, RDB테이블, 하이브 테이블 등 다양한 정형 데이터 읽기 및 쓰기 가능
- DataFrame과 Dataset에 적용된 연산을 일정 시점에 RDD 연산으로 변환해 일반 스파크 잡으로 실행
Spark Streaming
- 실시간 스트리밍 데이터를 처리하는 프레임워크
- HDFS, Kafka, Flume, ZeroMQ 와 더블어 커스텀 리소스도 사용 가능
- 이산 스트림(Discretized Stream, DStream)방식으로 스트리밍 데이터를 표현하고, 가장 마지막 타임 윈도 안에 유입된 데이터를 RDD로 구성해 주기적으로 생성
- 다른 스파크 컴포넌트와 함께 사용할 수 있어 실시간 데이터 처리를 머신러닝 작업, SQL작업, 그래프 연산 등을 통합 가능
Spark MLlib
- 머신러닝 알고리즘 라이브러리
- RDD 또는 DataFrame의 데이터셋을 변환하는 머신러닝 모델을 구현
Spark GraphX
- 그래프는 정점과 두 정점을 잇는 간선으로 구선된 데이터 구조
- 그래프 데이터는 Vertex와 Edge로 구성
- 그래프 RDD(EdgeRDD 및 VertexRDD) 형태의 그래프 구조를 만들 수 있는 기능을 제공
Spark 동작 구조
Spark Cluster Structure
스파크 프로그램은 일반적으로 “Driver Program"이라고 하는데, 이 Driver Program은 여러개의 병렬적인 작업으로 나눠져서 Spark의 Worker Node(서버)에 있는 Executor(프로세스)에서 실행된다. 수행 방법
- SparkContext가 SparkClusterManager에 접속한다. 이 클러스터 메니져는 스팍 자체의 클러스터 메니져가 될 수 도 있고 Mesos,YARN 등이 될 수 있다(작업스케쥴링). 이 클러스터 메니저를 통해서 가용한 Excutor들을 할당 받는다
- Excutor를 할당 받으면, 각각의 Executor들에게 수행할 코드를 보낸다.
- 다음으로 각 Excutor 안에서 Task에서 로직을 수행한다.
Cluster Manager
- 클러스터에 1개 존재(백 존재 가능)
- 여러 대의 서버로 구성된 클러스터 환경에서 다수의 Application이 함께 구동될 수 있게 Application간의 CPU나 메모리, 디스크와 같은 전반적인 컴퓨팅 자원 관리
- 스케쥴링 담당(클러스터 매니저의 가장 중요한 역할) : 워커노드 작업 관리
- Cluster Manager Types : Standalone: 스파크가 독립적으로 작동할 수 있음 : Apache Mesos: Hadoop MapReduce와 Service Applications을 수행하는 일반적인 클러스터 매니저 : Hadoop YARN: Hadoop의 Resource Manager(하둡과 스파크는 상호 독립적) : Kubernetes: 오케스트레이션 도구. Automating Deployment, Scaling, Containerized Applications 관리를 위한 오픈소스 시스템
Driver
- 사용자 코드를 실행, main()문과 같은 역할을 하는 프로세스
- SparkContext와 RDD 생성
- Transformation과 Action을 생성(RDD의 두가지 연산 방법)
SparkContext
- 어떻게 클러스터에 접근할 수 있는지 알려주는 object
- Worker Node내 Excutor간 통신이 발생
- Driver는 Excutor에게 Task를 할당
- Excutor에서는 Task를 수행하고 종료시 Driver에게 결과 값을 주게됨
Worker Node
- 실제 작업을 수행하는 노드
- Executor : 주어진 스파크 작업의 개별 태스크들을 실행하는 작업실행 프로세스 : 애플리케이션에을 구성하는 작업을 실행 -> 드라이버에 결과 전송 : 사용자 프로그램에서 캐시하는 RDD를 저장하기 위한 메모리 저장소 제공
- Task : executor에 할당 되는 작업의 단위 : 하나의 Excutor에 여러개 Task 있을 수 있음
Spark프로그래밍 모델
History of Spark APIs https://medium.com/@ravi.g/sparks-structured-api-s-cdeb381f6407
Spark 처리 모델 RDD
- 스파크 내부에 존재하는 분산 데이터에 대한 모델로, 기본 데이터 구조, Immutable(변경이 불가능한 데이터 셋)
- 단순히 “값"으로 표현되는 데이터만 가리키는 것이 아니라 데이터를 다루는 방법까지 포함하는 일종의 클래스와 같은 개념
- 스파크에서 내부적으로 연산하는 데이터들은 모두 RDD타입으로 처리
- RDD는 대량의 데이터를 요소로 가지는 부산 컬렉션
- RDD는 여러 머신으로 구성된 클러스터 환경에서의 분산처리를 전제로 설계되었으며, 내부는 파티션이라는 단위로 구분
- RDD는 배열/리스트 등의 요소를 저장하며, 내부는 여러 개의 파티션(분산 처리 단위)으로 구분
- 사용자는 HDFS 등의 분산 파일시스템에 있는 파일 내용을 RDD로 로드하고, RDD를 가공하는 형식(데이터를 변환)으로 대량의 데이터를 분산처리
RDD 연산
Transformation
- 주어진 스파크 작업의 개별 태스크들을 실행하는 작업 실행 프로세스
- 기존의 RDD 내용이 바뀌는 것이 아니라 새로운 RDD가 생성
Action
- RDD의 요소들을 이용해 어떤 결과값을 얻어내는 연산
- 보통 return값이 RDD가 아닌 다른 타입의 데이터
Partition
- 하나의 RDD는 여러 개의 파티션으로 나눠짐
- 성능에 유효한 영향을 줌
- 파티션 갯수, 파티셔너는 선택 가능
- 기본 파티셔너(Hash, Range) 외에도 사용자가 정의한 파티셔너 사용 가능
DataFrame
- 데이터프레임은 관계형 데이터베이스의 테이블에서 컬럼이름으로 구성된 변경 불가능한 분산 데이터 컬렉션이다.
- 아파치 스파크 1.0에서 경험적 피처로서 SchemaRDD가 소개된 것처럼, SchemaRDD가 아파치 스파크 1.3버전에서 데이터프레임 이라는 이름으로 바뀌었다.
- 스파크 데이터프레임은 구조적인 데이터로 작업을 쉽게 해준다
RDD(Rilient Distributed Datasets)
- 스파크의 기본 데이터 구조
- 분산 데이터 컬렉션(데이터셋 - JVM기반에서 수행(Java로 구현됨))을 추상화한 객체인 RDD
- 형식적으로 RDD는 읽기 전용으로 분할된 레코드의 모음
- RDD는 안정적인 저장장치나 다른 RDD의 데이터에 대한 결정로적 작동을 통해 생성될 수 있음
- RDD는 병렬로 작동할 수 있는 내결함성 요소의 집합
- RDD 만드는 방법 : 드라이버 프로그램에서 기존 컬렉션을 병렬화 : 공유 파일시스템, HDFS, HBase 또는 Hadoop 입력 포맷을 제공하는 데이터소스와 같은 외부 스토리지 시스템의 데이터셋을 참조