-
[Apache Spark]Spark RDD의 한계점 및 Dataframe, SQL 등장, 최적화 원리데이터 엔지니어링/Spark 2022. 7. 11. 20:23반응형
RDD Shuffling & partition이해하기
Shuffling이란 썪는다는 의미이다. Partition은 부분으로 나눈다는 의미도 된다. RDD가 분산처리를 하기 위해 데이터를 Shuffling하고 Partition을 나눠서 데이터 연산 처리를 한다음 데이터를 추출하여 받는다. 하지만, Shuffling을 하면 연산처리는 어떻게 작용을 할까? Shuffling을 하게 되면 Partition 나뉜 데이터에서 네트워크 연산(node들의 통신)이 일어나게 된다. 연산 속도는 인메모리 >> 디스크 I/O >> 네트워크 순으로 빠르다. 그런데 Shuffling은 네트워크 연산이기 때문에 앞에서 데이터가 어느 정도 정리가 된 후에 해야한다.
아래의 그림을 보면 어려가지 key-value값이 있는데 여기서 groupbykey를 했다고 가정해 보자 그럼 데이터 노드간에 네트워크 연산을 진행한다음 값을 추출하게 되는데 이 과정에서 shuffling을 진행하여 값이 맞는 걸을 찾아 모아주게 된다. 이런과정에서 data node들의 네트워크 연산이 일어 나므로 꼭 shuffling을 최소화하여 작성 할 수 있도록 구성 하여야 한다.Shuffling을 일으 킬 수 있는 연산
- join, leftOuterjoin, rightouterjoin
- GroupByKey
- ReduceByKey
- ComebineByKey
- Distinct
- Intersection
- Repartition
- Coalesce 등
shuffle은 결과로 나오는 RDD가 원본 RDD의 다른 요소를 참조하거나 다른 RDD를 참조할 때 일어 난다. shuffling을 최소화 하기 위해서는 filter를 하여 데이터의 전체적인 양을 줄이거나 partitioning을 진행하여 데이터를 합친 다음 진행하여야 한다.
DataFrame의 등장
RDD는 이후에 많은 문제점이 생기게 되었다. Shuffling을 고려하지 않고 진행한 코드나 개발자들 끼리의 숙련도 차이 등 빠른 속도의 장점을 살리지 못하는 경우가 많았는데, 이런 문제점을 해결하기 위해 표준화된 데이터 형식을 도입하게 되었다. 바로 DataFrame이다. DataFrame은 Optimizer에 의해 최적의 논리를 받아와 데이터를 반환해주기 때문에 RDD를 사용할 때 문제점이 됬던게 많이 해결되었다.
Spark 에서 DataFrame 및 SQL 동작 원리
스파크 쿼리를 최적화 하기 위해 두가지 엔진을 사용한다. 바로 Catalyst와 Tungsten이다. 먼저 개발자 들이 작성한 코드에서 SQL과 DataFrame 은 catalyst에 의해 optimizing된다. 그리고 그것을 Tungsten이 RDD로 변환을 해주게 된다.
변환 과정 알아보기
Query plan과 optimizing되는 부분을 자세히 살펴 보면
Logical Plan이란?
- 수행해야하는 모든 Transformation단계에 대한 추상화
- 데이터가 어떻게 변해야 하는지 정의하지만
- 실제 어디서 어떻게 동작하는지는 정의 하지 않음
Physical Plan이란?
- Logical Plan이 어떻게 클러스터 위에서 실행될지 정의
- 실행 전략을 만들고 Cost Model에 따라 최적화
Logical Plan을 Physical Plan으로 바꾸는 일
- 분석 : DataFrame객체의 relation을 계산, 컬럼의 타입과 이름 확인
- Logical Plan 최적화
- 상수로 표현된 표현식을 Compile Time에 계산(x runtime)
- Predicate Pushdown : join & filter → filter & join
- Projection Pruning : 연산에 필요한 컬럼만 가져오기
- Physical Plan 만들기 : spark에서 실행 가능한 Plan으로 변환
- 코드 제너레이션 : 최적화된 Physical Plan을 Java Bytecode로
작동 스택
Spark를 사용하는 라이브러리 중에 MLLib 과 Spark Streaming은 DataFrame 위에 있고 , SparkSQL은 따고 작동한다. 위에서 설명한 내용이 작동을 하며 Spark Core를 만들어 주어 처리하고 반환해 준다.
Spark에서도 DataFrame과 SQL을 될수 있으면 RDD를 사용하지 말고 DataFrame과 SQL을 사용하는 것을 권장하고 있다. 그리고 최적화 문제를 해결 할 수 있으니 Dataframe과 SQL을 사용하여 처리하자
참고자료
https://www.databricks.com/glossary/catalyst-optimizer
https://www.databricks.com/blog/2016/06/22/apache-spark-key-terms-explained.html반응형'데이터 엔지니어링 > Spark' 카테고리의 다른 글
[Spark] Postgre의 데이터 JDBC 커넥터 활용하여 병렬 처리 해보기(feat, partitionColumn,lowerBound, upperBound, numPartitions) (0) 2023.02.12 [Apache Spark Job]구동 방식 이해하기 (Submit job, physical planning, stage, ) (1) 2022.08.03 [Spark]RDD 이해하기 (0) 2022.06.19 [Spark] 스파크란 무엇인가?(spark 등장배경, 쓰는이유, 빠른이유) (4) 2022.06.18 [데이터 엔지니어링 설치 방법 정리] Hadoop, spark, pyspark, anaconda (feat. windows 10) (4) 2022.06.18