띵유로그

[SPARK] SPARK 지연연산의 이점 본문

DataEngineering/SPARK

[SPARK] SPARK 지연연산의 이점

띵유 2021. 8. 18. 00:17
반응형

앞선 글에서 SPARK의 lazy evaluation과 in-memory등의 특성을 설명했다.
그렇다면 이러한 특성은 왜 유용할까? 어디에 유용할 까?


수많은 machine learning 알고리즘이 있지만, 대부분의 알고리즘은 iteration 에 기반한다.
여러 데이터를 가지고 반복작업을 하면서 최적화시키는 과정을 거친다.
여기서 SPARK 가 유용한 이유를 설명할 수 있다.

위 그림을 살펴보면 하둡은 각 작업이 끝난 후 disk에 저장하는 작업을 반복한다.
반면 SPARK 는 각 작업 후 결과를 memory 에 저장후 다시 활용한다.

즉, iteration이 많은 data science 에서는 매번 disk에 접근하는 하둡보다 spark가 훨씬 효율적인 것이다.

SPARK에서 메모리에 저장해두고 바로 쓰고싶을때 사용할 수 있는 함수도 있다.
예를들어 아래 코드를 보자.

val lastYearsLogs: RDD[String]=...
val logsWithError = lastYearsLogs.filter(_.contains("ERROR")).persist()
val firstLogsWithErrors = logsWithErrors.take(10)
val numErrors = logsWithErrors.count() //faster

ERROR라는 글자를 가진 대상만 filter 한 결과를 persist 함수를 통해 캐싱했다. (메모리에 저장)

메모리에 결과가 남아있기 떄문에 take(10), count()등 액션을 수행할 때 훨씬 빠르게 수행 할 수 있다.
만약 persist()함수를 사용하지 않았다면 아래 take, count 시점에 또 다시 filter작업을 해야할 것이다. 


참고를 위해 하나의 함수를 더 소개하면 cache()라는 함수도 있다.

persist :  parameter를 통해 어디에(메모리, disk, 둘다), 어떻게(Java Object, serialized object) 캐시할지  정할 수있음.
cache : 항상 메모리에 Java object로 캐싱


결국 lazy evaluation 이라는 spark의 특징 덕에 optimize도 가능하며 disk 접근도 줄일 수 있다.
잘 알고 활용만 한다면 아주 좋은 특징!
*lazy evaluation : action이 trigger 되기 전까지는 excution 하지 않음.

 

보너스 자료

val lastYearsLogs: RDD[String]=...
val logsWithError = lastYearsLogs.filter(_.contains("ERROR")).take(10)

ERROR를 포함한 모든 대상을 찾고 그중 10개를 take할 것이라고 예상하겠지만,
SPARK는 지연 연산덕분에 더 효과적으로 실행할 수 있다.

ERROR를 filtering 한 후 10개를 넘어서면 그 즉시 spark는 작업을 중단한다. 

반응형
Comments