하둡(Hadoop)이란 - HDFS, Map-reduce, Spark
하둡(Hadoop)이란 - HDFS, Map-reduce, Spark

하둡(Hadoop)이란 - HDFS, Map-reduce, Spark

설명
하둡 기초 개념, 몇몇 에코시스템(HDFS, Map-reduce, Spark)에 대해 알아보자
Last Updated
Last updated March 25, 2023
태그
Hadoop
DE
Data Engineering

배경) 빅데이터란?

빅데이터

  • Img, video, text
  • 분석을 위해 많이 사용. 보안이 크게 중요하지 않은 경우가 많다.
  • TB 이상의 큰 크기. 한 서버로 열기 힘들다.

Not Big Data

  • 회원정보, 계좌정보 등 관계형 DB
  • 반드시 정보가 정확해야 함. 보안성 중요
 

하둡 History

  • 사용자들이 온라인에 데이터를 많이 올리면서, 위의 아키텍처로는 속도가 느림
  • 성능좋은 서버는 비용이 비싸고, 데이터 관리도 어렵다
  • NoSQL의 등장으로 값싼 가격에 DB를 늘릴수 있으나, 다만 여전히 방대한 데이터 량을 서버로 옮겨 처리하기는 처리속도가 부족했다
 
  • 새로운 빅데이터 전용 알고리즘(Map Reduce), 파일시스템(Google file System)
    • 구글에서 검색을 위해 web데이터들을 효율적으로 처리하기 위해 개발/논문 발표
    • 해당 논문을 기반으로 하둡은 2006년 더그 커팅 과 마이크 캐퍼렐라(Mike Cafarella)가 오픈소스로 개발하였다.
    • 하둡이란 이름은, 더그 커팅의 딸이 가지고 놀던 코끼리 인형의 이름이다.
  • 방대한 데이터를 서버에 보내는 것보다 여러개의 서버를 구매해 직접 서버들에 데이터를 저장하는게 더 비용이 저렴하기에 가능한 방법
  • 데이터가 서버 파일시스템에 저장되어있다. → 네트워크 지연속도 감소
  • 각 서버에서 계산된 결과를 중간서버에서 병합만 되면된다. → 처리속도 감소
 
  • 하둡의 주요 관점
      1. 빅데이터를 읽고 쓰기
      1. 특정 Block이 고장났을때도 온전히 데이터를 제공해야한다.
      1. 사용자가 많아져도 속도를 보장해야한다.
       

하둡 구성요소

하둡 분산형 파일시스템(Hadoop Distributed FileSystem, HDFS)

  • 하둡(High-Availability Distributed Object-Oriented Platform) : 네트워크에 연결된 기기에 데이터를 저장하는 분산형 파일시스템
 
  • 위와 같은 배경에서 분산된 컴퓨팅 자원에 파일들을 효율적으로 관리하기 위한 파일 시스템이다.
    • window의 FAT32, NTFS, MAC의 AFS와 같은 느낌의 파일 시스템이다.
    • 파일 시스템은 block을 어떻게 나누고, 파일들을 안전하게 보장하기 위해 어떤식으로 관리 하는 역할 수행
    • 분산된 환경에서의 block단위로 나누는것, 나뉜 block들을 안전하게 보장하고 관리하는것이 목적이며, 지금부터 이에 대해 알아보자.
    •  
  • 특징
    • 1. HDFS는 데이터를 저장하면, 다수의 노드에 복제 데이터도 함께 저장해서 데이터 유실을 방지
      2. HDFS에 파일을 저장하거나, 저장된 파일을 조회하려면 스트리밍 방식으로 데이터에 접근해야 함.
      3. 한번 저장한 데이터는 수정할 수 없고, 읽기만 가능하게 해서 데이터 무결성을 유지.
      (2.0 알파버전부터는 저장된 파일에 append가 가능하게 됨)
      4. 데이터 수정은 불가능 하지만 파일이동, 삭제, 복사할 수 있는 인터페이스를 제공함.
1. 블록 구조의 파일 시스템으로, 저장하는 파일은 특정 사이즈의 블록으로 나눠져 분산된 서버에 저장됨.
2. 하나의 블록은 3개(수정 가능)로 복제되며, 각각 다른 HDFS의 노드에 분산저장됨
3. HDFS에는 마스터 역할을 하는 네임노드 서버 한 대와, 슬레이브 역할을 하는 데이터노드 서버가
여러 대로 구성된다.
4. 네임 노드는 HDFS의 모든 메타데이터(블록들이 저장되는 디렉토리의 이름, 파일명등..)를 관리하고,
클라이언트가 이를 이용하여 HDFS에 저장된 파일에 접근할 수 있음.
5. 하둡 어플리케이션은 HDFS에 파일을 저장하거나, 저장된 파일을 읽기 위해 HDFS 클라이언트를
사용하며, 클라이언트는 API형태로 사용자에게 제공됨.
6. 데이터 노드는 주기적으로 네임노드에서 블록 리포트(노드에 저장되어 있는 블록의 정보)를 전송하고 이를 통해 네임노드는 데이터 노드가 정상 동작하는지 확인.
 
  • small files이 많은 경우 좋지않다.
  • disk i/o가 발생하기에 레이턴시 발생 가능성 → Spark을 사용할 경우 memory에 데이터를 올려 어느정도 개선

아키텍처

 
  1. 블록 구조의 파일 시스템으로, 저장하는 파일은 특정 사이즈의 블록으로 나눠져 분산된 서버에 저장됨.
  1. 하나의 블록은 3개(수정 가능)로 복제되며, 각각 다른 HDFS의 노드에 분산저장됨
  1. HDFS에는 마스터 역할을 하는 네임노드 서버 한 대와, 슬레이브 역할을 하는 데이터노드 서버가 여러 대로 구성된다.
  1. 네임 노드는 HDFS의 모든 메타데이터(블록들이 저장되는 디렉토리의 이름, 파일명등..)를 관리하고, 클라이언트가 이를 이용하여 HDFS에 저장된 파일에 접근할 수 있음.
  1. 하둡 어플리케이션은 HDFS에 파일을 저장하거나, 저장된 파일을 읽기 위해 HDFS 클라이언트를 사용하며, 클라이언트는 API형태로 사용자에게 제공됨.
  1. 데이터 노드는 주기적으로 네임노드에서 블록 리포트(노드에 저장되어 있는 블록의 정보)를 전송하고 이를 통해 네임노드는 데이터 노드가 정상 동작하는지 확인.
  1. 클라이언트는 네임노드에 접속해서 원하는 파일이 저장된 블록의 위치를 확인하고, 해당 블록이 저장된 데이터 노드에서 직접 데이터를 조회함.
      • 네임노드가 장애시, 모든 메타가 날라가 장애가 난다. 고가용성, 백업을 확보해야한다.
 

파일 저장 플로우

1. 어플리케이션이 HDFS 클라이언트에게 파일 저장을 요청하면,
HDFS 클라이언트는 네임노드에게 파일 블록들이 저장될 경로 생성을 요청.
네임노드는 해당 파일 경로가 존재하지 않으면 경로를 생성한 후,
다른 클라이언트가 해당 경로를 수정하지 못하도록 락을 검.
그 후, 네임노드는 클라이언트에게 해당 파일 블록들을 저장할 데이터노드의 목록을 반환
2. 클라이언트는 첫 번째 데이터 노드에게 데이터를 전송
3. 첫 번째 데이터 노드는 데이터를 로컬에 저장한 후, 데이터를 두 번째 데이터 노드로 전송
4. 두 번째 데이터 노드는 데이터를 로컬에 저장한 후, 데이터를 세 번째 데이터 노드로 전송
6. 로컬에 데이터를 저장하였으면 자기에게 데이터를 넘겨준 데이터 노드에게,
데이터의 로컬 저장이 완료 되었음을 응답
7. 첫 번째 데이터 노드는 클라이언트에게 파일 저장이 완료 되었음을 응답.
 

파일 읽기 플로우

1. 어플리케이션이 클라이언트에게 파일 읽기를 요청
2. 클라이언트는 네임노드에게 요청된 파일이 어떤 블록에 저장되어 있는지 정보를 요청
3. 메타데이터를 통해 파일이 저장된 블록 리스트를 반환
4. 클라이언트는 데이터 노드에 접근하여 블록 조회 요청
5. 데이터 노드는 클라이언트에게 요청된 블록을 전송
6. 클라이언트를 어플리케이션에 데이터를 전달
 
 
 

맵리듀스(MapReduce)

  • 대용량의 데이터 처리를 위한 분산 프로그래밍 모델, 분산 컴퓨팅 환경에서 어떠한 알고리즘을 최대한 분산 처리하기 위한 소프트웨어 프레임워크
    • 맵리듀스 프레임워크를 이용하면 대규모 분산 컴퓨팅 환경에서, 대량의 데이터를 병렬로 분석 하기위한 알고리즘 컨셉이다.
  • 프로그래머가 직접 작성하는 맵과 리듀스 라는 두 개의 메소드로 구성
 
  • 하둡에코시스템의 기본적인 페러타임 spark의 경우도 동일하다
  • 전통적인 병령 프로그래밍은 전문가의 skill이 필요하다.
    • ex) 멀티쓰레드, 동기화 메커니즘, 락, semaphores, monitors 등
    • 잘못한 경우 프로그램 전체 crash
    • 오류시 복구가 어려웠다
  • 맵리듀스는 이러한 병렬처리에 대해 쉽게 다룰수 있게 제공되는 프로그래밍 모델이다. 위 문제들을 크게 신경쓰지 않아도 도니.

맵(Map)

  • 흩어져 있는 데이터를 연관성 있는 데이터들로 분류하는 작업(key, value의 형태)

리듀스(Reduce)

  • Map에서 출력된 데이터를 중복 데이터를 제거하고 원하는 데이터를 추출하는 작업.
 

Word count(검색을 위해 필요) 진행을 map-reduce 방식으로 진행한 예시

 
위의 프로세스는, 문자열 데이터에 포함된 단어의 빈도수를 출력해주는 과정
1. Splitting : 문자열 데이터를 라인별로 나눈다.
2. Mapping : 라인별로 문자열을 입력받아, <key, value> 형태로 출력.
3. Shuffling : 같은 key를 가지는 데이터끼리 분류.
4. Reducing : 각 key 별로 빈도수를 합산해서 출력.
5. Final Result : 리듀스 메소드의 출력 데이터를 합쳐서 하둡 파일 시스템에 저장.
 

선형회귀, 로지스틱 회귀 등을 map-reduce 방식으로 진행한 예시

 

맵 리듀스의 잡(Job)

  • Client가 수행하려는 작업단위(입력데이터, 맵리듀스 프로그램, 설정 정보로 구성)

맵 리듀스 시스템 구성

  • 맵 리듀스 시스템은 Client, JobTracker, TaskTracker 로 구성된다.
  • JobTracker는 NameNode에, TaskTracker는 DataNode에 위치한다
 
  • Client : 분석하고자 하는 데이터를 잡의 형태로 JobTracker에게 전달
  • JobTracker : 하둡 클러스터에 등록된 전체 job을 스케줄링하고 모니터링
  • TaskTracker : DataNode에서 실행되는 데몬이고, 사용자가 설정한 맵리듀스 프로그램을 실행
  • JobTracker로부터 작업을 요청받고 요청받은 맵과 리듀스 개수만큼 맵 태스크와 리듀스 태스크를 생성
 

Hadoop YARN

  • 하둡클러스터에 올라간 어플리케이션들에 대한 리소스 모니터링 클러스터
 

Apach Spark

  • UC Berkely에서 2009에 시작
  • 기존 Map Reduce보다 더 빠르게 computing 해보자
    • 더 복잡하고 multi-stage한 처리 (머신러닝, 그래프 등)
    • interactive 하고 ad-hoc 한 쿼리 해결 필요
  • ML의 경우 으로 데이터를 접근해서 처리해야하는데, 기존 하둡구조는 disk에 매번 i/o를 발생시켰다.
    • 디스크 기준 10배, 인메모리 기준 100배 (램 가격이 싸지면서... 메모리에서 처리하는 프래임 워크들이 많아지는 시기였다.)
  • Java, Scala ,Python/R 다양한 언어로 엑세스 가능
  • 하둡에 쉽게 통합할수 있다.
  • 오픈소스 분산 다목적 클러스터 컴퓨팅 프레임워크
notion image
 

Core concept - Lazy Evaluation

  • 병렬 컴퓨팅 환경에서 가능하면 disk I/O를 최소화 하고, 메모리를 활용하기 위한 컨셉
  • 가능하면 최종 데이터를 가져와서 일을 해야할때까지, 중간 로직 정보(리니지)만 가지고 있고, 계산하고 있지 않음. 가능하면 최대한 lazy 하게
    • 중간단계를 메모리에 오래 가지고 있을수록 소실되어 다시 disk에서 가져올 가능성을 줄임
  • 리니지 정보를 기반으로, 실행 직전 spark 엔진에서 최적화된 알고리즘으로 최적화 한후(쿼리 옵티마이저와 비슷한 개념), ① 가능하면 최소한의 disk I/O ②가능하면 최대한 효율적인메모리 연산을 활용하여, 로직 실행
 
 
추후 spark 관련 detail 내용 추가 작성 예정
 
 

참고 자료