Spark 란
- 버클리 대학의 AMPLab에서 아파치 오픈소스 프로젝트
- 대규모 데이터를 처리하기 위한 클러스터 컴퓨팅 프레임워크
- Java로 개발되었으며 Python, Sql, Scala등의 언어들을 지원하여, 어떤 언어로 개발하든 성능에 큰 이슈 없도록 설계
- Hadoop와 달리 MapReduce 로직중 Map를 메모리에서 처리하기에 Hadoop보다 속도가 빠름
- 빅데이터 처리 관련 다양한 기능 제공
- https://spark.apache.org/releases/spark-release-3-5-0.html
Spark와 MapReduce 비교
Spark | MapReduce | |
데이터 처리 방법 | 메모리 기반이며 메모리가 부족해지면 디스크 사용 | 디스크 기반 |
분산 컴퓨팅 | 하둡(YARN)이외에도 다른 분산 컴퓨팅 환경 지원 (K8s, Mesos) | 하둡(YARN)위에서만 동작 |
데이터 구조 | Pandas DataFrame과 개념적으로 동일한 데이터 구조 지원 | 키와 밸류 기반 데이터 구조만 지원 |
컴퓨팅 방식 | 다양한 방식의 컴퓨팅을 지원 (EX.배치 데이터 처리, 스트림 데이터 처리, SQL, 머신 러닝, 그래프 분석) |
배치 데이터 처리만 가능 |
- CF) MapReduce 관련 내용 : https://ysyblog.tistory.com/347
Spark의 파일을 읽는 방식
1. Schema on read
- 파일을 읽은 순간 사용자가 읽는 데이터의 Schema를 확정하는 방식
- Spark는 별도의 Schema 데이터를 주지 않으면, 사용자가 읽는 파일의 일부 레코드를 보고 타입을 추론
- 따라서 타입이 헤더에 명시된 parquet등의 형식이 아닌 json, csv같은 텍스트 데이터는 실제 물리적으로 저장된 데이터와 Spark가 읽어들인 데이터가 다를 수 있음
2. Column 기반 파일 저장
- 기본적으로 파일은 일렬로 된 배열의 Binarary 파일로 구성
- Row 기반으로 파일을 저장하는 경우 파일을 메모리에 올리는 속도는 빠르나, 특정 컬럼만 필요한 경우 해당 컬럼만 가져올 수 없음 (Row는 가변 배열)
- Spark에서는 필요한 Column만 읽어 메모리에 올릴 수 있도록 Column기반 파일 저장 방식 선호 (EX. Parquet, ORC)
- 따라서 Spark를 사용할 때는 필요한 컬럼만 읽어올 수 있더록 Select나 Filter를 잘 사용해야함
CF) Parquet이란 : https://ysyblog.tistory.com/372
Spark Application
YARN에 제출된 job을 Spark Application이라고 함
CF) YARN이란 : https://ysyblog.tistory.com/407
- SparkSession, SparkContext, HiveContext. SQLContext은 모두 Class중 하나
- SparkContext : spark2.x 이전에 모든 Spark 애플리케이션의 진입점이며, 모든 Spark기능에 엑세스 할 수 있는 메인 채널
- Spark 2.0에서는 SparkContext만 있었지만, 한 사용자가 다수의 SparkContext를 생성하거나, 하나의 컴퓨터에 여러 사용자가 접근하는등 SparkContext를 격리하기 위해 상위개념인 SparkSession 추가
- 일반적으로 SparkSession을 sc변수명으로 사용함.
CF) SparkSession이란 : https://ysyblog.tistory.com/360
Spark Driver, Executor
https://ysyblog.tistory.com/352
Spark Action의 구성요소(Job, Stages, Tasks)와 Spark의 연산
https://ysyblog.tistory.com/375
Spark Run on YARN with HDFS
- Spark의 여러개의 Task를 수행하는 Executor들이 HDFS NameNode에 접근하여 파일 IO요청 진행
- Namenode는 요청한 파일 데이터 블록을 가지고 있는 Datanode중에 한 개의 접속 위치를 Executor에게 알려줌
- Executor는 해당 Datanode에 가서 데이터를 가져옴
- 가져온 데이터의 크기가 spark.sql.files.maxpartitionBytes 수보다 크면 (보통 128MB) 쪼개서 Partition으로 잡고 그렇지 않으면 1개 Partition으로 처리
Spark 데이터 처리 방식 (Partition, Shuffle, Spill)
https://ysyblog.tistory.com/358
Spark 데이터 구조
https://ysyblog.tistory.com/359
- RDD (Resilient Distributed Dataset)
- 로우레벨 프로그래밍 API로 세밀한 제어가 가능
- 코딩 복잡도 증가하여 최근에는 잘 쓰이지 않음
- DataFrame & Dataset (Pandas의 DataFrame과 비슷)
- 하이레벨 프로그래밍 API로 점점 많이 사용되는 추세
- 구조화 데이터 조작이라면 보통 Spark SQL을 사용
- DataFrame/Dataset이 필요한 경우
- ML 피쳐 엔지니어링을 하거나 Spark ML을 쓰는 경우
- SQL만으로 할 수 없는 일의 경우
Spark SQL
https://ysyblog.tistory.com/category/Spark%20%26%20Hadoop/Pyspark%20%26%20SparkSQL
- Spark SQL은 구조화된 데이터 처리를 SQL로 처리
- 데이터 프레임을 SQL로 처리 가능
- 데이터프레임은 테이블처럼 sql로 처리 가능
- 판다스도 동일 기능 제공
- 과거에는 Hive 쿼리 보다 빠른 성능을 보장하였었음
- 다만 Hive도 메모리를 쓰는 걸로 발전하였기에 큰 차이가 없어졌음
- Hive: 디스크 -> 메모리
- Spark: 메모리 -> 디스크
- Presto: 메모리 -> 디스크
Spark ML
https://ysyblog.tistory.com/category/Spark%20%26%20Hadoop/SparkML
- 머신러닝 관련 다양한 알고리즘, 유틸리티로 구성된 라이브러리
- Classification, Regression, Clustering, Collaborative Filtering 등..
- spark.mllib(RDD 기반)과 spark.ml(데이터프레임) 기반의 두 버전이 존재
- spark.mllib는 RDD위에서 동작하는 이전 라이브러리로 더 이상 업데이트가 안됨
- 항상 spark.ml을 사용할 것
- import pyspark.ml (import pyspark.mllib)
- SparkML의 장점 : One-Stop ML FrameWork
- 머신러닝과 관련된 Action을 한곳에서 할 수 있으며 대용량의 훈련 데이터를 처리하는 것이 용이
- 데이터프레임과 SparkSQL등을 이용해 전처리
- Spark ML을 이용해 모델 빌딩
- ML Pipeline을 통해 모델 빌딩 자동화
- MLflow로 모델 관리하고 서빙 (MLOps)
- sklearn같이 서버한대에서만 돌아가는 머신러닝 라이브러리와 큰 차이를 보인다.
Spark 데이터 시스템 사용 활용방법 예시
- 기본적으로 대용량 데이터 배치 처리, 스트림 처리, 모델 빌딩
1. 대용량 비구조화된 데이터 처리하기 (Batch Processing, ETL 혹은 ELT)
- Hive를 대체
2. ML 모델에 사용되는 대용량 피쳐 처리 (배치/스트림)
3. Spark ML을 이용한 대용량 훈련 데이터 모델 학습
참고자료
- [파이썬으로 해보는 Spark 프로그래밍 with 프로그래머스] 강의
- https://spark.apache.org/releases/spark-release-3-5-0.html
- https://spark.apache.org/docs/latest/ml-classification-regression.html
- https://velog.io/@6v6/SparkSession-SparkContext-%EC%B0%A8%EC%9D%B4
- https://spark.apache.org/docs/latest/running-on-yarn.html
- https://www.geeksforgeeks.org/hdfs-data-read-operation/
728x90
반응형