BRICKSTUDY

Spark, Airflow, mlflow, databricks Let's go! 본문

Data

Spark, Airflow, mlflow, databricks Let's go!

c-park-2 2024. 7. 21. 11:50

개요

최근 산업에서는 데이터의 규모가 커지고 서비스의 파이프라인이 커지면서, 데이터 직군에서는 대용량 데이터 처리, 워크플로우 관리와 같은 데이터 플랫폼에 대한 관심도가 커지고있다.
국내 여러 기업에서도 Databricks와 같은 통합 데이터 플랫폼을 도입하고 있다.데이터브릭스 고객 사례이에 따라서 데이터 직군(데이터 엔지니어, 데이터 분석가, 데이터 사이언티스트)으로 진로를 준비하는 사람들에게 알면 좋은 데이터 중심의 플랫폼을 간단하게 소개하려고 한다.

소개할 플랫폼
- Apache Spark
- Apache Airflow
- MLflow
- Databricks

1. Apache Spark

Spark란?

Spark는 오픈소스 클러스터 컴퓨팅 프레임워크라고 할 수 있고, 단일 노드 컴퓨터 또는 클러스터에서 데이터 엔지니어링, 사이언스, 분석을 실행하기 위한 다중 언어 엔진이라고 할 수 있다.

Spark에서 중요한 개념은 다음과 같다.

  1. 클러스터 환경
  2. 다중 언어 엔진

쉽게 말하면 클러스터 환경에서 편하게 우리의 Application을 구동시킬 수 있는 프레임워크라고 정리해볼 수 있다.

Spark 클러스터 환경

Spark를 공부하면서 가장 헷갈렸던 부분은 Spark 관련 용어이다. Application, Driver, WorkerNode,... 와 같은 용어들은 평소에 분산 컴퓨팅 관련 지식이 없으면 알기 어려운 용어들이다. 그래서 Spark 클러스터 환경을 가볍게 이해하기 위한 용어 정리를 하려고 한다.

용어 정리

  • Spark Application
    • Spark으로 작성된 사용자 프로그램.
    • Driver 프로그램과 Executors 로 구성
  • Driver 프로그램
    • Application의 main함수를 실행하고 _Spark context_를 생성하는 프로세스
  • Spark Context
    • 클러스터와의 연결을 관리
    • RDD 생성 및 관리
  • Executor
    • Worker node_에서 application 위에 런치된 프로세스 _task를 실행하고 메모리와 디스크에 데이터를 보관한다.
  • Cluster manager
    • 클러스터의 리소스를 획득하기 위한 외부 서비스(Stand-alone manager, Mesos, YARN) 등.
  • Worker node
    • 클러스터에서 application 코드를 실행할 수 있는 노드
  • Task
    • 하나의 executor에 보내지는 작업의 단위

Spark cluster architecture


Spark cluster 구조를 살펴보면 클러스터 상에서 어떤 식으로 application이 구동되는지 확인할 수 있다.

Spark 클러스터에서 application 실행 과정

  1. Cluster manager와 리소스 할당
    • Spark application이 시작되면, Driver 프로그램이 SparkContext를 생성
    • SparkContext는 cluster manager(Mesos, YARN 등)에 연결하여 application 실행에 필요한 리소스를 요청
    • Cluster manager는 요청을 받아들여 리소스를 할당하고, executor를 worker node에서 시작
  2. Application 코드 및 Task 전송
    • Driver 프로그램은 SparkContext를 통해 application code를 executor에 전송
    • 이때, 각 application의 task는 executor에게 전달
    • Task는 RDD의 transformation과 action으로 구성
  3. Executor에서 Task 처리
    • 각 worker node에 할당된 executor는 받은 task를 처리
    • Task가 실행되면서 필요한 데이터를 로드하고, 필요한 경우 데이터를 메모리나 디스크에 캐시
    • 각 task의 실행 결과는 Driver 프로그램으로 반환
    • Executor는 여러 task를 병렬로 처리하여, 데이터 처리 작업을 효율적으로 수행

Spark Architecture

Spark는 SparkCore, 와 다양한 워크로드로 구성이 되어 있다. Spark architecture layer를 살펴보고 각각이 어떤 역할과 기능을 수행하는지 살펴보자.


출처 : https://aws.amazon.com/ko/what-is/apache-spark/

Spark work load

Spark Core

  • 플랫폼의 기초
  • 메모리 관리, 장애 복구, 스케줄링, 작업 배포 및 모니터링, 스토리지 시스템과의 상호 작용을 담당
  • Spark Core는 Java, Scala, Python 및 R용으로 구축된 애플리케이션 프로그래밍 인터페이스(API)를 통해 노출, 이러한 API는 간단한 상위 수준 연산자 뒤에 분산 처리의 복잡성을 숨긴다.
  • MLlib*
  • 스파크(Spark)의 컴포넌트(Component) 중 하나이며, Machine Learining Library의 약자
  • 데이터 처리, 특징 추출, 모델 훈련 및 평가를 위한 광범위한 기계 학습 알고리즘과 도구를 제공
  • MLlib은 분류, 회귀, 클러스터링, 추천 등을 위한 포괄적인 기계 학습 알고리즘 세트를 제공
  • Streaming*
  • Spark core의 빠른 스케줄링 기능을 활용하여 스트리밍 분석을 수행하는 실시간 솔루션
  • 미니 배치로 데이터를 수집하고 배치 분석을 위해 작성된 동일한 애플리케이션 코드를 사용하여 해당 데이터에 대한 분석을 가능하게 함.
  • Spark SQL*
  • 정형 데이터 처리를 위한 Spark 모듈
  • Spark sQL은 MapReduce보다 100배 빠른 지연 시간이 짧은 대화형 쿼리를 제공하는 분산 쿼리 엔진
  • GraphX*
  • Spark를 기반으로 구축된 분산 그래프 처리 프레임워크
  • ETL, EDA, 및 반복적 그래프 계산을 제공하여 사용자가 대화형 방식으로 그래프 데이터 구조를 대규모로 구축하고 변환할 수 있도록 함.

Spark APIs

Spark Core 내부의 프로그래밍 언어 API를 제외한 내부 API는 Spark가 왜 대용량 처리에서 강점이 있는지를 설명해준다.

Spark application의 구현 방법은 Spark v1에서 발표한 RDD를 이용하는 방법과 Spark v2에서 RDD의 단점으로 개선하여 발표한 데이타셋(Dataset)과 데이터프레임(DataFrame)을 이용하는 방법 두가지가 있다.

여기서는 RDD와 Dataframe에 대한 특징을 기술한다.

  • Resilient Distributed Datasets (RDD)
    • Resilient: 메모리에서 데이터 손실 시 파티션을 재연산해 복구 가능
    • Distributed: 클러스터의 모든 머신의 메모리에 분산 저장
    • Datasets: 외부 파일 시스템과의 연동
      RDD는 Spark의 기본 추상화 레이어이며, 다음과 같은 특징을 가지고 있다.
    1. 불변성 :
      • RDD는 한 번 생성되면 변경할 수 없다.
      • 각 RDD는 기존 RDD로부터 변환(Transformation)을 통해 새롭게 생성
    2. 분산성 :
      • RDD는 클러스터의 여러 노드에 분산 저장
      • 분산 저장을 통해 대규모 데이터를 병렬로 처리
    3. Fault Tolerance(내결함성)
      • RDD는 데이터 분할 및 연산 정보(Lineage)를 통해 내결함성을 보장
      • 데이터 손실 시 Lineage 정보를 사용하여 원래 데이터를 재생성 가능
    4. Lazy Evaluation
      • RDD 연산(Transformation)은 즉시 실행되지 않고, 최종 액션(Action) 연산이 호출될 때 실행 계획이 수립되고 실행
      • Lazy Evaluation을 통해 최적화된 실행 계획을 수립(사용자의 로직 작성)
    5. Transformation
      • map, filter, flatap 등 새로운 RDD를 생성 하는 연산.
    6. Action
      • collect, count, reduce 등 실제 연산 결과를 반환하는 연산.

RDD는 인메모리 데이터 처리를 통하여 처리 속도를 높일 수 있었지만, 테이블 조인 효율화 같은 처리를 사용자가 직접 제어해야 했기 때문에 최적화에 어려움을 겪었다. 이러한 단점을 해결하기 위해서 Dataframe이 등장했다.

  • DataFrame
    DataFrame은 Spark의 고수준 API이다. 테이블 형식의 데이터를 다루기 위한 구조를 가지고 있고, SQL 쿼리를 지원한다. 무엇보다 데이터를 스키마 형태로 추상화 하고, 카탈리스트 옵티마이저가 쿼리를 최적화하여 처리한다.
    1. Transformation
      • select, filter, groupBy, join
    2. Action
      • show, collect, write

Why Spark

지금까지 Spark에 대한 대략적인 정보를 살펴봤다. 그렇다면 우리는 왜 Spark를 써야할까? 사실 대용량 데이터 처리를 위한 프레임워크, 분산 처리를 위한 프레임워크는 이미 많이 존재하고 있다.

이번 파트에서는 Spark의 강점을 알아보면서 Spark를 써야하는 이유를 생각해보자.

Spark의 대표적인 장점

  • 속도
    • Spark는 여러 개의 병렬 작업에 걸쳐 데이터를 메모리에 캐시하여 무척 빠른 실행 속도
    • In-memory 엔진으로 대규모 데이터 처리 속도를 높임
  • 실시간 스트림 처리
    • 데이터 스트림을 시간 단위, 마이크로 배치 형태로 처리
    • 여러 워크로드 지원
    • Apache Spark는 여러 개의 워크로드를 실행할 수 있음.
    • 하나의 Application이 여러 워크로드를 원할하게 조합 가능
  • 사용 편리성 증가
    • Spark는 여러 가지 프로그래밍 언어를 지원할 수 있음.
    • Java, Scala, Python, R로 신속하게 Application을 작성할 수 있음.
  • 거대한 오픈소스 커뮤니티
    • 오픈 소스 프레임워크는 그 커뮤니티의 크기와 관심도가 매우 중요한 지표

Spark vs Pandas

사실 일반적으로 데이터 사이언스를 공부한 필자와 같은 사람들은 Spark 보다는 Python 데이터 처리 라이브러리인 Pandas가 더 익숙하다. Pandas도 강력한 데이터 처리 도구이지만, 데이터의 크기가 큰 실무에서는 Pandas보다는 Spark가 더 알맞다고 볼 수 있다.

Spark

  • 분산 컴퓨팅 환경에서 대규모 데이터 셋을 작업하기 위한 라이브러리
  • 병렬 처리 허용
  • HDFS, Amazon S3 및 로컬 파일 시스템 포함한 다양한 소스에서 데이터 로드 가능 가능 가능
  • Lazy evaluation
  • Pandas*
  • 단일 시스템에서 작은 데이터 세트 작업을 위한 라이브러리
  • 병렬처리 허용 X
  • 로컬 파일 시스템의 데이터 로드
  • Eager evaluation

분산 처리와 병렬 처리에서의 차이점과 로컬 파일 시스템밖에 사용할 수 없는 한계점이 크고, 무엇보다 evaluation 방식에서 차이가 매우 크다. 대용량 데이터 처리에서는 Lazy Evaluation이 연산 최적화, 메모리 효율성, 병렬 처리, 내결함성 등 여러 측면에서 이점을 제공하기 때문에 Spark를 사용한다.

기업들의 Spark 도입

드라마앤컴퍼니(리멤버)
AIRBNB

Spark MLlib 예제 링크

https://learn.microsoft.com/ko-kr/azure/hdinsight/spark/apache-spark-machine-learning-mllib-ipython
https://www.kaggle.com/code/fatmakursun/pyspark-ml-tutorial-for-beginners

Spark 관련 레퍼런스

https://aws.amazon.com/ko/what-is/apache-spark/
https://wikidocs.net/28377
https://mkkim85.github.io/spark-introduce-spark-and-spark-api/


2. Airflow

이번에는 가장 대중적으로 알려진 workflow management tool인 airflow에 대해서 알아보자
workflow는 마찬가지로 최근 기업의 서비스 구조가 복잡해지고 데이터 pipeline 자체가 커지고 있기 때문에, workflow management의 필요성이 증가했고 그 중요성은 더욱이 커지고 있다.

Airflow란?

Airflow는 2014년 airbnb 사에서 만든 workflow 관리 솔루션이고, 손쉽게 workflow를 만들고 관리할 수 있는 오픈소스 기반의 도구이다.
쉽게 말하면 python 코드로 workflow를 작성하고, 스케줄링, 모니터링하는 플랫폼이다.

Workflow : 다양한 작업(Task)들을 정의하고, 이러한 작업들이 의존성을 갖고 순서대로 또는 병렬로 실행되도록 설계된 일련의 단계입니다.

Airflow architecture

Airflow도 마찬가지로 관련 용어를 정리하고 구조를 살펴보면서 그 기능과 역할을 쉽게 이해할 수 있다.

Airflow 구조도


출처 : https://tkdguq05.github.io/2021/02/21/airflow-basic2/

Airflow 용어 정리

  • DAG Directory :
    • python 코드로 작성된 DAG 들을 보관하는 장소이다.
  • Scheduler :
    • DAG와 Task를 모니터링하고 스케줄링한다. Executor에게 Task 실행을 요청한다.
  • Executor :
    • Task가 어떻게 실행될지를 정의한다. 'queued' 상태인 Task를 확인해 실제 어떤 리소스가 투입되어 실행 될 것인지를 결정한다.
  • Worker :
    • 실제 Task를 처리하는 컴포넌트이다. Executor 종류에 따라 동작 방식이 다양하다.
  • Webserver :
    • 실행 로그, DAG 목록, Task 상태 등을 시각화해서 사용자가 스케줄 관리, 디버깅을 할 수 있도록 사용자 인터페이스를 제공한다.
  • Metadata Database :
    • Scheduler, Executor, Webserver 에서 사용하는 메타데이터가 저장된다.

Why Airflow

Airflow도 마찬가지로 시중에는 다양한 workflow 관리 툴이 존재하고 있지만, Airflow가 특히 강력한 이유를 설명하며, Airflow를 사용해야하는 이유를 알아보고자 한다.

그 전에 먼저 Workflow 관리가 필요한 이유를 한번 더 상기한다.
사실 Workflow 관리는 데이터 엔지니어의 관심 분야일지도 모른다. 하지만 최근에는 ML pipeline이 무거워지고, MLOps의 중요성이 커지면서 데이터 사이언티스트, ML Engineer도 알고 있어야 한다고 생각한다.
이제는 복잡한 ML pipeline에서 하나의 Task가 실패하면, 뒤에 여러 생산성에 큰 영향을 미치고 구조 자체가 매우 복잡하기 때문에, 특정 부분의 에러 핸들링이 매우 어렵기 때문에 workflow 관리가 필요하다.

그렇다면 Airflow는 어떤 장점이 있을까?

  • 코드 기반 정의:
    • 워크플로우를 Python 코드로 정의하여, 복잡한 논리와 조건을 쉽게 구현
    • 이는 YAML이나 JSON 같은 정적 구성 파일보다 유연성을 제공
  • DAG (Directed Acyclic Graph):
    • 작업(Task) 간의 의존성을 DAG로 표현하여, 명확하고 직관적으로 워크플로우를 정의
  • 모듈식 설계:
    • Airflow는 모듈식 설계를 통해 쉽게 확장 가능
    • 새로운 Operator, Sensor, Hook 등을 추가하여 다양한 시스템과 통합 가능
  • 플러그인 시스템:
    • 플러그인 시스템을 통해 사용자 정의 기능을 추가할 수 있어, 다양한 요구사항을 충족
      ... 여러 장점들이 있지만, 필자가 생각하기에 가장 큰 장점은 오픈 소스이기 때문에 그 커뮤니티의 크기가 가장 큰 것이 장점이라 생각한다.


출처 : https://towardsdatascience.com/airflow-vs-luigi-vs-argo-vs-mlflow-vs-kubeflow-b3785dd1ed0c

Airflow 활용 기업

오늘의집

Airflow 레퍼런스

https://tkdguq05.github.io/2021/02/21/airflow-basic2/
https://towardsdatascience.com/airflow-vs-luigi-vs-argo-vs-mlflow-vs-kubeflow-b3785dd1ed0c
https://atonlee.tistory.com/196
https://misc.legendu.net/blog/workflow-managing-tools/
https://velog.io/@denver_almighty/Airflow-Airflow%EB%9E%80
https://ankle96.tistory.com/63
https://velog.io/@sophi_e/Airflow-%EA%B8%B0%EC%B4%88-%EA%B0%9C%EB%85%90-%EB%B0%8F-%EC%9E%A5%EB%8B%A8%EC%A0%90


MLflow

MLflow 란?

MLflow는 특별히 Machine learning에 특화되어 있는 도구라고 생각하면 이해하기가 쉽다.
조금 더 정확하게는 머신러닝 라이프사이클을 관리하기 위한 오픈 소스 플랫폼이다.

MLflow 주요 기능

MLflow는 주요 기능만 살펴보면서 간단하게 정리하려고 한다. 이는 개념적인 내용보다는 실제 사용해보면서 이해하는 비중이 더 크다고 생각하기 때문이다. 주요 기능을 살펴보면서 현재 진행하는 프로젝트나, 진행할 프로젝트에 사용해보면 큰 도움이 될 것이라 생각한다.

추적 (Tracking):
MLflow Tracking은 매개변수, 코드 버전, 메트릭, 아티팩트 등을 로깅하기 위한 API와 UI를 제공합니다. 중앙 집중식 저장소에서 파라미터, 메트릭, 아티팩트, 데이터 및 환경 구성을 추적하여 팀이 모델의 진화를 이해할 수 있게 합니다. 스크립트, 노트북 또는 기타 환경에서 작업할 때 결과를 로컬 파일이나 서버에 로깅하여 여러 사용자 간의 다양한 실행 결과를 쉽게 비교할 수 있습니다.

모델 레지스트리 (Model Registry):
모델 관리를 체계적으로 할 수 있도록 돕는 Model Registry는 모델의 다양한 버전을 관리하고 현재 상태를 확인하며, 원활한 프로덕션화를 보장합니다. 중앙 집중식 모델 저장소, API 및 UI를 제공하여 모델의 전체 라이프사이클을 협업적으로 관리합니다. 여기에는 모델 계보, 버전 관리, 별칭, 태그 및 주석이 포함됩니다.

LLM을 위한 MLflow 배포 (MLflow Deployments for LLMs):
표준화된 API 세트를 갖춘 이 서버는 SaaS 및 오픈 소스 LLM 모델에 대한 액세스를 간소화합니다. 인증된 액세스를 통해 보안을 강화하고, 주요 LLM을 위한 공통 API 세트를 제공합니다.

평가 (Evaluate):
모델을 깊이 있게 분석하기 위한 도구 모음으로, 전통적인 ML 알고리즘이나 최첨단 LLM을 객관적으로 비교할 수 있도록 합니다.

프롬프트 엔지니어링 UI (Prompt Engineering UI):
프롬프트 엔지니어링을 위한 전용 환경으로, 프롬프트 실험, 개선, 평가, 테스트 및 배포를 위한 공간을 제공합니다.

레시피 (Recipes):
ML 프로젝트 구조를 안내하는 레시피는 현실적인 배포 시나리오에 최적화된 기능적 결과를 보장하기 위해 권장 사항을 제공합니다.

프로젝트 (Projects):
MLflow Projects는 ML 코드, 워크플로우 및 아티팩트를 패키징하여 표준화합니다. 각 프로젝트는 코드가 포함된 디렉토리나 Git 저장소로, 종속성과 실행 방법을 정의하는 서술자나 규칙을 사용합니다.

MLflow를 사용하는 가장 큰 이유 : Tracking

하이퍼 파라미터 튜닝을 하거나, 다양한 시나리오에서 모델을 훈련시키다 보면, 다양한 시나리오의 모델 파라미터들이 로컬에 쌓이는 경우가 있었는데, 이런 경우 나중에는 어떤 시나리오에서의 파라미터인지 전혀 구분할 수 가 없어서 결국은 다시 훈련시킨 경험이 있다. 모델의 훈련은 매우 큰 비용이 발생하는 것이기 때문에 모델의 관리와 추적은 매우 중요하다고 생각한다. 그런 방면에서 MLflow를 사용하면 쉽게 관리할 수 있다.

MLflow 레퍼런스

https://mlflow.org/docs/latest/index.html


Databricks

Databricks란?

데이터브릭스(Databricks)는 클라우드 기반 데이터 엔지니어링, 데이터 사이언스, 데이터 분석 및 머신러닝 워크플로우를 지원하는 통합 데이터 플랫폼

데이터브릭스는 Databricks Data Intelligence platform을 통해서 데이터 엔지니어, 데이터 분석가, 데이터 사이언티스트와 같은 서로 다른 작업 주체가 쉽게 협업할 수 있도록 지원하는 통합 데이터 플랫폼이다.

앞에서 이야기한 Spark, Airflow, MLflow는 서로 다른 플랫폼이기 때문에, 이 모든 것들을 한 곳에서 통합해서 사용하기란 쉽지가 않다. 이를 쉽게 만들어주는 것이 데이터브릭스이고, 통합 플랫폼을 사용하면, 노트북으로 쉽게 원하는 프로젝트를 개발하고, 각 작업 주체와 쉽게 협업할 수 있는 장점이 있다.