핀아의 저장소 ( •̀ ω •́ )✧

[Hadoop] 하둡(Hadoop) 이론 본문

Big Data/Engineering

[Hadoop] 하둡(Hadoop) 이론

_핀아_ 2023. 5. 11. 22:22

Hadoop이란?

  • 분산환경에서 빅데이터를 저장하고 처리할 수 있는 자바 기반의 오픈 소스 프레임워크로 하둡 소프트웨어 라이브러리는 간단한 프로그래밍 모델을 사용하여 여러대의 컴퓨터 클러스터에 대규모 데이터세트를 분산 처리할 수 있게 해주는 프레임워크
  • 일반적으로 하둡파일시스템(HDFS)과 맵리듀스(MapReduce)프레임워크로 시작되었으나, 여러 데이터 저장, 실행 엔진, 프로그래밍 및 데이터 처리와 같은 Hadoop Ecosystem 전반을 포함하는 의미로 확장 및 발전 됐다.

구성요소

  • 하둡 코어 프로젝트 : HDFS(분산 데이터 저장), MapReduce(분산 처리)
  • 하둡 서브 프로젝트 : 데이터 마이닝, 수집, 분석 등 수행하는 프로젝트들

1️⃣ 하둡 분산형 파일 시스템(Hadoop Distributed File System, HDFS)

  • 수십 테라 또는 페타바이트 이상의 대용량 파일을 분산된 서버에 저장하고, 많은 클라이언트가 저장된 데이터를 빠르게 처리할 수 있게 설계된 파일 시스템을 말한다.
  • 하둡 분산 파일 시스템은 하둡 프레임워크를 위해 자바 언어로 작성된 분산 확장 파일 시스템이다. HDFS는 여러 기계에 대용량 파일을 나눠서 저장을 한다. 데이터들을 여러 서버에 중복해서 저장함으로써 데이터 안정성을 얻는다.

 특징

  1. 데이터를 저장하면, 다수의 노드에 복제데이터도 함께 저장해서 데이터 유실방지
  2. 파일을 저장하거나, 저장된 파일을 조회하려면 스트리밍 방식으로 데이터에 접근
  3. 한번 저장한 데이터는 수정할 수 없고, 읽기만 가능해서 데이터 무결성 유지
  4. 데이터 수정은 불가능하지만 파일 이동, 삭제, 복사할 수 있는 인터페이스 제공

 아키텍쳐 

  • HDFS는 마스터/슬레이브(master/slave)구조
  • DFS 클러스터는 하나의 네임 노드와 파일 시스템을 관리하고 클라이언트의 접근을 통제하는 마스터 서버로 구성
  • 클러스터의 각 노드에는 데이터 노드가 하나씩 존재하고, HDFS는 네임스페이스를 공개해서 유저 데이터가 파일에 저장되는 것을 허락

데이터 노드(Data Node)
: 노드에 추가되는 스토리지를 관리, 파일 시스템의 클라이언트가 요구하는 읽기(read), 쓰기(write) 기능을 담당한다. 또한 데이터 노드는 네임 노드에서의 생성, 삭제, 복제 등과 같은 기능도 수행한다.

네임 노드(Name Node)
: 파일과 디렉터리의 읽기(open), 닫기(close), 이름 바꾸기(rename) 등 파일 시스템의 네임프세이스의 여러 기능을 수행한다. 또한 데이터 노드와 블록들의 맵핑을 결정한다.

→ 네임노드와 데이터노드는 GNU/Linux OS를 기반으로 하는 상용 버신에서 실행하기 위해 디자인된 스프트웨어의 일부다. HDFS는 자바 언어를 사용하므로 자바가 동작하는 어떠한 컴퓨터에서나 네임노드나 데이터노드 소프트웨어를 실행할 수 있다.

파일 저장 플로우

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

파일 읽기 플로우

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

 하트비트(HeartBeat)

  • 데이터 노드는 네임노드에게 하트비트를 3초마다 보낸다. 하트비트에는 디스크 가용 공간 정보, 데이터 이동, 적재량 등의 정보가 들어있다.
  • 핸드 셰이킹에 사용된다. 10초 이상 못받으면 사용하지 못한다고 인식한다.

2️⃣ 맵 리듀스(MapReduce)

  • 대용량의 데이터 처리를 위한 분산 프로그래밍 모델, 소프트웨어 프레임워크 프로그래머가 직접 작성하는 맵과 리듀스라는 두개의 메소드로 구성→ 필터링과 sorting을 거쳐 데이터를 뽑아내는(Reduce) 분산처리 기술과 관련 프레임워크를 의미
  • 흩어져있는 데이터를 수직화하여, 그 데이터를 각각의 종류별로 모으고(Map)
  • 맵리듀스 프레임워크를 이용하면 대규모 분산 컴퓨팅 환경에서 대량의 데이터를 병렬로 분석 가능

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

리듀스(Reduce)
: Map에서 출력된 데이터에서 중복 데이터를 제거하고 원하는 데이터를 추출하는 작업

 맵리듀스 잡(MapReduce Job) : Client 수행 작업 단위

  • 클라이언트가 수행하려는 작업 단위로써, 입력 데이터, 맵리듀스 프로그램, 설정 정보로 구성되어있다.
  • 하둡은 Job을 Map Task와 Reduce Task로 작업을 나누어서 실행한다.
  • Job 실행 과정을 "제어"해주는 노드
  • 맵 리듀스 시스템은 Client, JobTracker, TaskTracker로 구성

클라이언트(Client) : 분석하고자 하는 데이터를 잡(JOB)의 형태로 JobTracker에게 전달

잡 트래커(Job Tracker) : 네임노드에 위치. 하둡 클러스터에 등록된 전체 잡(job)을 스케줄링하고 모니터링

태스크 트래커(Task Tracker) : 데이터노드에서 실행되는 데몬. Task를 수행하고, 잡 트래커에게 상황 보고

Hadoop Ecosystem이란?

  • Hadoop 환경에서 빅데이터 문제를 효율적으로 다루기 위해 만들어진 서브 프로젝트들의 집합이다.
  • 이중 가장 핵심 요소는 규모의 데이터를 수용할 수 있는 분산파일 시스템인 Hadoop Distributed File System(HDFS)와 그것을 처리할 수 있게 해주는 MapReduce이다.
  • 이를 중심으로 분산 코디네이터, 워크플로우 관리, 분산 리소스 관리, 데이터 마이닝, 분석, 수집, 직렬화 등 다양한 서비스들로 구성되어 있다.

1️⃣ Distributed File System

Hadoop의 스토리지 컴포넌트로 확장성과 장애 허용성을 가진 분산 파일시스템

  1. 대규모 데이터 분석이라는 Hadoop의 원래 용도에 맞게 HDFS는 일반적으로 상당히 긴 Sequential Access 방식을 통해 디스크에 불변 데이터를 저장하는데 최적화 되어 있다. HDFS는 Hadoop Stack 내 다른 컴포넌트를 지원하는 핵심 기술
  2. HDFS는 데이터 회복성과 병렬 처리를 위해 여러 대의 서버에 각 블록의 복제본을 저장 → 기본 값은 3이므로, 1G의 데이터를 저장하기 위해서는 총 3G의 용량이 필요
  3. 로컬 스토리지를 포함하는 데이터 노드를 클러스터에 추가하면 파일시스템 용량이 늘어나므로 확장성

2️⃣ Distributed Programming

MapReduce

  1. Hadoop은 빅데이터를 다루기 위해 구글에서 발표한 MapReduce 알고리즘을 이용 → 병렬 프로그래밍으로 클러스터 내에서 쉽게 분산 처리를 할 수 있도록 도와준다. 분할 정복 방식으로 작동하며, 시스템에서 프로세스를 실행하여 네트워크의 트래픽을 줄임
  2. Map 단계에서는 필터링, 그룹화, 정렬 → Input 데이터가 들어오면 Split하여 Map을 만들게 된다. 각 Map들은 각자 다른 노드에서 Key-Value 짝을 맺어 출력하는 Task를 진행하고, 같은 Key를 가지는 데이터끼리 분류하는 Shuffling 과정을 거쳐 최종적으로 분산
  3. Reduce 단계를 거쳐 병합되어 HDFS에 저장

YARN (Yet Another Resource Negotiator)

YARN은 Hadoop 내 작업 스케쥴링, 클러스터 리소스 관리를 위한 프레임워크

  1. 한정된 자원에서 가용 연산 자원의 용량과 필요한 워크로드를 관리하여 다양한 연산이 동시에 실행될 수 있도록 돕는 중앙 클러스터 매니저 역할 → 자원의 사용 효율성을 높이고 데이터 접근 비용을 낮출 수 있다.
  2. YARN은 각 워커 노드에 노드매니저 데몬을 실행시키고, 이 데몬들이 마스터 프로세스인 리소스매니저에 여러 정보를 보고 한다.
노드 매니저(Node Manager)
: 가상 코어의 단위로 얼마나 많은 연산 자원을 사용할 수 있는지와 해당 노드에 메모리가 얼마나 남아있는지를 리소스매니저에게 알려준다. 또한 로컬 노드에 있는 컨테이너를 기동하여 모니터링하면서 할당 자원을 초과하는 컨테이너는 중단된다.
→ 가용 자원은 클러스터 내 실행되는 애플리케이션에 컨테이너 형태로 분할되어 제공된다.

Spark

Apache Spark는 통합 컴퓨팅 엔진으로 클러스터 환경에서 데이터를 병렬로 처리하는 라이브러리 집합이다. 현재 가장 활발하게 개발되고 있는 분산 처리 오픈소스 엔진이다.

  1. Spark는 Python, Java, Scala, R을 지원하며 SQL뿐 아니라 스트리밍, 머신러닝에 이르는 넓은 범위의 라이브러리를 제공
  2. Spark는 MapReduce처럼 Job에 필요한 데이터를 디스크에서 매번 가져오는 대신, 데이터를 메모리에 캐시로 저장하는 인-메모리 실행 모델로 성능을 비약적으로 향상 → MapReduce보다 10~100배까지 빠르다고 평가 , 일괄 처리 작업이나 데이터 마이닝 같은 온라인 분석처리(OLAP)에 유용
  3. Spark는 Standalone이나 Hadoop YARN 클러스터, Apache Mesos 클러스터 등 다양한 유형의 클러스터 매니저를 사용가능

Pig

Apache Pig는 Hadoop에 기반하여 병렬로 데이터를 처리하는 엔진

  1. 데이터를 처리하기 위해 MapReduce 프로그래밍 대신 SQL과 유사한 Pig Latin이라는 자체 스크립트 언어로 처리하는 것이 특징
  2. Pig는 서버로 동작하지 않고 단순 변환기 수준의 애플리케이션으로 실행되고, 작성된 Pig Latin를 해석하여 MapReduce로 변환하여 실행시켜 복잡한 MapReduce 프로그래밍을 간단하게 처리
  3. Hadoop의 의존성이 있으므로 Pig 사용 시 Hadoop의 버전을 고려

Storm

Apache Storm은 클로저 프로그래밍 언어로 작성된 분산형 스트림 프로세싱 연산 프레임워크

  1. Storm은 YARN 위에서 주로 실시간 분석, Machine Learning, 운영 모니터링 용도로 사용 → 사용자가 정의한 Spout과 Bolt를 사용하여 스트리밍 데이터의 일괄, 분산 처리를 가능하게 하며, 인-메모리 기반으로 실시간 처리 방식
  2. 어떠한 언어로든 사용자의 기호에따라 Storm을 조작
  3. Storm의 스트림 처리 모델은 Topology라고 하는 프레임워크에서 DAG(Directed Acyclic Graphs)에 의해 관리 → Topology는 들어오는 데이터가 시스템에 입력 될 때마다 수행되는 다양한 변환 또는 단계를 설명

3️⃣ NoSQL Databases

Hbase

Apache HBase는 HDFS 위에 만들어진 비관계형 오픈소스 데이터베이스

  1. HBase는 NoSQL로 분류되어 스키마 변경 없이 자유롭게 데이터를 저장
  2. 구조화된 대용량의 데이터에 빠른 임의접근을 제공하는 구글의 BigTable과 비슷한 데이터 모델을 가지며, HDFS에 대한 실시간 읽기/쓰기 기능을 제공
  3. Hbase는 압축, 인-메모리 처리, 초기 BigTable에 제시되어 있는 Bloom 필터 기능을 제공
  4. HBase에 있는 테이블들은 Hadoop에서 동작하는 MapReduce 작업을 위한 입출력을 제공하며, Java API나 REST, AVro 또는 Thrift 게이트웨이를 통해 접근 가능
  5. 분산 환경에서 Zookeeper를 이용하여 고가용성을 보장하고, Membership 정보 저장, Dead Server 탐지, Master 선출 및 복구 기능을 지원
  6. 성능이슈가 발생할 경우 서버를 추가하면 성능을 유지할 수 있고, MapReduce의 Input으로 사용하기 편리

Cassandra

  1. Cassandra는 단일 장애점 없이 고성능을 제공하며 수 많은 서버 간의 대용량 데이터를 관리하기 위해 설계 클러스터를 지원하며 마스터리스 비동기 복제를 통해 모든 클라이언트에 대한 낮은 레이턴시 운영을 가능
  2. Cassandra는 Consistent hashing을 이용한 Ring 구조와 Gossip protocol을 구현하였으며, 때문에 각 노드 장비들의 추가, 제거 등이 자유롭고, 데이터센터까지 고려 할 수 있는 데이터 복제 정책을 사용하여 안정성 측면에서 많은 장점
  3. Cassandra는 클러스터 내에서 인증된 유저들에 한해서만 연결을 허용하고, CQL(Cassandra Query Language)을 통해 질의

→ CQL은 SQL과 유사하지만, Join인 Transaction을 지원하지 않고, Index 검색을 위한 기능도 매우 단순하다는 단점

→ 구조상 RDBMS와 같은 Paging을 구현하기 어렵고, Keyspace나 Table을 많이 생성할 경우 Memory Overflow가 발생 가능성 존재

4️⃣ Data Ingestion

Kafka

Apache Kafka는 실시간으로 기록 스트림을 게시, 구독, 저장 및 처리할 수 있는 분산 데이터 스트리밍 플랫폼

  1. 여러 소스에서 데이터 스트림을 처리하고 여러 사용자에게 전달하도록 설계 → A지점에서 B지점까지 이동 뿐아니라 A지점에서 Z지점을 비롯한 필요한 모든 곳에 대규모 데이터를 동시에 이동
  2. Kafka는 Publish-Subscribe 모델을 기반으로 동작하며 크게 Producer, Consumer, Broker로 구성
Broker : Topic을 기준으로 메시지를 관리, 전달받은 메시지를 Topic별로 분류하여 적재

Producer : 특정 Topic의 메시지를 생성한 뒤 해당 메시지를 Broker에 전달

Consumer : 해당 Topic을 구독하는 Consumer들이 메시지를 가져가 처리

Sqoop

Apache Sqoop은 구조화된 관계형 데이터베이스와 Apache Hadoop간의 대용량 데이터들을 효율적으로 변환해주는 CLI 애플리케이션

  1. Oracle, MySQL같은 관계형 데이터 베이스에서 HDFS로 데이터들을 가져와 그 데이터들을 MapReduce로 변환하고 Hive, Pig, HBase에 저장할 수 있으며, 그 변환된 데이터들을 다시 관계형 데이터 베이스로 내보냄
  2. Sqoop은 데이터의 가져오기와 내보내기를 MapReduce를 통해 처리하여 장애 허용 능력뿐만 아니라 병렬 처리가 가능

Flume

Apache Flume은 많은 양의 로그 데이터를 효율적으로 수집, 취합, 이동하기 위한 분산형 소프트웨어

  1. 구조가 단순하고 유연한 스트리밍 데이터 플로우 아키텍쳐
  2. 튜닝 가능한 신뢰성 매커니즘과 수많은 대체작동(Failover) 및 복구 매커니즘을 갖추고 있어 고장 방지 기능이 제공
  3. Flume은 JVM 프로세스인 Flume Agent가 실행되어 Source, Channel, Sink 컴포넌트를 호스트
Source : 수집 대상으로부터 로그를 수신

Channel : Source와 Sink간의 버퍼로서 의존성을 제거하고 장애를 대비

Sink : 로그를 다음 목적지로 전달할 때까지 로그를 보관하며, 수집된 로그를 HDFS와 같은 다음 목적지에 전달

5️⃣ SQL-On-Hadoop

Hive

Apache Hive는 Hadoop에서 동작하는 Data Warehouse 인프라 구조

  1. 데이터 요약, 질의 및 분석 기능을 제공
  2. Hive는 HDFS나 HBase와 같은 데이터 저장 시스템에 저장되어 있는 대용량 데이터 집합들을 분석
  3. SQL과 유사한 HiveQL을 통해 질의하게되며, MapReduce의 모든 기능을 지원
  4. 쿼리를 빠르게 하기 위해 비트맵 인덱스를 포함하여 인덱스 기능을 제공
  5. 기본적으로 Hive는 메타데이터를 내장된 아파치 더비(Derby) 데이터 베이스에 저장 → MySQL과 같은 다른 서버/클라이언트 데이터 베이스를 사용 가능성
  6. TEXTFILE, SEQUENCEFILE, ORC, RCFILE 등 4개의 파일 포맷을 지원

Impala

Apache Impala는 Hadoop에서 실행하는 컴퓨터 클러스터에 저장된 데이터를 오픈소스 대규모 병렬처리(MPP) SQL 쿼리 엔진

  1. Hadoop에 스케일링 가능한 병렬 데이터베이스 기술을 도입합으로써 데이터 이동이나 전송 과정 없이 사용자들이 낮은 레이턴시의 SQL 쿼리를 HDFS과 아파치 HBase에 저장된 데이터에 발행
  2. Impala는 HiveQL을 통해 질의할 수 있으며, C++로 설계된 자체 분산 질의 엔진이 모든 데이터 노드에서 설치되어 MapReduce 프로그래밍이 불필요

6️⃣ Scheduling

Zookeeper

Apache ZooKepper는 공개 분산형 구성 서비스, 동기 서비스 및 대용량 분산 파일시스템을 위한 네이밍 레지스트리를 제공하는 중앙 집중식 서비스(분산 코디네이터)

  1. ZooKeeper의 아키텍쳐는 중복 서비스를 이용한 고가용성을 제공
  2. 클라이언트는 JooKeeper 마스터가 응답을 하지 않으면 다른 마스터에 요청 → ZooKeeper 노드들은 파일 시스템이나 트리 데이터구조와 비슷한 구조의 네임스페이스 안에 데이터들을 저장
  3. ZooKeeper는 HBase의 클러스터 마스터를 선출하는데 사용되기도 하고, Kafka에서 서버의 크래시를 감지하거나 새로운 토픽이 생성되었을 때, 토픽의 생성과 소비에 대한 저장을 위해 사용

Oozie

Apache Oozie는 Hadoop의 Job을 관리하기 위한 서버 기반 워크플로우 스케쥴링 시스템

  1. Ooize의 워크플로우는 DAG에서 제어흐름과 액션 노드의 모임으로 정의
  2. Oozie는 Hadoop MapReduce, HDFS 조작, Pig, SSH, 이메일을 포함한 각기 다른 종류의 액션을 제공
제어 흐름 노드 : 워크플로우의 시작과 끝 그리고 워크플로우 실행 경로를 제어하기 위한 구조를 정의

액션노드 : 워크플로우가 계산/처리 작업의 실행을 명령하는 매커니즘

7️⃣ Machine Learning

Mahout

  • Apache Mahout은 Hadoop 내에서 분산처리가 가능하고 확장성을 가진 ML 라이브러리
  • MapReduce를 이용하여 적용되며, 데이터 전처리, 분류, 회귀, 군집, 협업 필터링 알고리즘을 지원

'Big Data > Engineering' 카테고리의 다른 글

01_02. 병렬처리에서 분산처리까지  (0) 2023.05.12
01_01. Spark와 RDD  (0) 2023.05.12
00_04. 프로젝트 INTRO  (1) 2023.05.11
00_03. Dataflow Orchestration  (0) 2023.05.11
00_02. Batch & Stream Processing  (0) 2023.05.09
Comments