- 앞서 RDD의 두 가지 오퍼레이션(트랜스포메이션, 액션)을 알아보았다.
- 트랜스포메이션(Transformations)
- 결과값으로 새로운 RDD를 반환한다.
- 지연 실행(Lazy Execution)이 된다는 특징이 있다.
- 액션(Actions)
- 결과값을 연산하여 리스트나 파이썬 오브젝트를 출력하거나 저장한다.
- 즉시 실행(Eager Execution)이 된다는 특징이 있다.
- 트랜스포메이션(Transformations)
- 스파크를 설계할 때 두 가지로 나눈 이유는 지연되는 연산이 유용한 경우가 있기 때문이다.
- 메모리를 최대한 활용할 수 있다.(디스크, 네트워크 연산을 최소화 할 수 있다.)
- 데이터를 다루는 테스크는 반복되는 경우가 많다.
- 예로 머신러닝 학습 등이 있다.
- 반복을 할 때 디스크를 다녀가는 것 만으로 비효율이 생긴다.
- 가급적 테스크에서 테스크로 넘어갈 때 인메모리 방식으로 진행하는 것이 유용하다.
- 이 방식을 위해서는 어떤 데이터를 메모리에 남겨야 할 지 알아야 가능하다.
- 트랜스포메이션은 지연 실행되기 때문에 메모리에 저장해 둘 수 있다.
- 데이터를 메모리에 남겨두고 싶을 때 사용할 수 있는 함수로
Cache()
와Persist()
가 있다.
Cache & Persist
Cache()
와Persist()
로 데이터를 메모리에 저장해두고 사용이 가능하다.
예
1 |
|
- 위와 같은 코드가 있을 때, category_reviews는 두 가지의 result를 만든다.
.persist()
를 추가하면 메모리에 저장해두고 쓸 수있다.(한 번 연산한 다음 그 결과값을 메모리에 저장해두고 다음 연산에서 쓸 수 있다.)- 그렇기에 두 가지를 만들어도 한 번만 연산할 수 있다.
선형 회귀
1 |
|
- 스파크에서 선형 회귀를 코드로 위와 같이 작성할 수 있다.
- 처음에 포인트를 로딩하고 반복적으로 기울기를 연산한 다음 파라미터(w)를 수정해나간다.
- 기울기를 연산할 때마다 포인트를 로딩할 필요가 없다.
- 캐시를 사용하면 포인트를 로딩한 다음 메모리에 저장한 후 반복적으로 연산할 때 사용할 수 있기 때문에 훨씬 빠른 코드가 된다.
스토리지 레벨
- 위 이미지는 메모리에 저장할 때 어디까지 저장할 것인지 정하는 스토리지 레벨이다.
- SER은 serialized를 뜻하며 데이터를 좀 더 구조화 하여 저장하지만 연산이 추가된다.
차이점
- Cache는 디폴트 스토리지 레벨을 사용한다.
- RDD: MEMORY_ONLY
- 데이터 프레임: MEMORY_AND_DISK
- Persist는 스토리지 레벨을 사용자가 원하는 대로 지정할 수 있다.