반응형
www.youtube.com/watch?v=zC9cnh8rJd0
RDD (Resilient Distributed DataSet)
- Spark 에서 데이터 처리를 위해 사용하는 Variable이다.
- RDD는 in-memory에서 local data를 대표하는 데이터이다.
- RDD는 변하지 않는다. (Immutable) 따라서 새로운 RDD를 생성하는
- (잠시 번외 얘기..) 원하는 개수의 executor를 정한다, 각 executor안에 하나의 partition이담기는게 default.
- 만약 executor가 partition만큼 존재하지 않으면, 두 개 이상의 partition이 하나의 executor에서 실행됨.(속도↓)
- 만약 HDFS에서 데이터를 읽는다면, 각 블록이 partition이다.
- 즉 MapReduce의 경우, block개수가 곧 partition이다 (executor 개수를 지정하지 않는다)
- DataNode기준으로 executor는 JVM container인데, 만약 10GB container를 executor로 지정한다면, 해당 executor에서 사용할 수 있는 메모리는 사실 5.4GB이다(RDD를 위한 공간).
- OS, Yarn 사이의 system call을 위해 10%를 사용, 남은 메모리의 40%는 JVM garbage collection때문이다.
- RDD를 통해 데이터를 분석하는데는 Transformations과 Actions을 사용한다.
- RDD는 Immutable하다.
Transformations
- Higher-order Function으로 볼 수 있다. (함수의 파라미터로 Anonymous function(Lamda)를 넣주기 때문.)
- RDD는 구조화된 table형태가 아니다(스키마가 strict하지 않다). 즉 Transformation도 sequal query가 아니다. 그래서 현재는 Spark의 DataFrame을 대부분 사용한다고 한다.(전체적인 프로세스가 더 최적화된다.)
- Transformations을 RDD에 적용하면 새로운 RDD가 생성된다. (RRD는 immutable하기 때문)
- <Transformations example>
- filter : 각 partition에서 원하는 데이터만 남긴다.
- coalesce : partition개수를 감소 시킨다.
- ex. 만약 filter로 인해 어떤 데이터도 남지 않은 partition이 있다면 해당 partition을 실행하는 executor는 낭비이다.(Yarn은 직접 executor의 진행 상황을 보고 판단하지는 않기 때문에 직접 관리해줄 필요가 있다.)
- repartition : partition을 증가, 감소 시킨다.
- 감소를 위해서는 coalesce가 효율적이다. coalesce는 현재 partition 상황에서 효과적으로 data를 이동시키지만 repartition은 full shuffling하여 분배하기 때문이다.
→ Transformations를 몇번하던지, Action이 없다면 Cluster에서는 아무런 작업도 일어나지 않는다.
Lazy Execution방식이기 때문인데, 실제로 데이터를 보여달라는 동작이 없다면 어떤 것도 실행하지 않는다.
Actions
- Action이 실행되면 그때서야 local 저장소에서 데이터를 불러와 작성한 Transformation을 거쳐 output을 보여준다.
- 대부분의 Action은 output을 보여주는 것이 끝이다.(partition 상황, 결과 등 어떤 것도 메모리에 저장하고 있지 않는다.), saveAsTextFile과 같은 저장을 위한 action을 해주면 file system에 저장한다.
- 하지만 어찌되었든 하나의 Action이 끝나면 RDD는 메모리에서 제거된다.
- 그렇다면 Tansformation들이 적용된 RDD를 보고, 저장도 하고, 이후에 또 다른 Transformation을 적용할수는 없을까?
- RDD를 캐싱할 수 있다. RDD를 메모리에 저장하도록 명령하여 해당 RDD에 다양한 Action, 또는 추가적인 Transformation을 적용할 수 있다.
- 캐싱한 RDD는 spark processing 동안만 저장된다.(이후에는 원본 데이터가 변해있기 때문일듯)
- RDD를 저장하는 방법으로는 persist()도 있다. 이건 RDD 저장시 Storage Level을 다양하게 지정할 수 있다.
반응형
'IT study > Big Data' 카테고리의 다른 글
[YouTube]Apache Spark Tutorial Full Course - RDD Creation (4) (0) | 2021.05.17 |
---|---|
[YouTube]Apache Spark Tutorial Full Course - Job, Stage, Task (3) (0) | 2021.05.12 |
[YouTube]Apache Spark Tutorial Full Course - Intro, spark, cluster (1) (0) | 2021.05.01 |
Hadoop MapReduce( + Yarn) (0) | 2021.04.27 |
Data Analysis(Python) (0) | 2021.04.16 |