핀아의 저장소 ( •̀ ω •́ )✧
[Hadoop] 하둡(Hadoop) 이론 본문
Hadoop이란?
- 분산환경에서 빅데이터를 저장하고 처리할 수 있는 자바 기반의 오픈 소스 프레임워크로 하둡 소프트웨어 라이브러리는 간단한 프로그래밍 모델을 사용하여 여러대의 컴퓨터 클러스터에 대규모 데이터세트를 분산 처리할 수 있게 해주는 프레임워크
- 일반적으로 하둡파일시스템(HDFS)과 맵리듀스(MapReduce)프레임워크로 시작되었으나, 여러 데이터 저장, 실행 엔진, 프로그래밍 및 데이터 처리와 같은 Hadoop Ecosystem 전반을 포함하는 의미로 확장 및 발전 됐다.
✅ 구성요소
- 하둡 코어 프로젝트 : HDFS(분산 데이터 저장), MapReduce(분산 처리)
- 하둡 서브 프로젝트 : 데이터 마이닝, 수집, 분석 등 수행하는 프로젝트들
1️⃣ 하둡 분산형 파일 시스템(Hadoop Distributed File System, HDFS)
- 수십 테라 또는 페타바이트 이상의 대용량 파일을 분산된 서버에 저장하고, 많은 클라이언트가 저장된 데이터를 빠르게 처리할 수 있게 설계된 파일 시스템을 말한다.
- 하둡 분산 파일 시스템은 하둡 프레임워크를 위해 자바 언어로 작성된 분산 확장 파일 시스템이다. HDFS는 여러 기계에 대용량 파일을 나눠서 저장을 한다. 데이터들을 여러 서버에 중복해서 저장함으로써 데이터 안정성을 얻는다.
✅ 특징
- 데이터를 저장하면, 다수의 노드에 복제데이터도 함께 저장해서 데이터 유실방지
- 파일을 저장하거나, 저장된 파일을 조회하려면 스트리밍 방식으로 데이터에 접근
- 한번 저장한 데이터는 수정할 수 없고, 읽기만 가능해서 데이터 무결성 유지
- 데이터 수정은 불가능하지만 파일 이동, 삭제, 복사할 수 있는 인터페이스 제공
✅ 아키텍쳐
- HDFS는 마스터/슬레이브(master/slave)구조
- DFS 클러스터는 하나의 네임 노드와 파일 시스템을 관리하고 클라이언트의 접근을 통제하는 마스터 서버로 구성
- 클러스터의 각 노드에는 데이터 노드가 하나씩 존재하고, HDFS는 네임스페이스를 공개해서 유저 데이터가 파일에 저장되는 것을 허락
데이터 노드(Data Node)
: 노드에 추가되는 스토리지를 관리, 파일 시스템의 클라이언트가 요구하는 읽기(read), 쓰기(write) 기능을 담당한다. 또한 데이터 노드는 네임 노드에서의 생성, 삭제, 복제 등과 같은 기능도 수행한다.
네임 노드(Name Node)
: 파일과 디렉터리의 읽기(open), 닫기(close), 이름 바꾸기(rename) 등 파일 시스템의 네임프세이스의 여러 기능을 수행한다. 또한 데이터 노드와 블록들의 맵핑을 결정한다.
→ 네임노드와 데이터노드는 GNU/Linux OS를 기반으로 하는 상용 버신에서 실행하기 위해 디자인된 스프트웨어의 일부다. HDFS는 자바 언어를 사용하므로 자바가 동작하는 어떠한 컴퓨터에서나 네임노드나 데이터노드 소프트웨어를 실행할 수 있다.
✅ 파일 저장 플로우
- 어플리케이션이 HDFS 클라이언트에게 파일 저장을 요청하면, 클라이언트는 네임 노드에게 파일 블록들이 저장될 경로 생성 요청, 네임 노드는 해당 파일 경로가 존재하지 않으면 경로 생성 후 다른 클라이언트가 해당 경로를 수정하지 못하게 lock, 이후 네임노드는 클라이언트에게 해당 파일 블록들을 저장할 데이터 노드의 목록 반환
- 클라이언트는 첫번째 데이터 노드에게 데이터 전송
- 첫번째 데이터 노드는 데이터를 로컬에 저장한 후 데이터를 두번째 데이터 노드로 전송. 이후 계속 전달전달
- 로컬에 데이터를 저장하였면 자기에게 넘겨준 데이터 노드에게 데이터 로컬 저장이 완료되었음을 응답.(ack)
- 첫번째 데이터 노드는 클라이언트에게 데이터 저장이 완료되었음을 응답
✅ 파일 읽기 플로우
- 어플리케이션이 클라이언트에게 파일 읽기 요청
- 클라이언트는 네임 노드에게 요청된 파일이 어떤 블록에 저장되어있는지 정보 요청
- 메타 데이터를 통해 파일이 저장된 블록 리스트를 반환
- 클라이언트는 데이터 노드에 접근하여 블록 조회 요청
- 데이터 노드는 클라이언트에게 요정된 블록을 전송
- 클라이언트는 어플리케이션에 데이터를 전달
✅ 하트비트(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의 스토리지 컴포넌트로 확장성과 장애 허용성을 가진 분산 파일시스템
- 대규모 데이터 분석이라는 Hadoop의 원래 용도에 맞게 HDFS는 일반적으로 상당히 긴 Sequential Access 방식을 통해 디스크에 불변 데이터를 저장하는데 최적화 되어 있다. HDFS는 Hadoop Stack 내 다른 컴포넌트를 지원하는 핵심 기술
- HDFS는 데이터 회복성과 병렬 처리를 위해 여러 대의 서버에 각 블록의 복제본을 저장 → 기본 값은 3이므로, 1G의 데이터를 저장하기 위해서는 총 3G의 용량이 필요
- 로컬 스토리지를 포함하는 데이터 노드를 클러스터에 추가하면 파일시스템 용량이 늘어나므로 확장성
2️⃣ Distributed Programming
✅ MapReduce
- Hadoop은 빅데이터를 다루기 위해 구글에서 발표한 MapReduce 알고리즘을 이용 → 병렬 프로그래밍으로 클러스터 내에서 쉽게 분산 처리를 할 수 있도록 도와준다. 분할 정복 방식으로 작동하며, 시스템에서 프로세스를 실행하여 네트워크의 트래픽을 줄임
- Map 단계에서는 필터링, 그룹화, 정렬 → Input 데이터가 들어오면 Split하여 Map을 만들게 된다. 각 Map들은 각자 다른 노드에서 Key-Value 짝을 맺어 출력하는 Task를 진행하고, 같은 Key를 가지는 데이터끼리 분류하는 Shuffling 과정을 거쳐 최종적으로 분산
- Reduce 단계를 거쳐 병합되어 HDFS에 저장
✅ YARN (Yet Another Resource Negotiator)
YARN은 Hadoop 내 작업 스케쥴링, 클러스터 리소스 관리를 위한 프레임워크
- 한정된 자원에서 가용 연산 자원의 용량과 필요한 워크로드를 관리하여 다양한 연산이 동시에 실행될 수 있도록 돕는 중앙 클러스터 매니저 역할 → 자원의 사용 효율성을 높이고 데이터 접근 비용을 낮출 수 있다.
- YARN은 각 워커 노드에 노드매니저 데몬을 실행시키고, 이 데몬들이 마스터 프로세스인 리소스매니저에 여러 정보를 보고 한다.
노드 매니저(Node Manager)
: 가상 코어의 단위로 얼마나 많은 연산 자원을 사용할 수 있는지와 해당 노드에 메모리가 얼마나 남아있는지를 리소스매니저에게 알려준다. 또한 로컬 노드에 있는 컨테이너를 기동하여 모니터링하면서 할당 자원을 초과하는 컨테이너는 중단된다.
→ 가용 자원은 클러스터 내 실행되는 애플리케이션에 컨테이너 형태로 분할되어 제공된다.
✅ Spark
Apache Spark는 통합 컴퓨팅 엔진으로 클러스터 환경에서 데이터를 병렬로 처리하는 라이브러리 집합이다. 현재 가장 활발하게 개발되고 있는 분산 처리 오픈소스 엔진이다.
- Spark는 Python, Java, Scala, R을 지원하며 SQL뿐 아니라 스트리밍, 머신러닝에 이르는 넓은 범위의 라이브러리를 제공
- Spark는 MapReduce처럼 Job에 필요한 데이터를 디스크에서 매번 가져오는 대신, 데이터를 메모리에 캐시로 저장하는 인-메모리 실행 모델로 성능을 비약적으로 향상 → MapReduce보다 10~100배까지 빠르다고 평가 , 일괄 처리 작업이나 데이터 마이닝 같은 온라인 분석처리(OLAP)에 유용
- Spark는 Standalone이나 Hadoop YARN 클러스터, Apache Mesos 클러스터 등 다양한 유형의 클러스터 매니저를 사용가능
✅ Pig
Apache Pig는 Hadoop에 기반하여 병렬로 데이터를 처리하는 엔진
- 데이터를 처리하기 위해 MapReduce 프로그래밍 대신 SQL과 유사한 Pig Latin이라는 자체 스크립트 언어로 처리하는 것이 특징
- Pig는 서버로 동작하지 않고 단순 변환기 수준의 애플리케이션으로 실행되고, 작성된 Pig Latin를 해석하여 MapReduce로 변환하여 실행시켜 복잡한 MapReduce 프로그래밍을 간단하게 처리
- Hadoop의 의존성이 있으므로 Pig 사용 시 Hadoop의 버전을 고려
✅ Storm
Apache Storm은 클로저 프로그래밍 언어로 작성된 분산형 스트림 프로세싱 연산 프레임워크
- Storm은 YARN 위에서 주로 실시간 분석, Machine Learning, 운영 모니터링 용도로 사용 → 사용자가 정의한 Spout과 Bolt를 사용하여 스트리밍 데이터의 일괄, 분산 처리를 가능하게 하며, 인-메모리 기반으로 실시간 처리 방식
- 어떠한 언어로든 사용자의 기호에따라 Storm을 조작
- Storm의 스트림 처리 모델은 Topology라고 하는 프레임워크에서 DAG(Directed Acyclic Graphs)에 의해 관리 → Topology는 들어오는 데이터가 시스템에 입력 될 때마다 수행되는 다양한 변환 또는 단계를 설명
3️⃣ NoSQL Databases
✅ Hbase
Apache HBase는 HDFS 위에 만들어진 비관계형 오픈소스 데이터베이스
- HBase는 NoSQL로 분류되어 스키마 변경 없이 자유롭게 데이터를 저장
- 구조화된 대용량의 데이터에 빠른 임의접근을 제공하는 구글의 BigTable과 비슷한 데이터 모델을 가지며, HDFS에 대한 실시간 읽기/쓰기 기능을 제공
- Hbase는 압축, 인-메모리 처리, 초기 BigTable에 제시되어 있는 Bloom 필터 기능을 제공
- HBase에 있는 테이블들은 Hadoop에서 동작하는 MapReduce 작업을 위한 입출력을 제공하며, Java API나 REST, AVro 또는 Thrift 게이트웨이를 통해 접근 가능
- 분산 환경에서 Zookeeper를 이용하여 고가용성을 보장하고, Membership 정보 저장, Dead Server 탐지, Master 선출 및 복구 기능을 지원
- 성능이슈가 발생할 경우 서버를 추가하면 성능을 유지할 수 있고, MapReduce의 Input으로 사용하기 편리
✅ Cassandra
- Cassandra는 단일 장애점 없이 고성능을 제공하며 수 많은 서버 간의 대용량 데이터를 관리하기 위해 설계 클러스터를 지원하며 마스터리스 비동기 복제를 통해 모든 클라이언트에 대한 낮은 레이턴시 운영을 가능
- Cassandra는 Consistent hashing을 이용한 Ring 구조와 Gossip protocol을 구현하였으며, 때문에 각 노드 장비들의 추가, 제거 등이 자유롭고, 데이터센터까지 고려 할 수 있는 데이터 복제 정책을 사용하여 안정성 측면에서 많은 장점
- Cassandra는 클러스터 내에서 인증된 유저들에 한해서만 연결을 허용하고, CQL(Cassandra Query Language)을 통해 질의
→ CQL은 SQL과 유사하지만, Join인 Transaction을 지원하지 않고, Index 검색을 위한 기능도 매우 단순하다는 단점
→ 구조상 RDBMS와 같은 Paging을 구현하기 어렵고, Keyspace나 Table을 많이 생성할 경우 Memory Overflow가 발생 가능성 존재
4️⃣ Data Ingestion
✅ Kafka
Apache Kafka는 실시간으로 기록 스트림을 게시, 구독, 저장 및 처리할 수 있는 분산 데이터 스트리밍 플랫폼
- 여러 소스에서 데이터 스트림을 처리하고 여러 사용자에게 전달하도록 설계 → A지점에서 B지점까지 이동 뿐아니라 A지점에서 Z지점을 비롯한 필요한 모든 곳에 대규모 데이터를 동시에 이동
- Kafka는 Publish-Subscribe 모델을 기반으로 동작하며 크게 Producer, Consumer, Broker로 구성
Broker : Topic을 기준으로 메시지를 관리, 전달받은 메시지를 Topic별로 분류하여 적재
Producer : 특정 Topic의 메시지를 생성한 뒤 해당 메시지를 Broker에 전달
Consumer : 해당 Topic을 구독하는 Consumer들이 메시지를 가져가 처리
✅ Sqoop
Apache Sqoop은 구조화된 관계형 데이터베이스와 Apache Hadoop간의 대용량 데이터들을 효율적으로 변환해주는 CLI 애플리케이션
- Oracle, MySQL같은 관계형 데이터 베이스에서 HDFS로 데이터들을 가져와 그 데이터들을 MapReduce로 변환하고 Hive, Pig, HBase에 저장할 수 있으며, 그 변환된 데이터들을 다시 관계형 데이터 베이스로 내보냄
- Sqoop은 데이터의 가져오기와 내보내기를 MapReduce를 통해 처리하여 장애 허용 능력뿐만 아니라 병렬 처리가 가능
✅ Flume
Apache Flume은 많은 양의 로그 데이터를 효율적으로 수집, 취합, 이동하기 위한 분산형 소프트웨어
- 구조가 단순하고 유연한 스트리밍 데이터 플로우 아키텍쳐
- 튜닝 가능한 신뢰성 매커니즘과 수많은 대체작동(Failover) 및 복구 매커니즘을 갖추고 있어 고장 방지 기능이 제공
- Flume은 JVM 프로세스인 Flume Agent가 실행되어 Source, Channel, Sink 컴포넌트를 호스트
Source : 수집 대상으로부터 로그를 수신
Channel : Source와 Sink간의 버퍼로서 의존성을 제거하고 장애를 대비
Sink : 로그를 다음 목적지로 전달할 때까지 로그를 보관하며, 수집된 로그를 HDFS와 같은 다음 목적지에 전달
5️⃣ SQL-On-Hadoop
✅ Hive
Apache Hive는 Hadoop에서 동작하는 Data Warehouse 인프라 구조
- 데이터 요약, 질의 및 분석 기능을 제공
- Hive는 HDFS나 HBase와 같은 데이터 저장 시스템에 저장되어 있는 대용량 데이터 집합들을 분석
- SQL과 유사한 HiveQL을 통해 질의하게되며, MapReduce의 모든 기능을 지원
- 쿼리를 빠르게 하기 위해 비트맵 인덱스를 포함하여 인덱스 기능을 제공
- 기본적으로 Hive는 메타데이터를 내장된 아파치 더비(Derby) 데이터 베이스에 저장 → MySQL과 같은 다른 서버/클라이언트 데이터 베이스를 사용 가능성
- TEXTFILE, SEQUENCEFILE, ORC, RCFILE 등 4개의 파일 포맷을 지원
✅ Impala
Apache Impala는 Hadoop에서 실행하는 컴퓨터 클러스터에 저장된 데이터를 오픈소스 대규모 병렬처리(MPP) SQL 쿼리 엔진
- Hadoop에 스케일링 가능한 병렬 데이터베이스 기술을 도입합으로써 데이터 이동이나 전송 과정 없이 사용자들이 낮은 레이턴시의 SQL 쿼리를 HDFS과 아파치 HBase에 저장된 데이터에 발행
- Impala는 HiveQL을 통해 질의할 수 있으며, C++로 설계된 자체 분산 질의 엔진이 모든 데이터 노드에서 설치되어 MapReduce 프로그래밍이 불필요
6️⃣ Scheduling
✅ Zookeeper
Apache ZooKepper는 공개 분산형 구성 서비스, 동기 서비스 및 대용량 분산 파일시스템을 위한 네이밍 레지스트리를 제공하는 중앙 집중식 서비스(분산 코디네이터)
- ZooKeeper의 아키텍쳐는 중복 서비스를 이용한 고가용성을 제공
- 클라이언트는 JooKeeper 마스터가 응답을 하지 않으면 다른 마스터에 요청 → ZooKeeper 노드들은 파일 시스템이나 트리 데이터구조와 비슷한 구조의 네임스페이스 안에 데이터들을 저장
- ZooKeeper는 HBase의 클러스터 마스터를 선출하는데 사용되기도 하고, Kafka에서 서버의 크래시를 감지하거나 새로운 토픽이 생성되었을 때, 토픽의 생성과 소비에 대한 저장을 위해 사용
✅ Oozie
Apache Oozie는 Hadoop의 Job을 관리하기 위한 서버 기반 워크플로우 스케쥴링 시스템
- Ooize의 워크플로우는 DAG에서 제어흐름과 액션 노드의 모임으로 정의
- 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 |