ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [빅데이터의 분산 처리] 1. 대규모 분산 처리의 프레임워크
    책/빅데이터를 지탱하는 기술 2022. 3. 25. 00:03
    반응형

    이 글은 빅데이터를 지탱하는 기술을 읽고 정리한 글입니다.


     

     

     

    1. 구조화 데이터와 비구조화 데이터


    - 구조화 데이터, 비구조화 데이터, 반구조화 데이터

    SQL로 데이터를 집계하는 경우 먼저 스키마를 설계한다. 스키마가 명확하게 정의된 데이터를 구조화 데이터라고 하는데, 기존의 데이터 웨어하우스에 있는 데이터는 항상 구조화된 데이터로 축적하는 것이 일반적이였다.

    하지만 빅데이터는 스키마가 없는 자연어나 동영상, 이미지와 같이 구조화된 데이터가 아닌 데이터도 저장해야한다. 이때 이런 스키마가 없는 데이터를 비구조화 데이터라고 하고, 데이터 레이크가 이런 비구조화 데이터들을 저장한다.

    스키마리스 데이터(반구조화 데이터)도 있는데, 이것은 서식은 정해져있지만 칼럼 수나 데이터형이 명확하지 않은 데이터를 말한다. 대표적으로 CSV, JSON, XML 등이 있는데 최근에는 JSON 형식을 많이 이용하고 있다.

     

    - 데이터 구조화의 파이프라인

    데이터 소스에서 수집된 비구조화 데이터나 스키마리스 데이터는 분산 스토리지에 저장되어 있다가, 스키마를 설계한 뒤에 구조화 데이터로 가공을 하여 압축률이 높은 열 지향 스토리지에 저장을 한다.(열 지향 스토리지에 의한 고속화 참조) 이때 열 지향 스토리지에 저장하는 것은 MPP 데이터 베이스로 보내거나, Hadoop 상에서 열 지향 스토리지로 변환되는 것이다. 이후 구조화 데이터를 팩트 테이블과 디멘전 테이블로 취급한다. (데이터 마트의 기본 구조 참조)

     

    - 열 지향 스토리지의 작성

    MPP 데이터베이스는 스토리지 형식이 정해져 있지만, Hadoop의 경우엔 내부에서 변환할 열 지향 스토리지의 종류중 하나를 선택해야한다. 대표적으로 Apache ORC는 구조화 데이터를 위한 열 지향 스토리지이고, Apache Parquet은 스키마리스에 가까운 데이터 구조로 되어 있어서 JSON 같은 데이터도 저장할 수 있다.


     

     

     

    2. Hadoop


    Hadoop은 단일 소프트웨어가 아닌 분산 시스템을 구성하는 다수의 소프트웨어로 이루어진 집합체이다.

     

    - 분산 시스템의 구성 요소 개요

    Hadoop의 기본 구성 요소는 분산 파일 시스템으로 HDFS를, 리소스 관리자로 YARN을, 분산 데이터 처리로 MapReduce 총 3가지이다. 참고로 Hadoop을 사용한다면 모든 것을 Hadoop에 의존하는 것은 아니다.

     

    - 분산 파일 시스템 (HDFS)

    Hadoop에서 처리되는 데이터 대부분은 HDFS에 저장하는데, 분산 파일 시스템이니 다수의 컴퓨터에 파일을 복사하여 중복성을 높인다는 특징이 있다. 여기서 RAID 구조가 떠오르는 사람도 있을텐데 결론적으로 말하면 HDFS 자체에 RAID 구조를 적용하면 성능 저하가 일어나서 의미가 없고, HDFS에 있는 네임노드에 RAID 기법을 사용한다고 한다.

     

    * 블록

    데이터베이스에서 물리적 디스크의 블록 크기를 배운 적이 있을텐데 그것과 개념적으로 같은 것 같다. 파일이 블록 단위로 쪼개고, 어느 위치에 데이터가 있는지 빨리 찾기 위해 사용한다.

     

    * 네임노드와 데이터노드

    HDFS 클러스터는 마스터인 네임노드와 워커인 데이터노드들로 이루어져 있다. 여기서 네임노드는 파일시스템의 네임스페이스를 관리하고, 메타데이터를 유지한다. 그리고 마스터의 이름에 맞게 데이터노드를 관리한다. 데이터노드는 네임노드나 클라이언트의 요청이 있을 때 블록을 저장/탐색을 하고, 저장하고 있는 블록의 목록을 주기적으로 네임노드에 보고한다고 한다.

     

    * 네임노드의 RAID 구조 적용

    네임노드는 메타데이터와 파일 블록의 매핑 정보를 보관하는 유일한 저장소이기 때문에 네임노드가 없을 경우 파일시스템이 동작하지 않는다. 그래서 네임노드를 복구하는 기능이 필요한데, 여기서 파일시스템의 메타데이터를 지속적인 상태로 보존하기 위해 파일로 백업하는 것이다. 이때 로컬 디스크에 저장을 하고, 이 디스크를 RAID 1 또는 RAID 10 구조로 구성하여 가용성을 높인다.

     

     

    - 리소스 관리자 (YARN)

    리소스 관리자는 CPU나 메모리 등의 계산 리소스를 관리한다. 거기서 YARN은 애플리케이션이 사용하는 CPU 코어와 메모리를 컨테이너라는 단위로 관리하는데, Hadoop에서 분산 애플리케이션을 실행하면 YARN이 클러스터 전체의 부하를 보고 비어있는 호스트부터 컨테이너(CPU 일부 코어 + 메모리 일부)를 할당한다.

    그래서 리소스 관리자는 분산 시스템은 계산 리소스가 제한되어 있기 때문에 한정된 계산 리소스로 다수의 분산 애플리케이션을 동시에 실행해야 하므로 차질이 없게 실행되도록 관리한다. 이때 계산 리소스가 모두 사용중인 경우도 생길텐데 리소스 관리자가 애플리케이션마다 실행의 우선순위를 정해서 중요하지 않은 배치 처리는 나중에 실행하도록 만들어서 효율적으로 관리해준다.

     

    - 분산 데이터 처리 및 쿼리 엔진 (MapReduce, Hive, Hive on Tez)

    MapReduce는 YARN 상에서 동작하는 분산 애플리케이션인데, 임의의 자바 프로그램을 실행시킬 수 있기 때문에 비구조화 데이터를 가공하는데 적합하다. MapReduce는 원래 대량의 데이터를 배치 처리하기 위한 시스템이라 작은 프로그램을 실행하려면 오버헤드가 크기 때문에 쿼리 실행에는 비적합하다. 그래서 SQL 쿼리 언어를 사용하는 경우에는 바로 MapReduce를 사용하지 않고, MapReduce로 변환해주는 Apache Hive 같은 쿼리 엔진을 사용한다.

    하지만 Hive 역시 MapReduce를 계승한터라 시간이 오래 걸리는 배치 처리에는 적합하나, 애드 혹 쿼리를 여러 번 실행하는데 오버헤드가 크기 때문에 Hive를 가속화해주는 Apache Tez라는 것이 만들어졌다.

     

    * MapReduce와 Tez의 차이

    MapReduce는 여러 개의 스테이지로 구성되어 있고, 각 스테이지는 분산 처리를 하는 Map과 분산 처리한 것을 다시 합치는 Reduce인 두 단계로 구성되어 있는데, Reduce 작업이 끝날 때마다 중간 데이터를 HDFS에 저장을 해야하기 때문에 모든 데이터가 마지막 데이터 작업이 끝날 때까지 기다려야해서 속도가 느린 편이다. 그래서 Tez는 작동 과정을 미리 DAG 기반으로 최적화해두어 Reduce 단계가 끝난 데이터는 중간 데이터에 저장하지 않고, 바로 다음 Map 작업을 하는 메모리로 저장되게 만들었다.

     

    - 대화형 쿼리 엔진 (Impala, Presto)

    Hive와 다르게 Apache Impale와 Presto는 처음부터 SQL 쿼리 실행만을 전문으로 처리하는 쿼리 엔진이다. MapReduce와 Tez는 장시간의 배치 처리를 가정하여 한정된 리소스를 잘 활용하도록 설계되어 있지만, 대화형 쿼리 엔진은 순간의 최대 속도를 높이기 위해 리소스를 최대한 사용할 수 있도록 실행한다. 리소스를 관리할 필요가 없으므로 YARN과 같은 리소스 관리자를 사용하지 않는다.


     

     

     

    3. Spark


    Spark는 대량의 메모리를 활용하여 고속화를 실현하는 MapReduce를 대체하는 분산 프로그래밍 환경으로 사용된다. MapReduce는 개발 당시 적은 메모리를 효율적으로 사용해야했어서 디스크 읽고 쓰는 활동을 많이 하는데, 시간이 흘러 컴퓨터 메모리의 양이 증가함에 따라 굳이 디스크에서 읽고 쓸 필요가 없어졌다. 그래서 Spark는 가능한 많은 데이터를 메모리에 올려서 빠르게 처리할 수 있도록 한다.

    Spark의 실행은 자바 런타임이 필요하지만, Spark 상에서 실행되는 데이터 처리는 다른 스크립트 언어를 사용할 수 있다. 그리고 Spark는 SQL로 쿼리를 실행하기 위한 Spark SQL과 스트림 처리를 수행하기 위한 Spark Streaming이라는 기능이 포함되어 있어서 대규모 배치 처리뿐만 아니라 SQL에 의한 대화형 쿼리 실행, 실시간 스트림 처리까지 다양하게 이용되고 있다.

    참고로 메모리에 올려두기 때문에 중간에 데이터가 날아가는 경우가 생기면 다시 처음부터 실행하여 복구한다고 한다.


     

    반응형

    댓글

Designed by Tistory.