일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 프로그래머스
- 프로그래머스 큰 수 만들기
- Databricks
- kafka 설치
- 실행엔진
- Catalyst Optimizer
- 데이터베이스복사
- 데이터파이프라인
- 카프카
- 서버간 복사
- Spark 최적화
- freenom
- ORACLE문법
- ORACLE MSSQL차이
- 데이터엔지니어링
- 하둡1.0
- 하둡2.0
- 스파크
- AWS Crawler
- 빌드도구
- 하둡
- 런타임데이터영역
- EMR 구조
- 하둡에코시스템
- 프로그래머스힙
- lazy evaluation
- 지연연산
- 데이터 수집
- 문맥교환
- Spark
- Today
- Total
띵유로그
[SPARK] SPARK 지연연산의 이점 본문
앞선 글에서 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는 작업을 중단한다.
'DataEngineering > SPARK' 카테고리의 다른 글
[오류]java.lang.NoSuchMethodError: scala.reflect.internal... spark library 설정 (0) | 2022.01.12 |
---|---|
[SPAKR] note (0) | 2021.11.04 |
[스파크] RDD - Double RDD 전용 함수 (0) | 2021.03.08 |
[스파크]RDD연산자2(sample, take, takeSample) (0) | 2021.03.08 |
[스파크] RDD연산자 (0) | 2021.03.08 |