Welcome! 🙋‍♂️ View more

Engineering 💻/Hadoop

[Hadoop] 연산 프레임워크 (feat. MapReduce, Spark, Flink)

DeepFlame 2022. 1. 11. 20:26

대다수 프레임워크는 사용자가 정의하거나 합성한 임의의 연산을 잘게 나눠서 분산 실행한다.

 

 

 

Hadoop MapReduce


대용량의 데이터를 분산/병렬 컴퓨팅 환경에서 처리하기 위해 제작된 모델이다. 단순한 구조에도 불구하고, 강력하고 견고하며 확장성이 높다.

큰 데이터가 들어왔을 때, 데이터를 블록으로 나누고 각 블록에 대해서 Map TaskReduce Task를 수행한다.

  • Map Task: 파일에 있는 각 레코드를 Key-Value형태로 변환한 결과를 반환한다. (보통 블록당 하나의 Map Task가  배정되는 것이 이상적)
  • Reduce Task: 하나의 키에 대한 여러 값의 집계 또는 결합해서 입력값의 개수보다 더 작은 개수의 결과값을 산출한다.

 

 

MapReduce 예시

 

처리 과정 예시

  1. 단어 개수를 세기 위한 파일을 HDFS에 업로드한다. 각각의 파일은 블록 단위로 나누어 저장된다.
  2. 블록을 입력받고, Splitting 과정으로 블록 안에 텍스트를 줄 단위로 분해한다. (보통은 행 단위로 분해된다.)
  3. Map 연산을 통해 (단어, 1)의 Key-Value 구조의 리스트를 반환한다. 
  4. Shuffling을 통해 단어를 중심으로 데이터를 모아 Reduce 태스크의 입력값으로 전달된다.
  5. Reduce(단어, count)를 수행하여 각 블록에서 특정 단어가 몇 번 나왔는지 계산한다.
  6. 결과를 HDFS에 저장한다.

 

단점

  1. 맵리듀스로 복잡한 파이프라인을 조합하는 것은 많은 분석가들에게 부담
  2. 많은 양의 디스크 기반 I/O를 수행한다. 따라서 다중 단계 파이프라인은 I/O 비용이 매우 많이 든다. 따라서 실시간성 데이터를 처리하기에 속도 측면에서 부적합함

이러한 이유로 개발 과정 단순화와 파이프라인 효율화를 목표로 스파크, 플링크 등의 프레임워크가 개발되었다.

 

 

Apache Spark


효율성과 사용성에 중점을 둔 인메모리 기반 분산 연산 프레임워크로서, 배치 연산과 스트리밍 연산을 모두 지원한다.
기존에 맵리듀스는 디스크에 결과를 저장했지만, Spark는 메모리에 결과를 저장한 것이다.

맵리듀스와는 달리, 필터링/조인/그룹핑/집계 같은 일반적인 연산을 특정 타입이나 스키마에 부합하는 데이터셋에 직접 적용할 수 있는 풍부한 API를 제공한다. (Spark SQL, Python, Java, Scala, R)
이 API를 사용하게 되면 복잡한 프로세싱 파이프라인도 쉽게 구성할 수 있다.

Apache Spark

# Python에서 Spark API를 이용해 DataFrame을 가져오는 모습
# 출처: https://wikidocs.net/16565

from pyspark.sql import SQLContext

df = sqlContext.read.format('com.databricks.spark.csv')\
    .options(header='true', inferSchema='true')\
    .load('/Users/woowahan/Documents/Python/DS_Ext_School/tutorial_01/Default.csv')\
    .drop("_c0")\
    .cache()

 

Spark의 구성요소는 크게 DriveExecutor로 구성되어있다. Driver는 사용자의 어플리케이션을 여러 노드로 분산하여 처리할 수 있게 변환하고, Executor는 그 작업을 노드에서 실행한다.

Spark 구성요소

 

Spark는 데이터셋에 대한 마이크로 배치를 주기적으로 실행하는 방식으로 스트림 프로세싱을 구현했다. 배치 사이에 대기 시간이 존재하기 때문에 밀리초 이하의 지연 시간을 필요로 하는 작업에는 적합하지 않은 단점이 있다. 하지만 마이크로배치는 이벤트를 하나씩 처리하는 방식을 사용할 때보다 데이터 처리량이 훨씬 크기 때문에 잠재적 약점은 오히려 강점이 될 수 있다.

 

Apache Flink


Hadoop의 MapReduce 구성 요소의 대안으로 무한 데이터 세트를 염두해두고 설계된 스트림 프로세싱 프레임워크이다. 

데이터를 모아서 처리하는 일괄처리(Batch Processing)와 비교했을 때, 연속되는 실시간 데이터를 처리하기 때문에 빠르고 효율적인 데이터 활용이 가능하다.

 

데이터 플로우

Flink의 기본 빌딩 블록은 Streams Transformation이며, 처음과 끝은 Source와 Sink로 구성된다. 실행되면 Flink는 Stream과 Transfomation으로 구성된 스트리밍 데이터 플로우에 매핑한다.

  • Streams: 데이터 레코드의 끊기지 않는 흐름
  • Transformation: 하나 이상의 스트림에 취해지는 명령이며, 하나 이상의 Output Stream이 생산된다. 

 

출처: https://nightlies.apache.org/flink/flink-docs-release-1.9/concepts/programming-model.html

 

 

시간 설정

스트림 처리 시스템에서는 시간 설정이 중요하다. 

  • Event Time: 데이터가 발생되는 시간
  • Ingestion Time: 데이터가 Filnk의 데이터플로우로 입력되는 시간
  • Processiong Time: 각 연산자에서 작업을 수행하는 시간

출처: https://nightlies.apache.org/flink/flink-docs-release-1.9/concepts/programming-model.html

 

 

 


해당 내용은 다음 책을 참고했습니다.

엔터프라이즈 데이터 플랫폼 구축

 

엔터프라이즈 데이터 플랫폼 구축 - YES24

자체 시스템부터 클라우드까지 엔터프라이즈 하둡과 빅데이터 플랫폼 운영, 구축, 설계의 모든 것빅데이터 기술에 대한 정보는 넘쳐나지만 이 모든 기술을 매끄럽게 연결해서 완벽한 엔터프라

www.yes24.com

 

반응형