스파크는 무엇이고 왜 쓰는지?

스파크란?


기존 애플리케이션은 단일 프로세서에서 실행되도록 설계되었습니다.

문제는 데이터 양이 시간이 지날수록 기하급수적으로 증가한다는 점입니다.

방열의 물리적 한계 때문에하드웨어 성능의 향상은 중지되었다는 것입니다.

단일 프로세서의 성능을 높이는 대신 개발자는 여러 CPU 코어를 병렬로 추가하기로 결정했습니다.

이미 데이터는 날이 갈수록 커지고 결국 너무 커서 더 이상 클러스터에서 처리할 방법이 없습니다.

스파크가 이 문제를 해결한 것 같습니다.

병렬 데이터 처리를 위한 오픈 소스 라이브러리 엔진보지마. Spark는 클러스터 환경에서 데이터의 병렬 처리를 지원합니다.

단일 랩톱 환경에서 실행할 수 있지만 수천 대의 서버로 구성된 거대한 클러스터에서도 실행할 수 있습니다.


스파크에 대한 기본적인 이해

스파크의 기본 아키텍처

컴퓨터 클러스터는 단일 컴퓨터로 사용할 수 있도록 여러 컴퓨터의 리소스 모음입니다.

클러스터를 구성한 후에는 클러스터의 작업을 조율할 수 있는 프레임워크가 필요하며 이를 수행하는 프레임워크는 Spark입니다.

스파크 애플리케이션 드라이버 프로세스무리와 함께 실행자 프로세스구성됩니다.

드라이버 프로세스는 클러스터 노드 중 하나에서 실행되고 main() 함수를 실행합니다.

소송 절차 작품
드라이버 프로세스 Spark 앱 유지 관리, 사용자 프로그램 또는 입력에 대한 응답, 배포 및 예약과 같은 필수 작업
실행 프로세스 드라이버 프로세스에서 할당한 작업을 수행합니다.


독립 실행형 Spark 클러스터


Sparks 음성 API

다른 프로그래밍 언어로 Spark 코드를 실행할 수 있습니다.

개발자 커뮤니티에서 가장 추천하는 언어는 Scala와 Python입니다.

Spark는 Scala로 개발되었고 Scala는 Spark의 모국어이기 때문입니다.

또한 Python은 데이터 과학에서 가장 많이 사용되는 언어이기 때문에 DS 및 DE 학습 비용을 줄일 수 있는 장점이 있습니다.

Python Spark에는 Scala Spark가 있습니다.

이를 지원하는 거의 모든 구조를 지원합니다.


스파크 시작

SparkSession

Spark 세션은 위에서 설명한 드라이버 프로세스를 나타냅니다.

Spark 세션은 클러스터에서 사용자 지정 처리 명령을 실행합니다.

pyspark로 spark를 실행하여 명령을 실행하려고 했습니다.

spark

spark.range(1000)


열에 1000개의 숫자가 있는 DataFrame이 생성되었습니다.

클러스터 모드에서 이 명령을 실행하면

이 데이터 프레임의 데이터는 분할되어 각각 n개의 실행기에 할당됩니다.


데이터 프레임

위에서 만든 데이터 프레임을 자세히 살펴보겠습니다.

데이터 프레임은 테이블 데이터를 행과 열로 간단하게 표현한 것입니다.

Spark 데이터 프레임은 수천 대의 시스템에 분산될 수 있습니다.

대량의 빅데이터를 처리할 때 데이터를 하나의 디바이스로 처리하는 것보다 클러스터에서 실행 프로세스로 나누어 처리하는 것이 훨씬 빠릅니다.

DataFrame은 Python 고유의 개념입니다.

Pandas와 같은 라이브러리를 사용해 본 적이 있다면 DataFrame의 개념에 이미 익숙할 것입니다.

그러나 Py-spark로 구현되지 않은 Python 데이터 프레임은 여러 시스템에 분산 및 처리될 수 없으며 단일 시스템에만 존재할 수 있습니다.

유사한 API로 Java 및 Scala에서 사용되는 Dataset도 있습니다.

Scala에서는 데이터 세트(T)로 작성됩니다.

데이터 세트의 장점은 유형 안전성을 보장한다는 것입니다.

데이터셋에서 불러온 데이터의 형식이 이전에 정의한 T 클래스와 다른 경우 오류가 발생합니다.



분할

Spark는 어떤 단위로 데이터 프레임을 각 실행기로 나눕니까?

분할데이터를 이라는 청크로 나눕니다.

예를 들어, 이와 같은 데이터 프레임이 있는 경우,

성별 혈액형
이사라 여자 같은
박연진 여자 같은 영형
최혜정 여자 같은
전재준 남성

파티션을 “성별” 열로 설정하면,

이 데이터 프레임은 여성 성별 데이터 세트와 남성 성별 데이터 세트의 두 데이터 세트로 나뉩니다.

파티션을 “혈액형” 열로 설정하면,

이 데이터 프레임은 혈액형이 A인 데이터 세트로 구성되어 있으며, 혈액형 O 3개의 기록으로 나뉩니다: 1개의 기록, 1개의 혈액형 B형 기록.

하지만 이 데이터의 범위가 크게 확장되었습니다… 5천만 명의 데이터가 있다고 가정해 보겠습니다.

그러나 성별을 파티션으로 설정하면 남성과 여성 두 명의 실행자만 생성되므로 Spark에 수천 명의 실행자가 있어도 두 명의 실행자만 데이터를 받습니다.

물론 반대로 수백 개의 파티션이 있더라도 executor가 하나만 있으면 데이터는 필연적으로 하나의 executor에 맞아야 합니다.

Spark는 이를 위해 내부 논리를 사용합니다.

물리적 파티션을 분리하기 때문에 사용자는 많은 주의를 기울일 필요가 없습니다.

(단, 성능 향상이 필요한 경우 repartitioning 등을 이용하여 refactoring을 한다.

)


변환

데이터 프레임을 수정할 때 Spark에 제공하는 명령은 다음과 같습니다.

변환오전.

Spark에서 운영 코드를 작성할 때 이해해야 할 개념

변형의 추상화 인 것 같습니다.

myRange = spark.range(1000).toDF("number")
divisBy2 = myRange.where("number % 2 = 0") # Transformation executed

2행에서 변환 코드를 실행해도 결과가 출력되지 않는다.

왜냐하면… 내 주문이 아직 실행되지 않았기 때문입니다.

메모리에 실행계획으로 꾸준히 쌓였을 뿐…

내가 조치를 취하지 않으면 Spark는 실제로 변환을 수행하지 않습니다.

나중에 설명하는 동작은 결과를 계산하는 명령입니다.

전형적인 카운트()가 있습니다.

Spark는 일부 작업이 발생할 때까지 실행 계획(쿼리)을 계속 작성합니다.

작업이 발생하기 전 마지막 순간까지 최적화된 실행 계획을 계속 생성합니다.

중요한: *변환은 필요할 때만 이루어집니다!
*


행동

사용자가 변환을 통해 실행 계획 작성을 진행한 후 실제 작업을 수행하려면 조치 명령을 내려야 합니다.

조치는 결과가 실제로 필요한 순간에 발행되는 명령입니다.


count()를 실행한 다음 결과를 인쇄했습니다.

– 스파크에서의 액션 –

행 수 출력 – count()

콘솔에 데이터를 표시하는 작업 – show()

출력, 액션 저장

각 언어의 네이티브 개체에서 데이터를 수집하는 작업


저수준 API RDD

RDD는 객체를 처리하는 데 필요한 기본 함수 API를 포함하는 라이브러리입니다.

실제로 Spark의 거의 모든 것이 RDD 위에 구축됩니다.

그러나 RDD는 저수준이고 이해하기 어려우므로 실제 코드에서는 Spark 사용자가 사용할 수 있는 고수준 구조 API를 사용하는 것이 좋습니다.

다음과 같이 세밀한 제어가 절대적으로 필요한 경우가 아니면 B. 파티션과 같은 물리적 실행 특성 변경,

RDD는 권장되지 않습니다.


스파크 UI

로컬에서 Spark를 실행하고 http://localhost:4040에 접속하면 Spark 작업 상태, 환경 설정, 클러스터 상태 등의 정보를 확인할 수 있습니다.



다른 스파크 게시물 보기

업데이트…