Spark 알아보기
Spark는 데이터 처리 엔진의 핵심으로, 데이터 엔지니어가 분산 시스템에서 대규모 데이터 세트를 효율적으로 추출, 변환 및 분석할 수 있도록 합니다. 이를 차별화하는 것은 하나의 프레임워크에서 다양한 유형의 데이터 워크로드를 통합하는 기능입니다. Spark를 사용하면 실시간 스트리밍, 일괄 처리, SQL 쿼리 또는 기계 학습을 위해 별도의 시스템이 필요하지 않습니다. 모든 작업은 일관된 API 집합을 사용하여 Spark에서 수행할 수 있습니다.
또 다른 강점은 사용 편의성입니다. Spark는 Python, Java, Scala 및 R을 비롯한 여러 프로그래밍 언어를 지원합니다. Python에 이미 익숙한 경우 Spark용 Python 인터페이스인 PySpark를 사용하여 데이터 분석을 즉시 시작할 수 있습니다.
가장 중요한 것은 Spark가 확장성을 염두에 두고 빌드되었다는 것입니다. 로컬 컴퓨터에서 실험을 시작한 다음 코드를 변경하지 않고 수백 또는 수천 대의 컴퓨터 클러스터에서 동일한 애플리케이션을 실행할 수 있습니다.
Spark의 에코시스템
사람들은 종종 Spark에 대해 하나의 것으로 이야기하지만, 실제로는 핵심 엔진을 기반으로 구축된 라이브러리의 에코시스템입니다.
Spark Core 는 작업 예약, 메모리 관리 및 오류 복구를 포함하여 분산 컴퓨팅을 위한 토대를 제공합니다.
Spark SQL 을 사용하면 대부분의 분석가가 이미 알고 있는 언어인 SQL을 사용하여 구조화된 데이터를 사용할 수 있습니다. 또한 Hive, Parquet 및 JSON과 같은 외부 데이터 원본과 통합됩니다.
Spark Streaming 을 사용하면 거의 실시간으로 데이터를 처리할 수 있으므로 사기 감지 또는 시스템 로그 모니터링과 같은 애플리케이션에 유용합니다.
MLlib 는 Spark의 기계 학습 라이브러리입니다. 분류, 클러스터링, 회귀 및 권장 사항에 대한 알고리즘의 확장 가능한 구현을 제공합니다.
GraphX 는 소셜 네트워크 분석 또는 엔터티 간의 관계 모델링과 같은 그래프 계산에 사용됩니다.
이러한 구성 요소는 Spark를 대부분의 빅 데이터 문제에 대한 원스톱 솔루션으로 만듭니다.
Spark 작동 방식
처음에 Spark 프로그램을 작성하는 이유는 무엇인가요? 대답은 규모입니다. 데이터 세트가 너무 커서 단일 컴퓨터의 메모리에 맞지 않거나 Pandas 또는 Excel과 같은 기존 도구보다 훨씬 빠르게 완료하기 위해 계산이 필요한 경우 Spark가 단계를 수행합니다. Spark를 사용하면 로컬 데이터 작업과 매우 유사한 코드를 작성할 수 있지만 클러스터의 여러 머신에서 자동으로 작동하는 코드를 배포합니다. 그 결과 데이터 세트가 증가할 때마다 논리를 다시 작성하지 않고도 기가바이트, 테라바이트 또는 페타바이트 단위의 데이터를 분석할 수 있습니다.
회사에서 Azure Data Lake Storage에 웹 사이트 클릭스트림 데이터를 저장한다고 가정합니다. 지난 24시간 동안의 모든 클릭을 필터링하고 사용자 프로필 테이블에 조인한 다음 가장 많이 방문한 상위 5개 제품 범주를 계산하여 고객 동작을 이해하려고 합니다.
Databricks에서 이를 구현할 때 발생하는 작업은 다음과 같습니다.
Notebook에는 Python(PySpark)에서 작성한 코드가 포함되어 있으며 드라이버 프로그램에서 실행됩니다. 드라이버는 높은 수준의 명령(예: 행 필터링 또는 데이터 그룹화)을 더 작은 작업 계획으로 전환할 책임이 있습니다.
그런 다음 클러스터 관리자는 이러한 작업을 다른 실행기에 할당합니다. 각 실행기는 클러스터의 컴퓨터에서 실행되는 작업자 프로세스입니다. Apache Spark 클러스터는 단일 컴퓨팅 엔진으로 처리되고 Notebook에서 발급된 명령의 실행을 처리하는 상호 연결된 서버 그룹입니다. 하나의 실행기가 사용자 ID 1~100,000에 대한 어제 클릭을 필터링할 수 있고, 다른 실행기는(동일하거나 다른 서버에서) ID 100,001~200,000에 대한 클릭을 필터링할 수 있습니다.
모든 실행기가 작업 부분을 완료하면 Spark는 결과를 수집하고 결합하며 상위 제품 범주를 보여 주는 깨끗한 DataFrame을 다시 제공합니다.
데이터 엔지니어의 관점에서 보면 Databricks Notebook에서 친숙한 DataFrame 코드를 작성하기만 하면 됩니다. Spark는 데이터 배포, 계산 병렬 처리 및 클러스터에서 오류가 발생하는 경우 작업을 다시 시도합니다. 이 설계는 Spark를 사용자가 다루기 쉬운 로컬 데이터 도구처럼 느껴지게 하지만, 내부에서는 수백 대의 컴퓨터에 걸쳐 매우 병렬적이고 내결함성이 있는 계산을 오케스트레이션합니다.
지연 평가 및 DAG
Spark의 가장 중요한 디자인 선택 중 하나는 지연 평가입니다. 각 작업이 즉시 실행되는 Pandas와 같은 도구와 달리 Spark는 명령을 작성하는 즉시 실행하지 않습니다. 대신 행 필터링, 테이블 조인 또는 열 선택과 같은 변환을 적용할 때 Spark는 이러한 작업을 계획에 기록하기만 하면 됩니다. 아무것도 실제로 아직 계산되지 않습니다. 이 방법을 사용하면 Spark에서 가장 효율적인 실행 방법을 결정하기 전에 전체 작업 시퀀스를 살펴볼 수 있습니다.
백그라운드에서 Spark는 작업의 DAG(Directed Acyclic Graph) 를 빌드합니다. 그래프의 각 노드는 데이터 세트를 나타내고 각 에지는 해당 데이터 세트에 적용된 변환을 나타냅니다. 그래프가 비순환적이기 때문에 원시 입력 데이터에서 최종 결과로 자신에게 되돌아가지 않고 한 방향으로 흐릅니다. Spark의 최적화 프로그램은 이 DAG를 분석하여 단계를 결합하고, 데이터 이동을 최소화하며, 클러스터 전체에서 최상의 실행 전략을 결정합니다.
실행은 드라이버에 결과 수집, 스토리지에 데이터 쓰기 또는 행 계산과 같은 작업을 수행할 때만 시작됩니다. 이 시점에서 Spark는 최적화된 DAG를 일련의 작업으로 클러스터 관리자에 제출하여 실행기에 분산합니다. 이 디자인은 Spark가 고성능을 달성하는 데 도움이 됩니다. 불필요한 계산을 방지하고, 노드 간의 데이터 순서 섞기를 줄이고, 클러스터 리소스가 가능한 한 효율적으로 사용되도록 합니다.
Real-World 사용 사례
많은 산업의 조직에서는 대규모 또는 빠르게 이동하는 데이터 세트를 처리하고 분석해야 할 때마다 Spark를 사용합니다. 예를 들어 비디오 스트리밍 서비스는 Spark를 사용하여 시청 기록을 기반으로 새 콘텐츠를 제안하는 권장 사항 엔진을 빌드할 수 있습니다. 금융 기관은 Spark Streaming을 사용하여 실시간으로 트랜잭션을 모니터링하고 의심스러운 활동에 플래그를 지정할 수 있습니다. 의료 부문에서 연구원은 Spark를 사용하여 대규모로 유전 데이터를 분석하여 질병과 관련된 패턴을 식별할 수 있습니다. 기존의 비즈니스 설정에서도 Spark는 대시보드 및 보고에 사용할 수 있도록 원시 운영 데이터를 준비하고 변환하는 역할을 하는 경우가 많습니다.
다른 일반적인 애플리케이션으로는 대량의 웹 서버 로그 분석, IoT(사물 인터넷) 디바이스에 대한 실시간 대시보드 전원 공급, 매우 큰 데이터 세트에 대한 기계 학습 모델 학습 , 여러 원본에서 원시 데이터를 추출, 정리 및 결합하는 ETL 파이프라인 빌드 등이 있습니다.
호환성 및 배포 옵션
Spark의 장점 중 하나는 단일 인프라에 잠기지 않는다는 것입니다. 대신 다양한 분산 시스템을 기반으로 실행되도록 설계되어 배포 방법과 위치를 유연하게 활용할 수 있습니다. 가장 간단한 수준에서 Spark는 사용자 고유의 컴퓨터에서 로컬로 실행할 수 있으므로 클러스터를 설정하지 않고도 작은 데이터 세트를 쉽게 실험하거나 기본 사항을 배울 수 있습니다. 더 많은 전력이 필요한 경우 독립 실행형 컴퓨터 클러스터에서 Spark를 실행하여 스케일 아웃하거나 예약 및 리소스 할당을 처리하는 Hadoop YARN 또는 Apache Mesos와 같은 리소스 관리자와 통합할 수 있습니다.
클라우드에서 Spark는 공급자 간에 널리 지원됩니다. 예를 들어 Azure Databricks, Azure Synapse Analytics 및 Microsoft Fabric과 같은 서비스는 클러스터 설정 및 관리의 세부 정보를 걱정하지 않고 Spark 클러스터를 간편하게 시작할 수 있도록 합니다. 또한 조직이 Spark 애플리케이션을 컨테이너화하고 최신 클라우드 네이티브 환경에서 실행할 수 있도록 하는 Kubernetes에 Spark가 점점 더 배포되고 있습니다. 이러한 유연성은 로컬 개발에서 온-프레미스 클러스터, 대규모 클라우드 배포에 이르기까지 요구 사항이 진화함에 따라 다른 플랫폼에 다시 작성하지 않고도 동일한 Spark 애플리케이션을 계속 사용할 수 있음을 의미합니다.