-
Spark 기초1Spark/BASIC 2020. 12. 8. 18:09
기본과정
- 특정 함수 없이 스파크를 이용하면 어떤 일을 할 수 있는지?
- Hadoop, Spart, Data Engineering
실습과정
- 제공 함수 RDD, DataFrame 함수 활용
심화과정
- 함수 호출 시 스파크 내부 동작 구조
---
스파크
- 대용량 데이터 분산 처리 SW
- 별도의 App 없이 대용량 쿼리 수행
- App 구현을 위한 API 제공
장점
- Speed(과장)
- Ease of Use(최고)
- Generality
- Runs Everywhere
예제
- SELECT col_A, col_B, col_C FROM my_table WHERE col_A ...
- col_D를 보고싶다면? 하둡은 Build/Deploy 후 모든 분산 저장소를 다시 전부 조회 해야됨
- MapReduce를 이용해서 orderBy, distinct, join, pivot, takeSample, countApproxyDistinct 를 구현함
- 대용량 데이터 중복 제거 - 정렬을 해서 메모리 부하가 가지 않게 잘 처리 해야됨
- SQL방식(Hive), 프로그래밍 방식 두가지 방법을 제공
공식 정의
- Apache Spark™ is a unified analytics engine for large-scale data processing.
- 데이트 크기와 상관 없이, 어떤 요구사항도 다 처리할 수 있는 (통합) 데이터 분석 엔진
- 아주 잘 만든 분산처리 스칼라(자바) 어플리케이션 프레임워크
- 단순 데이터 처리에 사용하기에는 아까울 정도로 잘 만들어졌다.
빅데이터 분야의 모호한 부분.. 너무 범위가 추상적이다.
- 데이터 처리?
- 데이터를 읽어와서 원하는 작업을 수행하고
- 그 결과를 저장하거나 외부 프로세스에 전달
- MYSQL(Connection -> Query Execute -> Extract Result Data)와 원리는 동일
- Why Spark?
- 특정 광고가 하루 몇번 노출됐는지 알아보기
- 특정 광고를 본 사용자가 몇명인지 알아보기
- 최근 한달간 당일 첫 방문 시 A업종의 광고에 노출된 횟수가 5회 이상인 사용자중에 최근 1주일 사이 B업종 광고에 3회 이상 연속 노출되면서 최초 클릭을 수행한 사용자 수-> 사용자 * 시간(ms) * 광고 수 : 매우 큰 데이터
- 조금 더 특화된 기능
아키텍처와 주요 컴포넌트
spark.apache.org/docs/latest/cluster-overview.html
간단한 예제(단어 수 세기 : word counting)
- 파일 경로 입력으로 전달
- 결과를 저장할 컬렉션 준비(키:단어, 값:count)
- 파일을 한 줄씩 읽으면서
- 각 줄을 공백 문자를 기준으로 단어로 분리한다.
- 분리된 모든 단어에 대해
- 아직 등록되지 않은 단어면 count 1로 등록하고, 이미 등록된 단어면 1을 증가시킨다.
왜 자꾸 단어를 세라는건지?
- 가장 간단하고 -> 전형적인 입력 데이터 포맷(정제되지 않은, 날것(컨텐츠, 저장형식, 저장위치, 크기 다양한) 그대로의 파일)
- 가장 기본적, 자주 활용되는 문법
- 런타임 환경의 정상 여부를 확인
단어 수 예제 다시 보기
- 읽고
- 처리하고(파싱 -> 단어수 세기)
- 결과를 전달(출력)
- 데이터 처리 == (Read -> Process -> R -> PRPRP..)
단어 수 세기 고도화(스파크는 어떻게 했을까?)
- 간단한 예제이지만, 파일의 크기가 매우 커지면 동작하지 못하는 단점이 있다.
- 파일을 나눠서 여러 서버에서 나눠서 처리하면 됨(불변의 진리)
스파크가 없으면 어떻게 할까?
- 서버 준비
- 실행 환경 구성(OS, Java, 환경변수 등)
- 파일 분할(전용 유틸리티 사용)
- 분할한 파일을 여러 서버에 복사
- 프로그램 빌드
- 빌드 프로그램 여러 서버에 복사
- 여러 서버에서 프로그램 실행
- 각 서버별로 실행 결과를 기록
- 모두 더해서 최종 결과 계산
- 단어 수 세는 용도로만 활용 가능
이 일을 범용 프로그램으로 발전 시켜보자
- 변하지 않는 것 -> 재사용 가능한 공통 모듈
- 파일분할 유틸리티
- 파일을 서버에 복사스크립트
- 잘못된 가정.. 파일이 한 서버에 못들어 갈 정도로 크다면?
- 유틸리티로 스플릿 불가능, 파일 복사시 서버 다운될 수도 있음..
- 분산 파일 시스템이 결국 필요해짐.. Not Easy
- 대용량 파일 저장은 스파크의 영역이 아니다..
- HDFS API(업계 De Facto)
- pros : 호환성, 안정성, 편의성
- cons : 하둡 라이브러리 의존성(Not CM)
- 하둡이 필수는 아니지만 클래스 패스에만 하둡 라이브러리가 잡혀있음(for build)
- CDH : 하둡 계열의 빅데이터 솔루션 중에 자주 사용하는 것들을 모아둔 번들 툴
- 변하는 것 -> 구현을 통해 확장 가능하도록 추상화
- 프로그램 빌드/복사/실행
- 프로그램
- 비즈니스 로직은 도메인에 따라 바뀐다
- Input -> 불변
- map/transform -> 변화
- map(파일) -> return 단어수 맵
- map(이미지) -> return JSON_Object
- map(각 서버에서 취합한 파일들) -> return 단어수 맵
- 추상화 레벨이 너무 높다(각 서버별로 실행하는 맵, 모든 서버의 결과를 통합하는 맵) -> 그룹화 + 구분
- 함수 분리
- map
- reduce
- anotherFunction
- 타입(인터페이스, 클래스) 분리
- class Mapper
- class Reducer
- class AwesomeCalculator
- Case of Spart -> 둘다 분리
- class Mapper { map() }
- RDD(abstract class)
- HadoopRDD, CheckPointRDD, JdbcRDD, UnionRDD, ShuffleRDD, PartioningPruningRDD....etc
- Output -> 불변
사람이 했던 역할 - 클러스터매니저(CM)
- 여러 서버들을 제어
- 여러 서버에서 구동중인 프로그램 제어
- 결과 취합 후 최종 프로그램 실행
- HDFS -> 분산 처리를 제어하는 부분을 포기?
- 자체 클러스터 제공 하지만
- 기존 클러스터 활용할수 있게 배려 해줌(하둡 범용)
- 자체 런타임 실행 모델 구축
- Driver(App 실행에 필요한 백그라운드 프로세스, 정보 관리) <-> Executor(Yarn, Mesos, K8s)(Task를 할당받아 실행하는 역할 수행)
- Driver : 마스터 역할을 하는 수많은 백그라운드 프로스세의 집합
- 클러스터별 익스큐터 실행코드 -> spark-submit(spart shell) -> cluster manager 지정
- 단일 프로그래밍 모델, CM Free
- Unit Test, IDE Debugging
RDD(Resilient Distributed Dataset)
- 분산 데이터 모델
- Hadoop의 MapReduce API와 비슷한 역할
- Map/Reduce -> How/Workflow
- Dataset -> What/Data
- 데이터 처리 프로그램 작성을 위한 스파크의 (General) 프로그래밍 모델
- 이제 안쓰지 않나요?
SparkContext 생성 == Initialize Env
App 실행
- rdd.show
- DAG Scheduler (Workflow 로 변환)
- POOL(Task)
- Scheduler - CM
- Executor