개발/테스트/학습 환경 (Interactive Clients):** - **노트북 (주피터, 제플린):** 주피터 노트북이나 제플린과 같은 대화형 노트북 환경에서 Spark 코드를 작성하고 실행할 수 있습니다. 이는 데이터 탐색, 실험 및 작은 규모의 작업에 유용합니다. - **Spark Shell:** Spark의 REPL(Read-Eval-Print Loop) 환경으로, 쉘에서 실시간으로 Spark 코드를 작성하고 실행할 수 있습니다.
프로덕션 환경 (Submit Job):** - **spark-submit (command-line utility):** 가장 일반적인 방법으로, Spark 애플리케이션을 제출하여 클러스터에서 실행합니다. 대규모의 프로덕션 운영에 적합합니다. - **데이터브릭스 노트북:** 노트북 코드를 주기적으로 실행할 수 있는 기능을 제공하며, 머신 러닝 파이프라인의 일부로 사용될 수 있습니다. - **REST API:** Spark Standalone 모드에서만 가능하며, API를 통해 Spark 작업을 실행할 수 있습니다. 실행 코드는 미리 HDFS 등의 파일 시스템에 적재되어 있어야 합니다.
Spark 프로그램의 구조
Driver:** - **역할:** Spark 프로그램을 실행하고 제어하는 메인 프로세스로, 실행되는 코드의 마스터 역할을 수행합니다. - **기능:** - 클러스터에서 애플리케이션의 메인 논리를 실행하고 제어합니다. - 작업 스케줄링, 태스크 분배, 데이터 분산, 결과 수집 등을 담당합니다. - 클러스터 매니저 (예: YARN)에서 실행 중인 Application Master와 유사한 역할을 합니다.
Executor:** - **역할:** 실제로 태스크를 실행하고 데이터를 처리하는 역할을 수행하는 프로세스입니다. - **기능:** - 드라이버로부터 할당받은 태스크를 수행합니다. - 태스크의 실행 과정에서 데이터를 메모리에 캐시하고, 중간 결과를 저장합니다. - 드라이버에게 결과를 보고하고, 새로운 태스크를 할당받을 준비를 합니다. - 클러스터 매니저에서 실행 중인 컨테이너에 해당합니다. (예: YARN의 컨테이너)
이러한 구조에서 드라이버는 클러스터의 메인 노드에서 실행되며, 여러 개의 익스큐터가 클러스터의 워커 노드에서 병렬로 동작합니다. 드라이버와 익스큐터 간의 통신은 네트워크를 통해 이루어집니다. Spark 애플리케이션이 실행되면 드라이버와 익스큐터는 클러스터 매니저에 의해 할당되어 동작하게 됩니다.
Spark 프로그램의 구조 더 자세히
Driver:** - **사용자 코드 실행 및 실행 모드에 따른 위치:** - 드라이버는 사용자 코드를 실행하며, 실행 모드에 따라 클라이언트 모드에서는 사용자의 로컬 머신에서 실행되고, 클러스터 모드에서는 클러스터의 매니저에서 실행됩니다.
- **리소스 지정:** - 사용자 코드를 실행하는데 필요한 리소스를 지정합니다. 예를 들어, `--num-executors`, `--executor-cores`, `--executor-memory`와 같은 설정을 통해 익스큐터의 개수와 각 익스큐터의 자원을 지정할 수 있습니다.
- **SparkSession 생성 및 클러스터 통신:** - SparkSession을 만들어 Spark 클러스터와 통신을 수행합니다. - 클러스터 매니저(예: YARN의 Resource Manager)와 통신하여 클러스터 리소스를 할당받습니다. - Executor(예: YARN의 Container)를 클러스터에 요청하고 관리합니다.
- **사용자 코드 변환 및 실행:** - 사용자 코드를 Spark 태스크로 변환하고 클러스터에서 실행합니다. - 클러스터 매니저를 통해 익스큐터를 할당하고, 사용자 코드를 익스큐터에서 실행합니다.
Executor:** - **실제 태스크 실행 역할(jvm: Java Virtual Machine):** - 익스큐터는 드라이버로부터 할당받은 태스크를 실행하는 역할을 수행합니다. - Transformations과 Actions 단계에서 작업을 수행하며, 데이터를 처리하고 중간 결과를 저장합니다.
- **YARN에서의 Container:** - YARN 환경에서는 익스큐터가 클러스터에서 실행되는데, 이때는 YARN의 컨테이너가 해당 역할을 수행합니다.
드라이버와 익스큐터 간의 통신은 SparkSession을 통해 이루어지며, 사용자 코드는 클러스터 환경에서 분산되어 실행됩니다.
Spark 클러스터 매니저 옵션
**local[n]:** - **설명:** 로컬 환경에서 개발 및 테스트 목적으로 사용되는 Spark 클러스터 매니저 옵션입니다. 주로 Spark Shell, 통합 개발 환경(IDE), 노트북 등에서 활용됩니다. - **특징:** - 하나의 JVM이 클러스터로 동작하며, Driver와 하나의 Executor가 실행됩니다. - `n`은 코어의 수를 나타내며, Executor의 스레드 수가 됩니다. - 예를 들어, `local[4]`는 4개의 코어를 사용하여 동작하며, 이는 Executor가 4개의 스레드를 갖는다는 것을 의미합니다. - `local[*]`는 컴퓨터에 있는 모든 코어를 사용하여 동작함을 나타냅니다.
**용도:** - 작은 규모의 데이터나 단일 머신에서의 테스트 및 개발 시에 활용됩니다. - 병렬 처리가 필요한데 클러스터 구성이나 대규모 데이터가 필요하지 않은 경우에 유용합니다. - 스레드 수를 조절하여 성능 튜닝이 가능하며, 단일 머신의 자원을 최대한 활용할 수 있습니다.
YARN:
두 가지 실행 모드: YARN 환경에서 Spark 애플리케이션을 실행할 때는 두 가지 실행 모드를 선택할 수 있습니다: Client 모드와 Cluster 모드.
Client 모드:
설명: Spark 애플리케이션의 Driver가 Spark 클러스터 외부에서 동작하는 모드입니다.
용도:
YARN 기반 Spark 클러스터를 기반으로 개발 및 테스트를 수행할 때 사용됩니다.
개발자가 로컬 머신에서 애플리케이션을 실행하고, 클러스터 리소스를 활용하는 방식으로 사용됩니다.
Cluster 모드:
설명: Spark 애플리케이션의 Driver가 Spark 클러스터 내부에서 동작하는 모드입니다.
특징:
하나의 YARN Container 슬롯을 차지하며, 클러스터 내부에서 실행됩니다.
실제 프로덕션 운영에 사용되는 모드로, 클러스터의 리소스를 효과적으로 활용할 수 있습니다.
용도:
클러스터에서 대규모의 데이터를 처리하거나 실제 운영 환경에서 Spark 애플리케이션을 실행할 때 사용됩니다.
리소스 매니저에 의해 할당된 컨테이너 내에서 애플리케이션이 실행되므로 클러스터의 전체 자원을 효과적으로 활용할 수 있습니다.
**Kubernetes:** - **설명:** Kubernetes 컨테이너 오케스트레이션 플랫폼을 사용하는 클러스터 매니저 옵션으로, 컨테이너화된 Spark 애플리케이션을 실행합니다. - **용도:** 컨테이너 기반의 마이크로서비스 아키텍처에서 Spark 애플리케이션을 실행하거나, Kubernetes를 활용한 클러스터 관리가 필요한 경우 사용됩니다.
**Mesos:** - **설명:** Apache Mesos를 클러스터 매니저로 사용하는 옵션으로, 자원 관리 및 분산 시스템에서 Spark 애플리케이션을 실행합니다. - **용도:** Mesos 클러스터에서 Spark를 실행하거나, Mesos를 활용하여 리소스 동적 할당이 필요한 경우 사용됨
**Standalone:** - **설명:** Spark 자체적으로 제공하는 클러스터 매니저로, 스파크가 내부적으로 클러스터 매니징을 수행하는 옵션 - **용도:** 작은 규모의 클러스터에서 간단한 분산 처리를 위해 Spark 자체적인 클러스터 매니저를 사용할 때 사용됨
요약
하둡 등장:** 빅데이터 처리를 위해 오픈소스인 하둡이 등장하였으며, 이는 분산 파일 시스템과 분산 컴퓨팅 시스템으로 구성되어 있습니다. 주요 구성 요소로는 HDFS와 맵리듀스/YARN이 있습니다.
맵리듀스 제약:** 맵리듀스 프로그래밍의 제약으로 SQL이 다시 부각되었습니다.
Spark 대세:** Spark는 대용량 데이터 분산 컴퓨팅 기술로, Pandas와 Scikit Learn의 스테로이드 버전이라 할 수 있습니다. 또한, SQL과 스트림 데이터, 그래프 처리도 제공하며 현재 대세로 자리 잡고 있습니다.
하둡의 뒤를 잇는 2세대 빅데이터 기술 1) YARN등을 분산환경으로 사용 2) Scala로 작성됨
빅데이터 처리 관련 *다양한* 기능 제공
spark 3.0의 구성
**Spark Core:** - Apache Spark의 핵심 엔진으로, 분산 데이터 처리의 기본 기능을 담당합니다. - 클러스터에서 데이터를 로딩하고, 분산 데이터셋을 생성하며, 다양한 연산 및 변환을 수행하는 데 사용됩니다.
**Spark SQL:** - 구조화된 데이터 처리를 위한 모듈로, SQL 쿼리를 사용하여 데이터에 대한 쿼리 및 분석을 수행합니다. - Hive 쿼리 및 데이터 프레임 API를 지원하여 SQL을 사용하여 대화식으로 데이터를 다룰 수 있습니다.
**Spark ML / Spark MLlib:** - 머신러닝을 위한 라이브러리로, Spark MLlib은 고전적인 머신러닝 알고리즘과 기계 학습 파이프라인을 제공 - Spark ML은 DataFrame API를 기반으로 한 머신러닝 라이브러리로, 풍부한 기능을 제공하며 머신러닝 모델의 구축과 평가를 지원합니다.
**Spark Streaming:** - 실시간 데이터 스트림 처리를 지원하는 모듈로, 초당 수천 개의 이벤트를 처리할 수 있습니다. - 스트리밍 데이터에 대한 윈도우 기반의 연산 및 처리를 제공하여 실시간으로 결과를 생성합니다.
**Spark GraphX:** - 그래프 처리를 위한 라이브러리로, 복잡한 그래프 알고리즘을 처리할 수 있습니다. - 그래프 구조를 다루며, 그래프 상의 연산 및 알고리즘을 제공하여 소셜 네트워크 분석 등 다양한 그래프 기반 작업
주로 하둡과 kubernetes가 쓰인다.
Spark vs. MapReduce
**Spark은 기본적으로 메모리 기반:** - Spark은 데이터를 메모리에 캐싱하여 빠른 데이터 처리를 가능케 합니다. - 메모리 부족 시에는 디스크를 사용하므로 MapReduce에 비해 성능이 향상될 수 있습니다.
**MapReduce는 디스크 기반:** - MapReduce는 대부분의 데이터를 디스크에 저장하고 읽어오기 때문에 IO 오버헤드가 발생할 수 있습니다. - 디스크를 주로 활용하기 때문에 상대적으로 처리 속도가 느릴 수 있습니다.
**MapReduce는 하둡(YARN)위에서만 동작:** - MapReduce는 주로 하둡 클러스터의 YARN 위에서 동작합니다. - Spark은 하둡의 YARN 외에도 Mesos, Kubernetes와 같은 다른 분산 컴퓨팅 환경에서도 실행될 수 있습니다.
**Spark은 판다스 데이터프레임과 개념적으로 동일한 데이터 구조 지원:** - Spark는 DataFrame API를 통해 데이터를 처리하며, 이는 판다스 데이터프레임과 유사한 구조를 가지고 있습니다. - MapReduce는 키-값 쌍의 형태로 데이터를 처리하는데 비해, Spark은 풍부한 데이터 구조를 지원하여 다양한 데이터 처리 작업을 수행할 수 있습니다.
**Spark은 다양한 방식의 컴퓨팅을 지원:** - Spark은 배치 데이터 처리, 스트리밍 데이터 처리, SQL 쿼리, 머신 러닝, 그래프 분석 등 다양한 컴퓨팅 모델을지원 - MapReduce는 주로 대용량 데이터의 배치 처리에 적합한데 반해, Spark은 다양한 작업에 유연하게 대응
Spark 프로그래밍 API
**RDD (Resilient Distributed Dataset):** - **로우레벨 프로그래밍 API:** RDD는 Apache Spark의 핵심 데이터 구조로, 분산된 클러스터에서 데이터를 나타냅니다. 이는 높은 수준의 추상화를 제공하지 않고, 개발자에게 세밀한 제어를 허용합니다. - **세밀한 제어 가능:** RDD를 사용하면 데이터의 파티션을 직접 제어하고, 변환 및 액션을 수행할 수 있습니다. 하지만 이로 인해 코딩의 복잡도가 증가할 수 있습니다.
**DataFrame & Dataset:** - rdd 대비 하이레벨 프로그래밍 API인 DataFrame 및 Dataset은 RDD보다 더 높은 수준의 추상화를 제공하는 API로, 구조화된 데이터를 처리하는 데 특화되어 있습니다. - **구조화 데이터 조작:** 판다스의 데이터프레임과 유사한 인터페이스를 제공하며, SQL과 유사한 쿼리를 사용하여 데이터를 처리할 수 있습니다. - **Spark SQL 사용 추세:** 많은 사용자들이 구조화된 데이터를 다루기 위해 Spark SQL을 사용하며, DataFrame/Dataset API를 선호합니다. - **DataFrame/Dataset이 필요한 경우는? - ML 피쳐 엔지니어링이나 Spark ML을 사용하는 경우에는 DataFrame/Dataset이 더 편리할 수 있습니다. - SQL로는 수행하기 어려운 복잡한 데이터 조작이 필요한 경우에도 유용합니다.
최근에는 DataFrame 및 Dataset을 활용한 데이터 처리가 증가하고 있으며, 세밀한 제어가 필요한 경우에는 여전히 RDD를 사용할 수 있습니다.
Spark SQL
구조화된 데이터 처리를 SQL로 처리:** Spark SQL은 구조화된 데이터를 다루기 위한 모듈로, SQL 쿼리를 사용하여 데이터를 처리할 수 있습니다.
데이터프레임을 SQL로 처리 가능: - 데이터프레임은 테이블처럼 SQL로 처리할 수 있습니다. - 판다스와 비슷한 기능을 제공하여 데이터를 SQL 쿼리로 조작할 수 있습니다.
Hive 쿼리보다 최대 100배까지 빠른 성능을 보장: - Spark SQL은 Hive 쿼리에 비해 최대 100배까지 빠른 성능을 제공한다고 알려져 있습니다. - Hive가 디스크에서 데이터를 읽어오는 방식에 비해, Spark는 메모리에서 데이터를 읽어오는 방식을 채택하여 성능 향상을 이루었습니다.
실제로는 그렇지 않음: - 사실은 Hive도 최근 버전에서는 메모리를 사용하여 성능을 향상시키고 있습니다. - Spark는 기본적으로 메모리를 활용하지만, 큰 데이터셋의 경우 디스크를 활용하기도 합니다. - Presto와 같은 다른 분산 쿼리 엔진들도 메모리와 디스크를 적절히 조합하여 성능을 극대화하려고 합니다. - 세 방식 모두 비슷한 방식, 비슷한 기능으로 가고 있음
Spark ML
머신러닝 관련 다양한 알고리즘, 유틸리티로 구성된 라이브러리:** - Spark ML은 Spark의 머신러닝 라이브러리로, 다양한 머신러닝 알고리즘과 유틸리티로 구성되어 있습니다. - Classification, Regression, Clustering, Collaborative Filtering 등 다양한 머신러닝 작업을 지원합니다.
전체 리스트는 링크 참고. 딥러닝 지원은 미약:** - Spark ML의 머신러닝 알고리즘 및 기능은 계속해서 업데이트되고 있습니다. - 딥러닝 지원은 현재로서는 미약하지만, 라이브러리의 발전에 따라 향후 지원이 강화될 수 있습니다.
RDD 기반과 데이터프레임 기반의 두 버전이 존재:** - `spark.mllib`와 `spark.ml` 두 가지 버전이 존재합니다. - `spark.mllib`는 RDD 기반에서 동작하는 이전 버전의 머신러닝 라이브러리로 더 이상 업데이트되지 않음 - 이제 `spark.ml`이 대세. 데이터프레임 기반에서 동작하며, 최신 기능과 개선된 API를 제공. - `import pyspark.ml`를 사용하여 `spark.ml` 모듈을 가져와야 한다.
Spark ML의 데이터프레임 기반 버전은 더 간편하고 효율적인 API를 제공하며, RDD 기반 버전은 호환성 유지를 위해 여전히 사용 가능하지만, 더 이상의 업데이트가 이루어지지 않습니다.
Spark ML의 장점
**원스톱 ML 프레임웍:** - **데이터프레임과 SparkSQL을 이용한 전처리:** Spark ML은 데이터프레임과 SparkSQL을 이용하여 데이터의 전처리를 편리하게 수행할 수 있습니다. 구조화된 데이터를 다루는 강력한 도구들을 제공합니다. - **Spark ML을 이용한 모델 빌딩:** 머신러닝 모델의 빌딩을 위해 다양한 알고리즘과 기능을 제공하며, 간단한 API를 통해 사용자 친화적으로 모델을 개발할 수 있습니다. - **ML Pipeline을 통한 모델 빌딩 자동화:** ML Pipeline은 여러 단계의 데이터 처리 및 모델 학습 단계를 효과적으로 관리하고 자동화하는데 사용됩니다.
**MLflow로 모델 관리하고 서빙 (MLOps):** - **MLflow를 통한 모델 관리:** MLflow는 모델의 라이프사이클을 관리하고 추적할 수 있는 플랫폼을 제공합니다. 실험 및 모델 버전 관리를 손쉽게 수행할 수 있습니다. - **서빙 (MLOps):** MLflow를 사용하여 모델 서빙을 구축하고 관리할 수 있습니다. 이는 MLOps (Machine Learning Operations)의 한 부분으로 모델을 프로덕션 환경에 효과적으로 배포하고 관리하는 것을 의미합니다.
**대용량 데이터도 처리 가능:** - Spark는 대용량의 데이터를 효과적으로 처리할 수 있는 분산 컴퓨팅 프레임워크이며, Spark ML은 이를 기반으로 머신러닝 모델을 처리할 수 있습니다. - 클러스터 환경에서 병렬 처리를 통해 대용량의 데이터를 효율적으로 다룰 수 있으며, 성능과 확장성 면에서 강력한 기능을 제공합니다.
Spark 데이터 시스템 사용 예
대용량 비구조화된 데이터 처리 (ETL 혹은 ELT):** - 시나리오:** 대용량의 비구조화된 데이터를 추출(Extract), 변환(Transform), 적재(Load)하는 ETL 또는 ELT 프로세스를 구축할 때 사용될 수 있습니다. - 예시:** 로그 데이터, 웹 클릭 데이터, 센서 데이터 등의 비구조화된 데이터를 Spark를 사용하여 처리하고, 구조화된 형태로 변환하여 데이터 웨어하우스에 적재합니다.
ML 모델에 사용되는 대용량 피쳐 처리 (배치/스트림):** - 시나리오:** 머신러닝 모델의 학습을 위해 대용량의 피쳐 데이터를 처리하고 추출하는 작업이 필요할 때 사용됨 - 예시:** 사용자 행동 데이터, 이미지 데이터, 텍스트 데이터 등 다양한 형태의 데이터를 Spark를 사용하여 전처리하고 모델에 사용 가능한 형태로 변환합니다.(사용자가 들어오면 그 사용자의 데이터로 분석해 추천 강의 띄움)
Spark ML을 이용한 대용량 훈련 데이터 모델 학습:** - 시나리오:** 대규모 데이터셋을 사용하여 머신러닝 모델을 훈련하고 학습시키는 작업을 수행할 때 사용될 수 있다. - 예시:** Spark ML의 기능을 활용하여 분산 환경에서 대용량의 데이터로부터 머신러닝 모델을 학습시키는 작업을 수행합니다. 클러스터 환경에서 분산 처리를 통해 높은 확장성을 제공합니다.
이러한 예시들은 Spark를 사용하여 다양한 데이터 처리 및 분석 작업을 수행하는데 활용할 수 있는 일부 시나리오입니다. Spark는 배치 처리, 스트림 처리, 머신러닝 등의 다양한 기능을 통합하여 대용량의 데이터를 효과적으로 다루는 데 도움을 줍니다.
**생산성이 떨어짐. 데이터 모델과 오퍼레이션에 제약이 많음:** - **제한된 프로그래밍 모델:** MapReduce는 간단하고 병렬화하기 쉽지만, 일부 복잡한 문제에 대한 표현력이 제한되어 있습니다. 일부 알고리즘은 MapReduce로 표현하기 어려울 수 있습니다. - **데이터 모델 제약:** 기본적으로 Key-Value 쌍에 기반한 데이터 모델을 사용하며, 이는 모든 문제에 적합하지 않을 수 있습니다.
**모든 입출력이 디스크를 통해 이뤄짐:** - **입출력 오버헤드:** MapReduce는 중간 결과를 디스크에 저장하고, 그 결과를 다시 읽어와서 처리하는 방식을 사용합니다. 이로 인해 디스크 I/O 오버헤드가 발생할 수 있습니다. - **성능 저하:** 대용량 데이터셋의 경우 디스크 입출력이 성능에 영향을 미칠 수 있으며, 메모리에 적재된 데이터를 처리하는 방식이 아니기 때문에 성능 저하가 발생할 수 있습니다.
**Shuffling 이후에 Data Skew가 발생하기 쉬움:** - **데이터 불균형:** Shuffling 단계에서 데이터가 노드 간에 이동할 때 데이터 불균형이 발생할 수 있습니다. 일부 키는 다른 키보다 더 많은 데이터를 생성할 수 있으며, 이는 처리 시간을 늘릴 수 있습니다. - **일부 태스크가 지연될 수 있음:** 데이터 불균형으로 인해 일부 리듀스 태스크가 다른 태스크에 비해 지연되는 현상이 발생할 수 있습니다.
**Reduce 태스크 수를 개발자가 지정해주어야 함:** - **타당한 태스크 수 설정 어려움:** Reduce 태스크 수를 지정하는 것은 어려울 수 있습니다. 너무 적은 태스크 수는 병렬성을 떨어뜨리고, 너무 많은 태스크 수는 오버헤드를 유발할 수 있습니다.
이러한 문제점은 빅데이터 처리에 대한 새로운 접근 방식과 프레임워크의 개발로 극복되고 있습니다. Apache Spark와 같은 프레임워크는 이러한 제한을 극복하고 성능을 개선하기 위해 메모리 기반의 데이터 처리 및 다양한 프로그래밍 모델을 제공합니다.