안녕하세요 한소희입니다. 공부를 통해 배운 내용을 작성하고 있습니다. 혹여 해당 포스팅에서 잘못된 부분이 있을 경우, 알려주시면 빠르게 수정 조치하도록 하겠습니다. 감사합니다.
요즘은 Spark 스터디를 진행하고 있다. 빠른 속도로 스터디를 진행 중이기 때문에, 필기 자료 업로드가 조금 늦었다.
이번 Spark 포스팅에서는, 스파크의 개념 및 간단한 기능을 둘러보고 그 내용을 정리/요약해 볼 것이다.
목차
아파치 스파크란?
스파크의 기능 간단히 살펴보기
01. 아파치 스파크란?
1-1. 아파치 스파크란?
통합 컴퓨팅 엔진이다. 즉, 데이터를 병렬로 처리하는 라이브러리의 집합을 뜻한다.
1-2. 스파크가 왜 좋은가?
통합 플랫폼이 제공되기 때문에 기존 분석 작업을 더 쉽게 가능하다. SQL쿼리로 읽고 머신러닝을 해야 하는 경우, 이것을 모두 Spark로 통합할 수 있다.
1-3. 스파크의 등장 배경?
데이터는 늘어나고, 데이터 저장과 수집 성능은 그대로여서 비효율적이었다. 하드웨어 성능을 올리는 것도 발열 이슈 때문에 한계가 있었다. 게다가 데이터 수집에 들어야 할 비용은 점점 저렴해졌다. 따라서 데이터 처리는 더더욱 발전하지 못하는 상황이었고, 이를 해결하기 위해 스파크가 탄생했다.
1-4. 스파크의 기본 아키텍처
클러스터 기반이다. 즉, 여러 컴퓨터 자원을 마치 하나의 컴퓨터처럼 쓴다.
구글링을 하던 중, 스파크의 아키텍처가 잘 나와있는 포스팅이 있어 아래 링크를 공유해두겠다.
https://team-platform.tistory.com/49
이처럼 하나의 드라이버 프로세스와 다수의 익스큐터 프로세스로 구성돼 있다. 그리고 이 드라이버 프로세스와 익스큐터 프로세스는 클러스터 매니저(YARN이나 스파크 스탠드얼론 등)로 관리할 수 있다.
드라이버 프로세스란?
main() 함수를 실행하는 프로세스다. 클러스터 노드 중 하나에서 실행된다. 애플리케이션의 수명주기 동안 관련 정보를 모두 유지하는 프로세스이다.
익스큐터 프로세스란?
드라이버 프로세스가 할당한 작업을 수행한다. 그리고 드라이버 노드에 진행상황을 보고한다. 보통 할당된 스파크코드를 실행하는 역할을 한다.
여기서 잠깐! 익스큐터 수 지정 방법?
사용자가 지정한다. 사용자는 각 노드에 할당할 익스큐터의 수를 지정할 수 있다.
02. 스파크의 기능 간단히 살펴보기
스파크의 기능은 구조적 스트리밍, 고급분석 라이브러리 구조적 API & 저수준 API로 나뉘어 있다.
🔥 여기서 잠깐 ! API란?
프로그램의 상호작용을 돕는 매개체를 뜻한다. 원활한 통신을 돕고, 표준화가 가능하기 때문에 API를 쓴다.
1) private API: private API는 내부 API로, 회사 개발자가 자체 제품과 서비스를 개선하기 위해 내부적으로 발행합니다. 따라서 제삼자에게 노출되지 않는다.
2) public API: public API는 개방형 API로, 모두에게 공개된다. 누구나 제한 없이 API를 사용할 수 있는 게 특징이다.
3) partner API: partner API는 기업이 데이터 공유에 동의하는 특정인들만 사용할 수 있다. 비즈니스 관계에서 사용되는 편이며, 종종 파트너 회사 간에 소프트웨어를 통합하기 위해 사용된다.
2-2. Spark의 Dataframe과 Dataset이란?
공통점: DataFrame과 DataSet은 Raw와 Column을 갖는 분산 테이블 형태의 컬렉션이다.
(스프레드 시트 등은 한 대의 컴퓨터에만 있으므로 단일 컴퓨터 테이블이다.)
DataFrame | DataSet |
비타입형 | 타입형: 초기화에 사용한 클래스 대신 다른 클래스를 사용해 접근할 수 없다. |
타입 일치 여부 런타임에서 확인 | 타입 일치 여부 컴파일 타임에 확인 |
파이썬, 스칼라, 자바에서 사용 가능 | JVM 기반 스칼라, 자바에서만 지원 |
🔥 DataFrame에 대한 추가 설명
가장 효율적이다. 왜냐하면 취급하는 언어가 많기 때문이다.
Pandas의 DataFrame은 단일 컴퓨터에 저장하는 경우가 대개인데, 이를 스파크 DataFrame으로 쉽게 변환할 수 있다.
또한 스파크는 처리를 마치고 DataFrame으로 자동 변환해 반환한다. 하지만 DataSet으로 진행하고 싶다면 언제든 선택적으로 사용할 수 있다.
DataFrame의 장점이 분명한데도, DataSet을 찾는 이유?
타입형이 필요할 때 사용한다.
2-3. Spark의 Partitioning
스파크는 익스큐터 프로세스가 병렬로 작업을 수행할 수 있도록 파티션이라는 단위로 데이터를 분할한다.
따라서, 만약 파티션이 1이라면 수천개의 익스큐터가 있어도 병렬성은 1이 된다. 수백 개의 파티션이 있더라도 익스큐터가 하나라면 그것도 병렬성은 1이다.
2-4. DataFrame 데이터를 조작(변경)하는 방법 - 트랜스포메이션
트랜스포메이션을 이용한다. 스파크의 핵심 데이터 구조는 불변성을 지닌다는 것이기 때문에, 변경을 원할 시 원하는 변경 방법을 스파크에 알려야 한다. 이때 사용하는 명령어가 트랜스포메이션이다.
트랜스포메이션은 스파크에서 비즈니스 로직을 표현하는 핵심 개념이다.
트랜스포메이션의 넓은 의존성과 좁은 의존성
넓은 의존성(셔플) | 각 입력 파티션이 여러 출력 파티션에 영향을 미친다. 스파크가 클러스터에서 파티션을 교환하는 것을 셔플이라고 하고, 이에 해당한다. (셔플 데이터 처리 결과는 디스크에 저장한다.) |
좁은 의존성 | 각 입력 파티션이 하나의 출력 파티션에만 영향을 미친다. (데이터 프레임에서 파이프라이닝 하는 것들은 메모리에 저장한다.) |
2-5. 스파크의 데이터 처리(연산) 방법 - 지연 연산
스파크는 트랜스포메이션을 실행해 논리적 실행 계획을 세운다. 즉 코드를 실행하면 바로 데이터 처리를 하지 않는다. 그 과정을 물리적 실행 계획으로 컴파일한다. 그 후 액션 처리를 한 번에 한다. 액션 처리까지 해야 트랜스포메이션 결괏값을 기반으로 실제 연산을 수행되는 것이다.
🔥 지연연산의 장점?
이를 통해 전체적 데이터 흐름을 최적화한다.
스파크 UI란?
스파크 잡의 진행 상황을 모니터링/튜닝할 때 사용한다.
스파크 잡이란?
개별 액션에 의해 트리거되는 다수의 트랜스포메이션으로 구성된다. UI로 모니터링이 가능하다.
2-6. Spark의 언어 지원
Python, Scala, Java, R 등 다양하다. 이는 연산 시 카탈리스트 엔진이 스파크의 데이터 타입으로 변환해 관리하기 때문에 가능한 것이다. 익스큐터에의 JVM(내의 SparkSession)에서 실행할 수 있는 코드로 변환(컴파일)한다.
Scala가 기본 언어지만, 파이썬은 스칼라가 지원하는 거의 모든 구조를 지원한다는 특징이 있다.
다양한 언어를 지원하는 이유? 스파크는 두 가지 API를 지원하기 때문이다.
이는 추후 더 자세히 포스팅할 것이다.
- 저수준의 API
- 고수준의 API
여기서 잠깐! SparkSession이란?
드라이버 프로세스이며, 스파크 애플리케이션의 제어를 담당한다.
하나의 SparkSession은 하나의 스파크 애플리케이션에 대응한다.
Spark-submit이란?
대화형 셸에서 개발한 프로그램을 운영용 애플리케이션으로 전환할 때 사용한다. 즉, 애플리케이션 코드를 클러스터에 전송해 실행시킨다.
'데이터 공부 > 빅데이터 & 하둡' 카테고리의 다른 글
[책리뷰] 데이터 과학자 원칙 (0) | 2023.07.02 |
---|---|
06. 빅데이터 분석 기반의 구축 (마지막 Chapter) (1) | 2023.06.18 |
05. 워크플로 관리와 데이터 플로우 (0) | 2021.07.08 |
04. 빅데이터의 축적 (0) | 2021.07.07 |
03. CentOS에 Spark 설치 + 에러 해결 (0) | 2021.06.16 |