1. Spark 소개
- 버클리 대학의 AMPlab에서 아파치 오픈소스 프로젝트로 2013 시작
- 나중에 DataBricks라는 스타트업 창업
- 하둡의 뒤를 잇는 2세대 빅데이터 기술
- YARN등을 분산환경으로 사용
- Scala로 작성됨
- 빅데이터 처리 관련 다양한 기능 제공
- Spark 3.0의 구성
- Spark Core
- Spark SQL
- Spark ML : 데이터프레임 기반
- Spark MLlib : RDD라는 데이터 스트럭처 기반(없어지는 단계)
- Spark Streaming
- Spark GraphX
- Spark vs MapReduce
- Spark은 기본적으로 메모리 기반
- 메모리가 부족해지면 디스크 사용
- MapReduce는 디스크 기반
- MapReduce는 하둡(YARN) 위에서만 동작
- Spark은 하둡(YARN) 이외에도 다른 분산 컴퓨팅 환경 지원(K8s, Mesos)
- MapReduce는 키와 밸류 기반 데이터 구조만 지원
- Spark은 판다스 데이터프레임과 개념적으로 동일한 데이터 구조 지원
- Spark은 다양한 방식의 컴퓨팅을 지원
- 배치 데이터 처리, 스트림 데이터 처리, SQL, 머신 러닝, 그래프 분석
- Spark은 기본적으로 메모리 기반
2. Spark 프로그래밍 API
- RDD(RESILIENT DISTRIBUTED DATASET)
- 로우레벨 프로그래밍 API로 세밀한 제어가 가능
- 하지만 코딩 복잡도 증가
- DATAFRAME & DATASET (판다스의 데이터프레임과 흡사)
- 하이레벨의 프로그래밍 API로 점점 많이 사용되는 추세
- 구조화 데이터 조작이라면 보통 Spark SQL을 사용
- Scala, Java의 경우 Dataset 사용
- Python의 경우 DataFrame 사용
- DataFrame/Dataset이 꼭 필요한 경우는?
- ML 피처 엔지니어링을 하거나 Spark ML을 쓰는 경우
- SQL만으로 할 수 없는 일의 경우
- Spark SQL은 구조화된 데이터 처리를 SQL로 처리
- 데이터프레임을 SQL로 처리 가능
- 데이터프레임은 테이블처럼 sql로 처리 가능
- 판다스도 동일 기능 제공
- 유지보수, 코드의 통일성 면에서 웬만해서는 SQL 사용 권장
- Hive 쿼리보다 최대 100배까지 빠른 성능을 보장
- 사실은 그렇지 않음. Hive도 그 사이에 메모리 사용하는 걸로 발전
- Hive : 디스크 -> 메모리
- Spark : 메모리 -> 디스크
- Presto : 메모리 -> 디스크
- 지금은 다들 비슷해짐, 최적화 포인트가 다른 것 뿐
- 다만 Spark이 가지는 장점은, SQL 이외에도 하이레벨 프로그래밍 API가 있고,
- 다른 패키지들이 제공된다는 점
- 사실은 그렇지 않음. Hive도 그 사이에 메모리 사용하는 걸로 발전
3. SPARK ML
- SparkML
- 머신러닝 관련 다양한 알고리즘, 유틸리티로 구성된 라이브러리
- Classification, Regrssion, Clustering, Collaborative Filtering, ...
- 딥러닝 지원은 미약
- RDD 기반과 데이터프레임 기반의 두 버전이 존재
- spark.mlib vs spark.ml
- spark.mlib가 RDD 기반이고, spark.ml은 데이터프레임 기반
- spark.mlib은 RDD 위에서 동작하는 이전 라이브러리로 더 이상 업데이트가 안됨
- 항상 spark.ml을 사용할 것!
- import pyspark.ml
- spark.mlib vs spark.ml
- SparkML의 장점
- 원스톱 ML 프레임워크
- 데이터프레임과 SparkSQL 등을 이용해 전처리
- Spark ML을 이용해 모델 빌딩
- ML Pipeline을 통해 모델 빌딩 자동화
- MLflow로 모델 관리하고 서빙(MLops)
- 대용량 데이터도 처리 가능!
- 원스톱 ML 프레임워크
4. SPARK 데이터 시스템 사용 예시
- Spark 데이터 시스템 사용 예들
- 기본적으로 대용량 데이터 배치 처리, 스트림 처리, 모델 빌딩
- 예 1) 대용량 비구조화된 데이터 처리하기(ETL 혹은 ELT)
- 예 2) ML 모델에 사용되는 대용량 피쳐 처리(배치/스트림)
- 예 3) Spark ML을 이용한 훈련 데이터 모델 학습
- 기본적으로 대용량 데이터 배치 처리, 스트림 처리, 모델 빌딩
- Spark 데이터 시스템 사용 예 1
- 대용량 혹은 비구조화된 데이터 처리하기(Hive의 대체 기술)
- ETL 혹은 ELT
- 대용량 혹은 비구조화된 데이터 처리하기(Hive의 대체 기술)
- Spark 데이터 시스템 사용 예 2
- ML 모델에 사용되는 대용량 피처 처리
- 데이터가 작으면 redis 써도 됨(cassandra, HBase 말고)
- NoSQL에 저장된 Feature들이 MLAPI에 Feature로 사용됨
5. SPARK 프로그램 실행 옵션
- 개발/테스트/학습 환경(Interactive Clients)
- 노트북(주피터, 제플린)
- Spark Shell
- 프로덕션 환경(Submit Job)
- Spark-submit(command-line utility) : 가장 많이 사용됨
- 데이터브릭스 노트북:
- 노트북 코드를 주기적으로 실행할 수 있음
- Create and manage scheduled notebook jobs | Databricks on AWS
- REST API
- Spark Standalone 모드에서만 가능
- API를 통해 Spark job을 실행
- 실행 코드는 미리 HDFS등의 파일 시스템에 적재 되어있어야함
- Spark 프로그램의 구조
- Driver
- 실행되는 코드의 마스터 역할 수행(YARN의 Application Mater)
- 사용자 코드를 실행하며 실행 모드(client, cluster)에 따라 실행되는 곳이 달라짐
- client 모드는 개발을 위해서 클러스터 밖에서 코드를 실행
- cluster 모드는 개발이 끝난 코드를 클러스터 안에서 코드 실행
- 코드를 실행하는데 필요한 리소스를 지정함
- --num-executors, --executor-cores, --executor-memory
- 보통 SparkContext를 만들어 Spark 클러스터와 통신 수행
- Cluster Manager (YARN의 경우 Resource Manager)
- Executor(YARN의 경우 Container)
- 사용자 코드를 실제 Spark 태스크로 변환해 Spark 클러스터에서 실행
- Executor
- 실제 태스크를 실행해주는 역할 수행(JVM) : Transformations, Actions
- YARN에서는 Container가 됨
- Driver
- Spark 클러스터 매니저 옵션
- local[n] : 몇개의 cpu를 사용할 것이냐?
- YARN
- Kubernetes
- Mesos
- Standalone
- local[n]
- 개발/테스트용
- Spark Shell, IDE, 노트북
- n은 코어의 수 : executor의 수가 됨
- local[*]은 무엇일까?
- 컴퓨터에 있는 모든 코어 사용
- 개발/테스트용
- YARN
- 두 개의 실행 모드가 존재 : Client vs. Cluster
- Client 모드 : Driver가 Spark 클러스터 밖에서 동작
- YARN 기반 Spark 클러스터를 바탕으로 개발/테스트 등을 할 때 사용
- Cluster 모드 : Driver가 Spark 클러스터 안에서 동작
- 하나의 Executor 슬롯을 차지
- 실제 프로덕션 운영에 사용되는 모드
- 요약
'데이터 엔지니어링 > Spark' 카테고리의 다른 글
6. Spark(개발환경 옵션, Local Standalone, 활용 Demo) (0) | 2023.07.28 |
---|---|
5. Spark 프로그램 구조(Spark Session 생성, 환경변수) (1) | 2023.07.11 |
4. Spark 프로그래밍 : DataFrame(데이터처리, 동작구조) (0) | 2023.07.11 |
2. 빅데이터 처리와 Spark 소개(맵리듀스 프로그래밍) (0) | 2023.07.10 |
1. 빅데이터 처리와 Spark 소개(빅데이터 정의, 하둡 이론 등) (2) | 2023.07.10 |