반응형

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을 다양하게 지정할 수 있다. 

 

 

반응형

+ Recent posts