언어를 제대로 습득하기에 앞서 궁극적으로 무엇을 위해서 배우는지 목표를 명확하게 하고자
Intro to Apache Spark for Java and Scala Developers라는 유튜브 강의를 보면서 내용을 요약하고자 한다.
Spark 프레임워크란
Spark는 데이터가 여러 곳에서 나누어서 처리되도록 데이터 분산 처리를 용이하게 만들어주는 대표적인 프레임워크이다. 이를 가능하게 해주는 Spark 내 컴포넌트들이 있는데 아래와 같다.
1. Driver : 클러스터의 브레인(1개) 역할을 한다. Spark 어플리케이션을 task로 나누고 스케쥴링을 한다. SparkContext를 실행하고 관리한다.
2. Executor : 다수 개이며 데이터 처리를 한다.
분산 시스템에서 컴포넌트끼리 통신하는 방식
1. Broadcast : driver(1개)에서 executor(여러 개)로 데이터를 전송한다.
2. Take : driver가 executor로부터 데이터를 가져온다. driver에 메모리 부하 우려가 있고 작업 시간이 오래 걸린다.
3. DAG Action : DAG는 instruction(guide)이며, driver에서 DAG를 생성하고 executor로 전달한다.
4. Shuffle : join, groupBy 등 다른 파티션의 데이터도 필요할 경우 실행되며 파티션이 다른 executor로 이동하므로 비용이 크다. (직렬화, 역직렬화, network 전송 과정을 추가적으로 거쳐야 하기 때문)
노드가 많을 수록 자원(I/O, CPU, Memory)를 많이 얻을 수 있으며 데이터와 상태를 교환하는 것은 비싼 작업임을 인지하고 있어야 한다. 또한 stage에 있는 모든 task가 모두 끝나야 다음 stage가 시작된다.
"Spark답다"라고 말할 수 있는 Spark의 특징
RDD, DataFrame
RDD Resilient Distributed Dataset은 스파크의 분산데이터 모델, 프로그래밍 API이다. RDD안에 데이터가 저장된 것이 아니라 데이터를 처리할 수 있는 함수가 구현된 모델이다.
이 메서드들은 immutable해서 같은 입력 데이터를 주면 항상 같은 결과를 도출한다.
DAG
스파크의 처리 엔진 자체에 DAG가 있으며 DAG는 Transformation, Action으로 구성된다.
전자는 RDD를 RDD로 만드는 연산이며 DAG를 만들기만하고 수행은 하지 않지만
후자는 전자에서 처리하는 외의 연산을 다루며 이 단계에서 실제 DAG를 처리하게 된다.
FlumeJava
이 부분은 이해가 쉽게 잘 되지 않아 추후에 다시 작성을 해봐야 하는 파트이다.
Long Lived Applications
작업을 할 때마다 컨테이너를 실행하다가 중지하고 다시 실행하고 중지하는 방법이 아니라는 뜻이다. 즉 컨테이너를 띄우고 셧다운 작업을 반복하지 않는다.
필요한 만큼 컨테이너를 띄우고 그 컨테이너에서 태스크가 수행되며 DAGs로 작업을 스케쥴링 하므로 중간에 데이터를 보관할 필요가 없어서 불필요한 디스크 접근이 없다는 장점이 있다.
Spark의 병렬처리 관리
resource allocation
fixed allocation, dynamic allocation이 있다.
skew
이 방법은 노드를 추가해서 scale-out이 가능하도록 했는데도 불구하고 작업 속도가 향상되지 않거나 single core에서 실행되는 경우 사용되는 기법이다. 파티션이 제대로 되지 않아 특정 key에 데이터가 몰릴 경우 일어난다. 이럴 경우에는 해싱 등을 이용해서 키를 다시 지정해야 한다.
cartesian join
nested structures, windowing, reduceByKey가 있다.
partitioning
partition은 병렬 처리되는 데이터의 단위이며 특정 stage가 많은 CPU 사용량을 요구한다면 repartition을 통해서 파티션을 늘리는 기법이다.
내가 Scala를 공부하는 이유는 지금은 학생이지만 비교적 먼 미래를 생각해봤을 때 빅데이터 처리 플랫폼인 Apache Spark를 다뤄보고 싶고 Scala라는 프로그래밍 언어가 이 플렛폼에서 널리 쓰이는 언어이기 때문이다. Spark를 통해 대규모 데이터셋을 효과적으로 분석하고 다룰 수 있는 날이 머지않아 오기를
'Language > scala' 카테고리의 다른 글
[Scala] 스칼라에 대해 배워보자! 특징부터 설치까지 (0) | 2024.05.05 |
---|