Spark

[스파크] chap1, chap2 아파치 스파크

Ellie67 2021. 8. 9. 00:44

컴퓨터 클러스터, 그룹 -> 싱글컴퓨터라면 자원들을 모아서 사용할 수 있게 한다. 
싱글 컴퓨터는 파워풀하지 않다. -> 프레임워크 필요

스파크 애플리케이션 -> 클러스터 매니저(스탠드얼론, yarn, 메소스)
클러스터 매니저 -> 우리의 작업을 완료할 수 있도록 애플리케이션에 리소스를 준다.

스파크 애플리케이션 <= 드라이버 프로세스 + 익스큐터 프로세스 집합

드라이버 프로세스(스파크 세션) : 클러스터에 있는 노드 중 하나에서 실행되고, main() 실행 
1. 스파크 애플리케이션에 대한 정보 유지
2. 유저의 프로그램 또는 입력에  응답
3. 익스큐터 작업 분석, 배포, 스케줄링
=> 드라이버 프로세스 필수적(애플리케이션이 돌아가는 동안의 정보 모두 유지)


익스큐터 : 드라이버 프로세스가 할당한 일을 수행할 책임이 있다.
1. 드라이버로부터 할당된 코드 실행
2. 실행의 상태를 드라이버 노드에게 다시 보고

 




스파크 애플리케이션 핵심사항
- 스파크는 사용 가능한 리소스를 추척하는 클러스터 매니저를 사용한다.
- 드라이버 프로세스는 주어진 일을 완료하기 위해서 익스큐터에서 드라이버 프로그램의 명령을 
  실행해야 한다.

유저는 스파크 코드를 실행하는 진입점인 스파크 세션을 이용할 수 있다.

스파크를 다양한 언어로 사용할 수 있는 이유 => 저수준의 비구조적 api, 고수준의 구조적 api

스파크 애플리케이션 개발하려면 유저 명령과 데이터를 스파크 애플리케이션에게 보내는 법을 알아야 함
-> 먼저 스파크 세션을 만들어야 함

스파크를 대화형 모드로 시작하면 자동적으로 스파크 세션을 만든다. 
스탠드얼론 애플리케이션으로 시작하면 사용자 애플리케이션 코드에서 스파크 세션 객체를 생성해야 함

스파크 애플리케이션 통제 => 스파크 세션(드라이버 프로세스)

스파크 세션 인스턴스는 클러스터에서 사용자가 정의한 처리 명령을 실행한다.

스파크 세션과 스파크 애플리케이션 사이에는 일대일 대응이 있다.

스칼라/파이션 콘솔 시작 -> spark 변수로 스파크 세션을 사용할 수 있다.

분산 컬렉션 : 거대한 배열이나 리스트 등의 자료구조

예) 한 개의 컬럼과 1000개의 로우로 구성되고 각 로우에는 0부터 999까지의 값이 할당
=> 이 숫자들은 분산 컬렉션을 나타냄. 클러스터 모드(데이터 파티셔닝 지원하는 모드)에서 
예제 실행하면 숫자 범위의 각 부분이 서로 다른 익스큐터에 할당됨
==> DataFrame 

DataFrame : 구조적 API, 로우와 컬럼으로 테이블의 데이터를 간단하게 나타냄
스키마 : 컬럼과 컬럼의 타입을 정의한 목록

스프레드 시트 VS 스파크 DataFrame
=> 스프레드 시트 : 한 대의 컴퓨터, 특정한 위치에 있다.
=> 스파크 DataFrame : 여러 대의 컴퓨터에 분산되어 있다.-> 데이터가 너무 커, 오랜 시간

R/파이썬의 DataFrame은 단일 컴퓨터에 존재
=> 스파크는 R,파이썬 모두 지원을 하기 때문에 스파크 DataFrame으로 바꿀 수 있다.

파티션 : 스파크는 모든 익스큐터가 병렬적으로 작업을 수행할 수 있도록 파티션으로 데이터를 분할
DataFrame의 파티션은 실행 중에 데이터가 컴퓨터 클러스터에서 물리적으로 분산되는 방식

스파크에서 핵심 데이터 구조: 불변성
한번 생성하면 변경할 수 없다. 

트랜스포메이션 : DataFrame 변경하려면 바꾸기 원하는 방법을 스파크에게 알려줘야 한다.
액션을 호출하지 않으면 스파크는 실제 트랜스포메이션을 실행하지 않는다.
- 좁은 의존성-> 각 입력 파티션은 오직 하나의 출력 파티션에만 영향(where)-파이프라이닝
- 넓은 의존성(셔플:스파크가 클러스터에서 파티션 교환)
  -> 하나의 입력 파티션은 여러 개의 출력 파티션에 영향

지연 연산: 스파크가 연산 그래프를 실행하기 직전까지 기다리는 동작 방식
스파크는 특정 연산 명령이 내려지면 바로 데이터를 수정하지 않고 원시 데이터에 적용할 
트랜스포메이션의 실행 계획을 생성한다. => 전체 데이터 흐름 최적화

트랜스포메이션으로 실행 계획 세움 -> 실제로 연산 수행하려면 액션 명령 필요
액션 : 일련의 트랜스포메이션으로부터 결과를 계산하도록 지시하는 명령
- 콘솔에서 데이터를 보는 액션
- 각 언어로 된 네이티브 객체에 데이터를 모으는 액션
- 출력 데이터 소스에 저장하는 액션

스파크 UI : 클러스터에서 실행 중인 스파크 잡 모니터링

데이터는 스파크 세션의 DataFrameReader 사용해서 읽음

스파크 SQL 사용하면 모든 DataFrame을 테이블이나 뷰(임시 테이블)로 등록한 후 SQL 쿼리
사용할 수 있다.

실행 계획 : 지향성 비순환 그래프(각 단계는 불변성을 가진 신규 DataFrame 생성)
DataFrame 변환 흐름
1. 데이터 읽기 
2. 데이터 그룹화
3. 집계유형 지정하기 위해 sum 메서드(트랜스포메이션) 사용 
   -> 새로운 스키마 정보를 가지는 DataFrame 생성
4. 컬럼명 변경
5. 데이터 정렬