스파크의 특징에는 한서버에서 큰데이터의 양을 처리할수 있다고하는데 어떻게 되는건지 궁금해서 찾아 보았다.

StackOverFlow에서 검색을 한 결과 두 가지의 설명이 있다.

내가 원하는 질문은 2번이지만, 1번의 글도 해석을 해보았습니다.

 

1. 질문 : 스파크의 주 메모리에 맞출 수 없을때 스파크가 큰 파일(페타 바이트)을 읽는 방법

대답 : Spark는 작업이 호출(action)될 때만 데이터 읽기를 시작한다. 작업이 호출되면 Spark가 파티션의 데이터를 로드 한다. 동시에 불러온 파티션의 수는 사용가능한 코어 수에 따라다르다. Spark에서 1partition = 1 core = 1 로 생각 할 수도 있다. 동시에 로드된 모든 파티션은 메모리에 맞아야한다. 그렇지 않으면 OOM이 표시됨

여러 단계가 있다고 가정하면 Spark는 로드된 파티션에서만 첫번째 변환 작업을실행한다. 로드된 파티션의 데이터에 변환을 적용하려면 출력을 셔플 데이터로 저장한 다음 더 많은 파티션을 읽고 난후 모든 데이터를 읽을때까지 계속 읽는다.

transform을 적용하지 않고 count만 하는 경우에는 Spark는 파티션의 데이터를 읽지만 클러스터에 데이터를 저장하지 않으며, count를 다시 수행하면 모든 데이터를 다시 한번 읽게된다. 이럴 경우 데이터를 여러변 읽게 되는데, 이를 방지 하기 위해서, cache와 persist를 사용한다.

persist(StorageLevel.MEMORY_ONLY) 와 persist(MEMORY_AND_DISK) 두 가지가 있는데, 메모리에만 저장할 경우에는 OOM이 표기될수도 있다. 그래서 메모리와 디스크에 저장을 하는데, 데이터가 디스크에 맞지 않으면 OS는 일반적으로 executor를 kill 한다.

https://stackoverflow.com/questions/46638901/how-spark-read-a-large-file-petabyte-when-file-can-not-be-fit-in-sparks-main

 

2. 질문 : 메모리 내 계산을위한 spark의 작동 메커니즘과 혼동되지 않습니다. spark가 인 메모리 처리를 수행하는 경우 16GB의 인 메모리 스토리지가있을 때 100TB의 데이터를 계산하는 방법

대답 : Spark는 머신의 리소스 및 컴퓨팅 기능에 맞는 데이터 블록에서 작동합니다. 이 작업은 여러 번 반복되어 스파크가 데이터를 메모리에로드하고 처리 한 후 다음 데이터 청크에서 작업하는 데 필요한 경우 결과를 디스크에 다시 기록합니다.

https://stackoverflow.com/questions/54959785/how-does-spark-do-in-memory-computation-when-size-of-data-is-far-larger-than-ava

2번 질문을 보면 데이터블록에서 동작하는것이고, 데이터를 메모리에 로드하고 처리한 후 데이터 청크에서 작업을 하고 결과를디스크에 다시 기록하고, 메모리가 부족한 경우에는 디스크와 메모리를 반복적으로 사용하는 것 같은데 자세한 내용은 다음에 정리하여 올리겠습니다.

+ Recent posts