Apache Spark 란 무엇입니까? Hadoop을 무너 뜨린 빅 데이터 플랫폼

Apache Spark 정의

Apache Spark는 매우 큰 데이터 세트에 대한 처리 작업을 신속하게 수행 할 수있는 데이터 처리 프레임 워크이며, 데이터 처리 작업을 자체적으로 또는 다른 분산 컴퓨팅 도구와 함께 여러 컴퓨터에 분산 할 수도 있습니다. 이 두 가지 특성은 빅 데이터 및 머신 러닝 세계의 핵심이며, 대규모 데이터 저장소를 처리하기 위해 방대한 컴퓨팅 성능을 마샬링해야합니다. Spark는 또한 분산 컴퓨팅 및 빅 데이터 처리의 번거로운 작업을 추상화하는 사용하기 쉬운 API를 통해 개발자의 어깨에서 이러한 작업의 프로그래밍 부담을 덜어줍니다.

2009 년 UC Berkeley의 AMPLab에서 시작된 겸손한 시작부터 Apache Spark는 전 세계의 주요 빅 데이터 분산 처리 프레임 워크 중 하나가되었습니다. Spark는 다양한 방법으로 배포 할 수 있으며 Java, Scala, Python 및 R 프로그래밍 언어에 대한 기본 바인딩을 제공하며 SQL, 스트리밍 데이터, 기계 학습 및 그래프 처리를 지원합니다. 은행, 통신 회사, 게임 회사, 정부 및 Apple, Facebook, IBM 및 Microsoft와 같은 모든 주요 기술 대기업에서 사용하고 있습니다.

Apache Spark 아키텍처

기본 수준에서 Apache Spark 애플리케이션은 두 가지 주요 구성 요소로 구성됩니다. 사용자의 코드를 작업자 노드에 배포 할 수있는 여러 작업으로 변환 하는 드라이버 와 해당 노드에서 실행되고 할당 된 작업을 실행하는 실행기 입니다. 둘 사이를 중재하려면 어떤 형태의 클러스터 관리자가 필요합니다.

기본적으로 Spark는 클러스터의 각 머신에 Apache Spark 프레임 워크와 JVM이 필요한 독립형 클러스터 모드에서 실행할 수 있습니다. 그러나 더 강력한 리소스 또는 클러스터 관리 시스템을 활용하여 필요에 따라 작업자를 할당하는 것이 더 좋습니다. 기업에서 이는 일반적으로 Hadoop YARN에서 실행됨을 의미하지만 (Cloudera 및 Hortonworks 배포판이 Spark 작업을 실행하는 방법) Apache Spark는 Apache Mesos, Kubernetes 및 Docker Swarm에서도 실행할 수 있습니다.

관리 형 솔루션을 찾고 있다면 Amazon EMR, Google Cloud Dataproc 및 Microsoft Azure HDInsight의 일부로 Apache Spark를 찾을 수 있습니다. Apache Spark의 창립자를 고용 한 회사 인 Databricks는 Apache Spark 클러스터, 스트리밍 지원, 통합 웹 기반 노트북 개발 및 최적화 된 클라우드 I / O 성능을 제공하는 포괄적 인 관리 서비스 인 Databricks 통합 분석 플랫폼도 제공합니다. 표준 Apache Spark 배포.

Apache Spark는 사용자의 데이터 처리 명령을 Directed Acyclic Graph 또는 DAG 로 빌드합니다 . DAG는 Apache Spark의 스케줄링 계층입니다. 어떤 작업이 어떤 노드에서 어떤 순서로 실행되는지 결정합니다.  

Spark vs. Hadoop : 왜 Apache Spark를 사용합니까?

Apache Spark와 Apache Hadoop이 약간 잘못된 이름이라는 점을 지적 할 가치가 있습니다. 요즘 대부분의 Hadoop 배포판에 Spark가 포함되어 있습니다. 그러나 두 가지 큰 장점으로 인해 Spark는 빅 데이터를 처리 할 때 선택하는 프레임 워크가되어 Hadoop을 눈에 띄게 만든 기존 MapReduce 패러다임을 넘어 섰습니다.

첫 번째 장점은 속도입니다. Spark의 인 메모리 데이터 엔진은 특정 상황에서 특히 단계간에 디스크에 상태를 다시 기록해야하는 다단계 작업과 비교할 때 MapReduce보다 최대 100 배 빠르게 작업을 수행 할 수 있음을 의미합니다. 본질적으로 MapReduce는 데이터 매핑 및 축소로 구성된 2 단계 실행 그래프를 생성하는 반면 Apache Spark의 DAG에는보다 효율적으로 배포 할 수있는 여러 단계가 있습니다. 데이터가 메모리 내에 완전히 포함될 수없는 Apache Spark 작업조차도 MapReduce 대응 작업보다 약 10 배 빠른 경향이 있습니다.

두 번째 장점은 개발자 친화적 인 Spark API입니다. Spark의 속도 향상만큼이나 중요한 것은 Spark API의 친근 함이 훨씬 더 중요하다고 주장 할 수 있습니다.

스파크 코어

MapReduce 및 기타 Apache Hadoop 구성 요소와 비교할 때 Apache Spark API는 개발자에게 매우 친숙하며 단순한 메서드 호출 뒤에 분산 처리 엔진의 복잡성을 대부분 숨 깁니다. 이것의 표준적인 예는 문서에서 단어 수를 계산하는 거의 50 줄의 MapReduce 코드를 아파치 스파크의 몇 줄로 줄일 수 있다는 것입니다 (여기에서는 Scala에 표시됨).

val textFile = sparkSession.sparkContext.textFile (“hdfs : /// tmp / words”)

val counts = textFile.flatMap (line => line.split (““))

                      .map (단어 => (단어, 1))

                      .reduceByKey (_ + _)

counts.saveAsTextFile (“hdfs : /// tmp / words_agg”)

Apache Spark는 Python 및 R과 같은 데이터 분석을 위해 널리 사용되는 언어와보다 엔터프라이즈 친화적 인 Java 및 Scala에 대한 바인딩을 제공함으로써 애플리케이션 개발자부터 데이터 과학자에 이르기까지 모든 사람이 액세스 가능한 방식으로 확장 성과 속도를 활용할 수 있도록합니다.

스파크 RDD

Apache Spark의 중심에는 컴퓨팅 클러스터에서 분할 할 수있는 변경 불가능한 개체 컬렉션을 나타내는 프로그래밍 추상화 인 RDD (Resilient Distributed Dataset)의 개념이 있습니다. RDD에 대한 작업은 클러스터로 분할되고 병렬 배치 프로세스로 실행되어 빠르고 확장 가능한 병렬 처리가 가능합니다.

RDD는 간단한 텍스트 파일, SQL 데이터베이스, NoSQL 저장소 (예 : Cassandra 및 MongoDB), Amazon S3 버킷 등에서 생성 할 수 있습니다. 대부분의 Spark Core API는이 RDD 개념을 기반으로 구축되어 기존 맵을 활성화하고 기능을 줄이면서도 데이터 세트 결합, 필터링, 샘플링 및 집계에 대한 기본 지원을 제공합니다.

Spark는 Spark 애플리케이션을 작업으로 분할하고 작업 을 수행하는 여러 실행기 프로세스에 분산 시키는 드라이버 코어 프로세스를 결합하여 분산 방식으로 실행 됩니다. 이러한 실행기는 애플리케이션의 필요에 따라 확장 및 축소 할 수 있습니다.

Spark SQL

원래 Shark로 알려진 Spark SQL은 Apache Spark 프로젝트에서 점점 더 중요해졌습니다. 오늘날의 개발자가 응용 프로그램을 만들 때 가장 일반적으로 사용하는 인터페이스입니다. Spark SQL은 R 및 Python (Pandas)에서 차용 한 데이터 프레임 접근 방식을 사용하여 구조화 된 데이터 처리에 중점을 둡니다. 그러나 이름에서 알 수 있듯이 Spark SQL은 데이터 쿼리를위한 SQL2003 호환 인터페이스를 제공하여 Apache Spark의 힘을 분석가와 개발자에게 제공합니다.

표준 SQL 지원과 함께 Spark SQL은 기본적으로 지원되는 JSON, HDFS, Apache Hive, JDBC, Apache ORC 및 Apache Parquet을 포함한 다른 데이터 저장소에서 읽고 쓰기위한 표준 인터페이스를 제공합니다. Apache Cassandra, MongoDB, Apache HBase 등 다른 인기있는 스토어는 Spark 패키지 에코 시스템에서 별도의 커넥터를 가져와 사용할 수 있습니다.

데이터 프레임에서 일부 열을 선택하는 것은 다음과 같이 간단합니다.

도시 DF.select ( "이름", "팝")

SQL 인터페이스를 사용하여 데이터 프레임을 임시 테이블로 등록한 후 이에 대해 SQL 쿼리를 실행할 수 있습니다.

cityDF.createOrReplaceTempView ( "cities")

spark.sql ( "이름 선택, 도시에서 팝")

이면에서 Apache Spark는 데이터 및 쿼리를 검사하는 Catalyst라는 쿼리 최적화 프로그램을 사용하여 데이터 지역 성과 클러스터 전체에서 필요한 계산을 수행하는 계산을위한 효율적인 쿼리 계획을 생성합니다. Apache Spark 2.x 시대에는 데이터 프레임 및 데이터 세트의 Spark SQL 인터페이스 (기본적으로 컴파일 타임에 정확성을 확인하고 런타임에 추가 메모리 및 컴퓨팅 최적화를 활용할 수있는 형식화 된 데이터 프레임)이 개발에 권장되는 접근 방식입니다. . RDD 인터페이스는 계속 사용할 수 있지만 Spark SQL 패러다임 내에서 요구 사항을 해결할 수없는 경우에만 권장됩니다.

Spark 2.4는 배열 및 기타 고차 데이터 유형을 직접 조작하기위한 기본 제공 고차 함수 세트를 도입했습니다.

Spark MLlib

Apache Spark는 또한 대규모 데이터에 기계 학습 및 그래프 분석 기술을 적용하기위한 라이브러리를 번들로 제공합니다. Spark MLlib에는 기계 학습 파이프 라인을 생성하기위한 프레임 워크가 포함되어있어 모든 구조화 된 데이터 세트에서 기능 추출, 선택 및 변환을 쉽게 구현할 수 있습니다. MLlib는 사용자 지정 파이프 라인에서 쉽게 교체 할 수있는 k- 평균 클러스터링 및 임의 포리스트와 같은 클러스터링 및 분류 알고리즘의 분산 구현과 함께 제공됩니다. R 또는 Python을 사용하여 Apache Spark에서 데이터 과학자가 모델을 학습하고 MLlib를 사용하여 저장 한 다음 프로덕션 사용을 위해 Java 기반 또는 Scala 기반 파이프 라인으로 가져올 수 있습니다.

Spark MLlib는 분류, 회귀, 클러스터링 및 필터링을 포함한 기본 기계 학습을 다루지 만 심층 신경망 모델링 및 훈련을위한 기능은 포함하지 않습니다 (자세한 내용은의 Spark MLlib 검토 참조). 그러나 딥 러닝 파이프 라인이 작동 중입니다.

Spark GraphX

Spark GraphX는 Google의 PageRank 구현을 포함하여 그래프 구조를 처리하기위한 다양한 분산 알고리즘과 함께 제공됩니다. 이러한 알고리즘은 데이터 모델링에 Spark Core의 RDD 접근 방식을 사용합니다. GraphFrames 패키지를 사용하면 그래프 쿼리를위한 Catalyst 최적화 프로그램을 활용하는 등 데이터 프레임에서 그래프 작업을 수행 할 수 있습니다.

스파크 스트리밍

Spark Streaming은 Apache Spark에 초기에 추가되어 실시간 또는 거의 실시간 처리가 필요한 환경에서 견인력을 얻도록 도와주었습니다. 이전에는 Apache Hadoop 세계에서 일괄 처리와 스트림 처리가 별개였습니다. 일괄 처리 요구 사항에 맞게 MapReduce 코드를 작성하고 실시간 스트리밍 요구 사항에 Apache Storm과 같은 것을 사용합니다. 이로 인해 완전히 다른 프레임 워크를 기반으로하고, 다른 리소스가 필요하고, 실행을위한 다양한 운영 문제가 포함되어 있음에도 불구하고 애플리케이션 도메인에 대해 동기화 상태를 유지해야하는 이질적인 코드베이스가 발생합니다.

Spark Streaming은 스트림을 연속적인 일련의 마이크로 배치로 분할하여 Apache Spark API를 사용하여 조작 할 수있는 일괄 처리의 Apache Spark 개념을 스트리밍으로 확장했습니다. 이러한 방식으로 일괄 및 스트리밍 작업의 코드는 동일한 프레임 워크에서 실행되는 동일한 코드를 (대부분) 공유 할 수 있으므로 개발자와 운영자의 오버 헤드를 모두 줄일 수 있습니다. 모두가 이깁니다.

Spark Streaming 접근 방식에 대한 비판은 들어오는 데이터에 대한 짧은 대기 시간 응답이 필요한 시나리오에서 마이크로 배칭이 Apache Storm, Apache Flink 및 Apache Apex와 같은 다른 스트리밍 가능 프레임 워크의 성능과 일치하지 않을 수 있다는 것입니다. 모두 마이크로 배치가 아닌 순수한 스트리밍 방법을 사용합니다.

구조적 스트리밍

구조적 스트리밍 (Spark 2.x에 추가됨)은 Spark Streaming에 Spark SQL이 Spark Core API에 있었던 것입니다. 애플리케이션 작성을위한 상위 수준 API 및 더 쉬운 추상화입니다. Structure Streaming의 경우 상위 수준 API를 통해 개발자는 기본적으로 무한 스트리밍 데이터 프레임 및 데이터 세트를 만들 수 있습니다. 또한 사용자가 이전 프레임 워크에서 특히 이벤트 시간 집계 및 늦은 메시지 전달 처리와 관련하여 어려움을 겪었던 몇 가지 실제 문제를 해결합니다. 구조화 된 스트림에 대한 모든 쿼리는 Catalyst 쿼리 최적화 프로그램을 거치며 대화 형 방식으로 실행될 수도 있으므로 사용자가 라이브 스트리밍 데이터에 대해 SQL 쿼리를 수행 할 수 있습니다.

Structured Streaming은 원래 스트리밍 데이터를 처리하는 Spark Streaming의 마이크로 배칭 체계에 의존했습니다. 그러나 Spark 2.3에서 Apache Spark 팀은 대기 시간이 짧은 연속 처리 모드를 Structured Streaming에 추가하여 1ms의 짧은 대기 시간으로 응답을 처리 할 수 ​​있습니다. 이는 매우 인상적입니다. Spark 2.4부터 연속 처리는 여전히 실험적인 것으로 간주됩니다. Structured Streaming은 Spark SQL 엔진을 기반으로 구축되지만 Continuous Streaming은 제한된 쿼리 집합 만 지원합니다.

Structured Streaming은 플랫폼을 사용하는 스트리밍 애플리케이션의 미래이므로 새로운 스트리밍 애플리케이션을 구축하는 경우 Structured Streaming을 사용해야합니다. 레거시 Spark Streaming API는 계속 지원되지만 새로운 방법으로 스트리밍 코드를 작성하고 유지 관리하는 것이 훨씬 더 견고 해 지므로 프로젝트는 Structured Streaming으로 이식 할 것을 권장합니다.

딥 러닝 파이프 라인

Apache Spark는 딥 러닝 파이프 라인을 통해 딥 러닝을 지원합니다. MLlib의 기존 파이프 라인 구조를 사용하면 단 몇 줄의 코드로 하위 수준의 딥 러닝 라이브러리를 호출하고 분류기를 구성 할 수있을뿐만 아니라 사용자 지정 TensorFlow 그래프 또는 Keras 모델을 수신 데이터에 적용 할 수 있습니다. 이러한 그래프와 모델은 사용자 지정 Spark SQL UDF (사용자 정의 함수)로 등록 할 수도 있으므로 딥 러닝 모델을 SQL 문의 일부로 데이터에 적용 할 수 있습니다.

Apache Spark 자습서

Apache Spark에 뛰어들 준비가 되셨습니까? Evan Heitman의 A Neanderthal 's Guide to Apache Spark in Python을 적극 권장합니다.이 가이드는 Apache Spark가 상대적으로 간단한 용어로 작동하는 방법에 대한 기본 사항을 설명 할뿐만 아니라 프레임 워크를 사용하는 간단한 Python 애플리케이션을 작성하는 과정을 안내합니다. . 이 기사는 데이터 과학자의 관점에서 작성되었으며, 이는 데이터 과학이 빅 데이터와 머신 러닝이 점점 더 중요 해지고있는 세상이기 때문에 의미가 있습니다.

플랫폼이 수행 할 수있는 작업과 수행 방법에 대한 이해를 제공하는 Apache Spark 예제를 찾고 있다면 Spark By {Examples}를 확인하십시오. 여기에는 Spark 프로그래밍의 빌딩 블록을 구성하는 여러 기본 작업에 대한 샘플 코드가 많이 있으므로 Apache Spark가 만든 더 큰 작업을 구성하는 구성 요소를 볼 수 있습니다.

더 깊이 들어가야하나요? DZone에는 많은 Apache Spark 주제에 대한 많은 유용한 자습서로 구성된 완전한 Apache Spark 컬렉션이라고 겸손하게 언급하는 내용이 있습니다. 즐거운 학습 되세요!