[스파크] Cache()와 Persist()란?

  • 앞서 RDD의 두 가지 오퍼레이션(트랜스포메이션, 액션)을 알아보았다.
    • 트랜스포메이션(Transformations)
      • 결과값으로 새로운 RDD를 반환한다.
      • 지연 실행(Lazy Execution)이 된다는 특징이 있다.
    • 액션(Actions)
      • 결과값을 연산하여 리스트나 파이썬 오브젝트를 출력하거나 저장한다.
      • 즉시 실행(Eager Execution)이 된다는 특징이 있다.
  • 스파크를 설계할 때 두 가지로 나눈 이유는 지연되는 연산이 유용한 경우가 있기 때문이다.
    • 메모리를 최대한 활용할 수 있다.(디스크, 네트워크 연산을 최소화 할 수 있다.)
    • 데이터를 다루는 테스크는 반복되는 경우가 많다.
      • 예로 머신러닝 학습 등이 있다.

image

  • 반복을 할 때 디스크를 다녀가는 것 만으로 비효율이 생긴다.
  • 가급적 테스크에서 테스크로 넘어갈 때 인메모리 방식으로 진행하는 것이 유용하다.
  • 이 방식을 위해서는 어떤 데이터를 메모리에 남겨야 할 지 알아야 가능하다.
  • 트랜스포메이션은 지연 실행되기 때문에 메모리에 저장해 둘 수 있다.
  • 데이터를 메모리에 남겨두고 싶을 때 사용할 수 있는 함수로 Cache()Persist()가 있다.

Cache & Persist

  • Cache()Persist()로 데이터를 메모리에 저장해두고 사용이 가능하다.

1
2
3
4
category_reviews = filtered_lines.map(parse).persist()

result1 = category_reviews.take(10)
result2 = category_reviews.mapValues(lambda x: (x, 1)).collect()
  • 위와 같은 코드가 있을 때, category_reviews는 두 가지의 result를 만든다.
  • .persist()를 추가하면 메모리에 저장해두고 쓸 수있다.(한 번 연산한 다음 그 결과값을 메모리에 저장해두고 다음 연산에서 쓸 수 있다.)
  • 그렇기에 두 가지를 만들어도 한 번만 연산할 수 있다.

선형 회귀

image

1
2
3
4
5
6
points = sc.textFile("...").map(parsePoint).cashe()

for i in range(ITERATIONS):
    gradient = points.map(gradient_descent)
                     .reduce(lambda x,y : (x+y)) / n)
    w -= gradient * learning_rate
  • 스파크에서 선형 회귀를 코드로 위와 같이 작성할 수 있다.
  • 처음에 포인트를 로딩하고 반복적으로 기울기를 연산한 다음 파라미터(w)를 수정해나간다.
  • 기울기를 연산할 때마다 포인트를 로딩할 필요가 없다.
  • 캐시를 사용하면 포인트를 로딩한 다음 메모리에 저장한 후 반복적으로 연산할 때 사용할 수 있기 때문에 훨씬 빠른 코드가 된다.

스토리지 레벨

image

  • 위 이미지는 메모리에 저장할 때 어디까지 저장할 것인지 정하는 스토리지 레벨이다.
    • SER은 serialized를 뜻하며 데이터를 좀 더 구조화 하여 저장하지만 연산이 추가된다.

차이점

  • Cache는 디폴트 스토리지 레벨을 사용한다.
    • RDD: MEMORY_ONLY
    • 데이터 프레임: MEMORY_AND_DISK
  • Persist는 스토리지 레벨을 사용자가 원하는 대로 지정할 수 있다.
0%