빅데이터 : Volume. Veriety, Velocity -크기, 다양성, 속도
Variability(가벼성), Veracity(정확성), Complexity(복잡성), Visibillity(시인성)
스파크 : 하둡 기반의 맵리듀스 작업의 단점(파일방식,속도느림,복잡성)을 보완하기 위해 개발, 메모리 방식
데이터 모델 1. RDD (Resilient distributed dataset) : 분산 방식으로 저장된 데이터 요소들의 집합, 병렬처리가 가능하고 장애 복구 내성(tolerance)를 가진 모델
- RDD는 파티션 단위로 나뉘어 병렬 처리 됨.
- 작업중 파티션은 재구성 되면서 네트워크를 통해 다른 서버의 파티션으로 이동하는 셔플링이 발생. 셔플링은 작업 성능에 큰 영향을 주기 때문에 주의해야 함.
- RDD는 연산이 수행 시 새롭게 생성되며, 변경되지 않는 읽기 전용 모델이다. 전 단계 RDD와 어떤 연산을 적용해서 만들어 지는지를 기억(lineage)하고 있어서 특정 절차에 장애가 발생해도 해당 이력을 바탕으로 RDD 생성을 재시도 하게 된다.
- RDD 제공 연산 1. - 트랜스포메이션(Transformation) : 새로운 RDD를 만들어 내는 변환 연산, 액션 연산이 호출될 때 여러 변환 연산들의 최적화를 분석해서 실행(lazy 실행방식)이 된다.
- RDD 제공 연산 2. - 액션(Action) : 연산의 결과(RDD가 아닌 다른 값, 반환하지 않는 연산 포함)를 반환하는 동작, ex) sum(), stddev() 등
DAG 스케쥴러 : 셔플의 유무에 따라 스테이지를 나누고 셔플로 인해 발생하는 부하를 최대한 줄이는 역활을 함.
- Driver 메인 함수 > Spark Context > RDD 연산 정보를 DAG 스케쥴러에게 전달 : 전체 데이터 처리 흐름을 분석해서 네트워크를 통한 데이터 이동이 최소화 되도록 Stage 구성 > 클러스터 매니저에게 전달 > Stage 별 task 실행
- 좁은 의존성 : 연산이 실행되는데 필요한 파티션이 적은 경우, 파티션간의 셔플이 발생하지 않음. (더하기 연산)
- 넓은 의존성 : 여러 파티션의 정보가 연산에 필요한 경우, 각 파티션들의 데이터를 셔플하여 시간이 오래 걸림. (SUM 등)
Spark Context와 Spark Session : 스파크 애플리케이션이 동작하기 위한 서버 프로세스가 필요.
- 클러스터를 구성하는 개별 서버 간에 메시지와 데이터를 주고 받을 수 있는 채널(백엔드 서버 프로세스) 구동
- 개별 작업 수행에 필요한 메타 정보를 저장하고 관리
- 스파크 2.0부터 세션안에 컨텍스트가 포함됨.
데이터 프레임
- RDD는 실행할 함수를 직접 전달 받아 사용하는 대신에 DataFrame은 사전에 정의된 표현식과 내부 함수를 이용해 코드를 작성
- 논리적 작업 트리로 변환한 후 최적화 과정을 거쳐서 최종 동작을 수행 => RDD에 비해 훨씬 효율적이고 최적화를 수행.
RDD : 직접 함수를 전달받아 처리
val words = rdd.flatMap(str => str.split(" "))
val wcPair = words.map(v => (v,1))
DF : 내장 함수 사용
val wordDF = df.select(explode(split(col("value"), " ")).as("word"))