이야기박스

Chapter 4. Fundamentally lazy 본문

Computer & Data/Big Data

Chapter 4. Fundamentally lazy

박스님 2020. 11. 12. 19:59
반응형

 

# 개요

프로그램에서의 laziness란? 게으른 프로그램? 일반적으로 생각되는 부정적인 의미의 게으름과 프로그램에서 말하는 `laziness`는 다릅니다. 정확하게 필요한 순간, "Smart"하게 동작하는 것! 그것을 프로그램에서의 `laziness`라 말합니다.

 

Lazy initialization - Wikipedia

In computer programming, lazy initialization is the tactic of delaying the creation of an object, the calculation of a value, or some other expensive process until the first time it is needed. It is a kind of lazy evaluation that refers specifically to the

en.wikipedia.org

Spark는 Laziness를 통하여 최적화된 Transformations(Data process) & Actions(Work Done)을 보여줍니다.

 

# Summary

Spark의 효율적인 게으름! DAG으로 recipe를 관리하고 catalyst로 최적화한다! 그리고 Action에서 한번에 실행!

 

# 현실의 laziness

한 프로그램 개발자가 v1.0에서 v1.1을 개발하고 v1.2를 개발하였습니다.

이때, 보스한테서 v1.0을 조금 참고하여 v1.3을 개발하라는 업무가 들어왔습니다.

 

Figure 4.1

보통은 위와 같은 프로세스로 작업이 이루어지는게 바람직하겠죠. 하지만 v1.3은 v1.0을 참고하기 때문에 v1.2에서 발전시키는 것보다 아래와 같이 v1.0부터 시작하는 게 더 효율적인 작업이 될 것입니다.

 

Figure 4.2

위와 같은 케이스 때문에 Git이라고 하는 훌륭한 형상 관리 툴이 생겨났죠. [Figure 4.2]와 같은 방법이 좀더 lazy 하면서 Smart 한 방법이 될 수 있습니다. 아래에서는 이러한 Laziness Pattern을 Spark에 적용하는 방법을 살펴보겠습니다.

 

# Spark with laziness

## Transformations and Actions

책에 나오는 3개의 예제를 통하여 Spark와 Laziness의 대해서 알아보도록 하겠습니다.

  • Experiment 1 --Load a dataset and perform a collection action.
  • Experiment 2 --Load a dataset, perform a transformation (creating three columns through duplication and mathematical operations), and perform a collection action.
  • Experiment 3 --Load a dataset, perform a transformation (creating three columns through duplication and mathematical operations), drop the newly created columns, and perform a collection action. This experiment will illustrate Spark’s laziness.

 

Experiment 1:
Load and collect

Experiment 2:
Load, create columns, and collect

Experiment 3:
Load, create columns, delete the columns, and collect

Load (get a Spark session, load the dataset, build the dataset, clean up)

5,193 ms

Transformation

0 ms

182 ms

185 ms

Notes on
transformations

None done

Creation of three
columns: duplication and mathematical expression

Creation of the same three columns as in experiment 2, then deletion of those
columns

Action

20,770 ms

34,061 ms

24,909 ms

Notes on action

Performed a collect()

이 내용만 봐도 Spark Laziness에 대해서 무엇을 말하고 싶은지 알 수 있습니다.

Experiment 3은 Experiment 2를 참고하는것이 아닌 Experiment 1을 참고하여 동작할 수 있기 때문에 Experiment2보다 동작이 많지만 Action 타임이 더 짧게 나온 거겠죠.

 

# Recipe

스파크는 어떻게 Lazy한 동작을 가능하게 할까요? 바로 Recipe란 개념 덕분입니다. 

Transformation과정에서는 recipe를 생성할 뿐입니다. 그리고 Action이 취해졌을 때, 생성되었던 recipe를 최적화하여 실행하게 됩니다.

 

Recipe 설명으로 책에서는 작가가 재밌는 예시를 하나 보여주었습니다.

 

## Recipe Example

부모가 아이에게 "방을 치워라~", "빨래를 세탁기에 넣어라", "만화책을 치워라" 등등 요구를 하지만, 아이는 바로 행동을 취하지는 않습니다. 부모가 "지금 시작해!"라고 해서야 움직이게 되죠. 여기서 "Start Now"가 Spark의 Action이 됩니다.

하지만 예시를 자세히보면 "방을 치워라" ~ "만화책을 치워라"는 같은 비슷한 동작이 포함되어 있을 수도 있겠네요. 이런 경우 스파크는 어떻게 Recipe 최적화를 할까요?

 

## DAG (Directed Acyclic Graph)

대학교 알고리즘 수업에서 자주 등장하는 내용이죠.

스파크는 이 DAG을 이용하여 Recipe들을 구현하였습니다.

그리고 스파크에는 Catalyst라는 최적화 프로그램이 있습니다. 이 Catalyst가 DAG을 보고 최적화를 진행해줍니다.

Experiment 3 예시

새로 추가한 컬럼을 삭제하고, 평균을 계산할 컬럼을 삭제하고.. 결국 Output은 아무것도 하지 않은 데이터가 나오겠죠.
Catalyst는 이 DAG을 간단하게 아래처럼 만들어줍니다.

 

# 후기

Catalyst 관련한 포스트는 나중에 기회가 된다면 따로 작성하겠습니다.

반응형