하둡(Hadoop) 세부: 하둡의 구조 및 기능 (2/3)
Updated:
- 하둡(hadoop)
- 하둡의 데이터 처리 방식과 구성 요소
- 여러가지 모드(단일, 의사분산/의사, 완전분산)
- 기능의 이해(HDFS, MapReduce)
- 아키텍쳐(HDFS, MapReduce, YARN)
- 에코시스템
하둡의 데이터 처리 방식과 구성 요소
- 데이터 처리 방식
-
데이터 블록 전송 단계 하나의 파일을 여러 블록으로 나누어 클러스터에 있는 데이터 노드들에게 분산 저장
-
데이터 블록 복제 단계 하나의 블록은 여러 개의 복제본을 생성하여 분산 저장
-
프로그램 코드 전송 단계 패키지 된 프로그램 코드를 해당 노드들에게 전달
-
데이터 병렬 처리 단계 데이터를 병렬처리 할 수 있게 함
-
- 구성 요소
- 하둡 공통(Hadoop Common): 하둡 기동 및 셧다운에 필요한 스크립트나 다른 모듈들에게 공통적으로 필요한 라이브러리 및 유틸리티로 JAR파일 형식.(자바 이클립스는 Maven Project로 새 프로젝트를 생성하면 된다.)
- HDFS
- YARN
- 하둡 맵리듀스(Map Reduce)
여러가지 모드
하둡은 세 가지 다른 모드로 사용된다.
- 단일모드(The standalone mode)
- 데몬 프로세스 없이 모든 프로그램이 하나의 JVM위에서 동작하는 모드.
- 이 모드는 테스트 용도로만 추천하며 기본 모드이기 때문에 어떠한 다른 설정도 필요 없다.(분산 운영 모드가 아니므로 실제 환경에서는 부적합하다.)
- HDFS 파일이 아닌 로컬 파일시스템 사용
- NameNode, DataNode, JobTracker, TaskTracker 같은 모든 데몬은 단일 자바 프로세스로 작동한다.
- 의사 분산 모드(Pseudo-distributed mode)
- 1대의 컴퓨터에 하둡 데몬 프로세스가 여러개 분리되어 작동하는 모드. (실제로 물리적으로는 분산되진 않았으나 그런 척 하도록 만드는 것)
- 단일모드와 마찬가지로 싱글노드에서 동작
- HDFS 사용, JVM 단 위에서 여러개의 자바 데몬 프로세스가 작동 가능
- 작은 규모의 클러스터를 테스트, 디버깅 하는 등에 사용
- 완전 분산 모드(Fully distributed mode)
- 하둡 데몬 프로세스가 클러스터로 구성된 여러 컴퓨터에 나누어 동작하는 모드이다.
- 데이터들은 데이터 노드에, 이들에 대한 메타정보는 네임 노드에서 관리하는 운영모드
- 실제 환경에서 동작하고 운영하는 환경
기능의 이해
- 하둡 분산 파일 시스템(HDFS: Hadoop Distributed File System)
- 맵리듀스(MapReduce)
하둡은 위의 두 가지 핵심 개념을 위해 특별히 디자인되었다. 둘 모두 분산 작업에 관련되었다. HDFS의 핵심은 분산 데이터 저장, 맵리듀스는 분산 데이터상에서 병렬처리를 수행하는 하둡의 핵심 부분!
- HDFS
하둡의 자체적인 랙 인식(rack-aware) 파일시스템이며, 하둡의 유닉스 기반 데이터 저장 레이어다. HDFS는 구글 파일시스템 개념에서 유래했다. 하둡의 중요한 특성은 데이터와 연산이 수많은 노드로 분할된다는 점이다. 그리고 애플리케이션 연산은 데이터에 가까운 곳에서 병렬로 실행된다. HDFS에서 데이터 파일은 클러스터에서 연속된 블록으로 복제된다. 하둡 클러스터는 단순히 범용 서버를 추가해 연산 용량, 저장 용량. I/O 대역폭을 확장한다. 애플리케이션에서 HDFS에 접근하는 방법은 많다. 기본적으로 HDFS는 애플리케이션에서 사용할 자바API를 제공한다.
야후는 가장 큰 하둡 클러스터가 4,000대 서버였던 것을 40,000대의 서버로 확장해 40PB의 애플리케이션 데이터를 저장하고 있다. 또한 백여 개 이상의 세계적인 기업들이 하둡을 사용중이다.
- HDFS의 특성
- 내고장성(Fault toletant): 시스템의 일부가 고장이 나도 전체에는 영향을 주지 않고, 항상 시스템의 정상 작동을 유지하는 능력.
- 범용 하드웨어에서 작동
- 큰 데이터 처리 가능
- 마스터 슬레이브 패러다임
- 한 번의 파일 접근 쓰기만 가능
- MapReduce
맵리듀스는 큰 규모의 클러스터에 분산된 대용량 데이터셋을 처리 하기 위한 프로그래밍 모델이다. 맵리듀스의 프로그래밍 패러다임은 하둡 클러스터로 구성된 수천 대의 서버에서 대규모의 데이터 처리를 수행할 수 있게 해준다. 하둡 맵리듀스는 구글 맵리듀스에서 유래했다.
애플리케이션을 쉽게 작성하기 위한 소프트웨어 프레임워크이며, 범용 하드웨어로 이루어진 큰 규모의 클러스터(수천 대의 노드)에서 대량의 데이터(수 테레바이트의 데이터셋)를 신뢰성과 내고장성을 보장하며 병렬로 처리 할 수 있게 한다. 이러한 맵리듀스 패러다임은 맵과 리듀스 단계로 나뉘며 주로 데이터의 키와 밸류의 쌍을 다루는 역할을 한다. 맵과 리듀스 태스크는 클러스터에서 순서대로 실행되며, 맵 단계의 출력이 리듀스 과정의 입력이 된다.
- 맵 과정: 일단 데이터가 분할되고 나서, 데이터셋은 맵 태스크를 수행하기 위해 태스크 트래커에 할당된다. 맵 단계의 출력으로 키와 값 쌍을 쓰면서(emit) 데이터에 대한 기능적인 작업이 수행될 것이다.
- 리듀스 과정: 그 후에 마스터 노드는 모든 하부 문제에 대한 해답을 수집하고 출력을 생성하기 위해 그 해답을 결합한다. 이 출력값이 처음 해결하려고 했던 문제에 대한 해답이다.
병렬로 연산 작업을 수행하는 일반적인 다섯 단계는 다음과 같다
- Map()의 입력을 준비: 입력 데이터가 행 단위로 들어와 각 행에 대해 키와 값 쌍을 써준다. 혹은 요구사항에 따라 명시적으로 변경할 수도 있다.
- 맵 입력: list(k1,v1)
- 사용자가 제공한 Map() 코드를 수행
- 맵 출력: list(k2,v2)
-
리듀스 프로세스를 위해 Map 출력을섞는다(shuffle). 동일한 키로 섞어서 그룹으로 묶고 나서 같은 리듀서에 입력한다.
-
사용자가 제공한 Reduce() 코드를 수행: 이 과정에서는 개발자가 구현한 리듀서 코드가 데이터를 키와 값으로 처리하고 값을 써준다.
- 최종 출력을 생성: 마지막으로 마스터 노드에서 모든 리듀서 출력을 수집하고 텍스트 파일로 쓴다.
- 맵 리듀스의 실행 순서
입력 -> 맵 -> 파이션 -> 셔플링/정렬 -> 리듀스 -> 출력
맵리듀스에서 맵은 독립적이고 병렬로 수행될 것을 가정한다. 맵리듀스 알고리즘의 핵심은 맵과 리듀스가 네트워크상에서 진행 중인 다른 모든 맵과 리듀스에 독립적이라면, 해당 작업이 별도의 키와 리스트의 데이터로써 병렬로 수행될 것이라는 점이다.
분산 파일시스템은 여러개의 데이터 복제본을 각각 다른 컴퓨터에서 나누어 저장하며 이는 내고장성뿐만 아니라 신뢰성도 제공한다. 파일의 한 복사본을 가진 컴퓨터가 고장나면 또 다른 데이터 소스의 복제본이 동일한 데이터를 제공한다.
맵리듀스 마스터 노드의 데몬은 개별 잡 태스크 실패나 배치 잡의 완료뿐만 아니라 잡 실행, 맵퍼(Mapper), 리듀서(Reducer), 컴바이너(Combiner), 파티셔너(Partitioner)와 같은 잡의 스케줄링 그리고 잡 성공 모니터링 등 맵리듀스 잡에 대한 모든 책임을 진다.
아키텍쳐
- HDFS 아키텍쳐
HDFS는 마스터/슬레이브 아키텍쳐로 표현할 수 있다. HDFS 마스터를 네임 노드(NameNode)라고 하고 슬레이브를 데이터 노드(DataNode)라고 한다.
네임 노드(NameNode)는 파일시스템 이름공간을 관리하고 클라이언트의 파일 접근(열기,닫기,이름 바꾸기 등)을 조정한다. 입력 데이터는 불록들로 나뉘며 어느 블록이 어떤 데이터 노드에 저장될 것인지를 알려준다.
데이터 노드(DataNode)는 분할된 데이터셋 복제본을 저장하고 요청에 대해 데이터를 제공해주는 슬레이브 컴퓨터다. 또한 블록 생성과 삭제도 수행한다.
HDFS의 내부적인 메커니즘에 의해서 파일은 하나 이상의 블록으로 나뉘고, 이 블록들은 데이터 노드 그룹에 저장된다. 복제 계수를 3으로 하는 일반적인 환경에서, HDFS 정책은 첫 번째 복사본은 해당 노드에, 두 번째 복사본은 같은 랙의 다른 노드에, 세번째 복사본은 다른 랙에 있는 다른 노드에 저장한다. HDFS가 큰 파일을 지원하도록 디자인되었기 때문에 HDFS 블록 크기는 64MB로 정의된다. 필요에 따라 이 값을 증가시킬 수 있다.
- HDFS 컴포넌트
HDFS는 다음 컴포넌트를 포함하는 마스터/슬레이브 아키텍처로 관리된다.
- 네임 노드: HDFS 시스템의 마스터다. 디렉토리, 파일을 유지하고 데이터 노드에 존재하는 블록을 관리한다.
- 데이터 노드: 각 컴퓨터에 배포되어 실제 스토리지를 제공하는 슬레이브다. 클라이언트로부터 읽기, 쓰기 요청을 처리할 책임이 있다.
- 보조 네임 노드: 주기적으로 체크포인트를 수행할 책임이 있다. 그래서 언제라도 네임 노드가 고장나면, 체크포인트에 저장된 스냅샷 이미지로 대체될 수 있다.
- 맵리듀스 아키텍쳐
맵리듀스 또한 마스터/슬레이브 아키텍처로 구현되었다. 전형적인 맵리듀스는 잡 제출(submission), 잡 초기화, 태스크 할당, 진행 상황 갱신, 잡 완료 연관 활동을 포함하여 주로 잡 트래커에 의해 관리되고 태스크 트래커에 의해 실행된다. 클라이언트 애플리케이션은 잡 트래커에 잡을 제출한다. 그 후 입력이 클러스터 상에 분산된다. 그런 다음 잡 트래커는 처리될 맵과 리듀서의 수를 계산한다. 잡 트래커는 태스크 트래커에게 잡 실행을 시작하도록 명령한다. 태스크 트래커는 리소스를 로컬 컴퓨터에 복사하고, 데이터에 대해 수행할 맙과 리듀스 프로그램을 위해 JVM을 시작한다. 그리고 태스크 트래커는 잡 트래커에게 주기적으로 갱신 메시지를 보내는데 이 메시지는 JobID, 잡 상태, 리소스 사용량을 갱신하는데 도움을 주는 하트비트(heartbeat)로 여길 수 있다.
- 맵 리듀스 컴포넌트
맵리듀스는 다음 컴포넌트를 포함하는 마스터/슬레이브 아키텍처로 관리된다.
- 잡 트래커: 맵리듀스 시스템의 마스터노드이며 클러스터(태스크 트래커)에서 잡과 리소스를 관리한다. 잡 트래커는 각 맵을 처리될 실제 데이터에 가까운 태스크 트래커에 스케줄링하려고 시도해 해당 기반 블록에 대한 데이터 노드와 같은 곳에서 잡을 수행하게 된다.
- 태스크 트래커: 각 컴퓨터에 배포되는 슬레이브다. 잡 트래커의 지시로 맵과 리듀스 태스크를 실행할 책임이 있다.
하지만 버전1 -> 버전2로 버전업되면서 기존 잡트래커의 병목현상을 제거하기 위해 원래는 긴밀하게 붙어있던 HDFS와 맵리듀스 사이에 YARN(yet another resource negotiator) 계층이 추가되어 관리하게 바뀐 것이 1버전과의 구조적으로 가장 큰 차이이다.
- YARN
- 자원을 다양한 응용 프로그램에 효율적으로 할당하려고 노력
- 사용자 응용 프로그램을 효율적으로 스케줄링
- 클러스터의 자원을 컨테이너(Container)로 분할
- 실행 중인 컨테이너 모니터링
- 클러스터의 자원을 컨테이너로 관리하여 분산시스템을 원활하게 운영
- Resource Manager와 Application Master 데몬 실행
소형(노드 20개 이하) 클러스터 환경에서는 네임노드와 리소스 관리자가 동일한 노드에서 수행 가능하나, 중형(노드 20개 초과) 클러스터 환경에서는 두 가지 별도로 운영하는게 바람직하다.
- Resource Manager
- 클러스터에 1개 존재하고, 각 APP 시작을 초기화
- 작업 노드에 있는 자원들을 어떻게 할당할 것인지를 결정(작업 노드의 노드 관리자로 부터 주기적으로 상태를 받음)
- 각 작업의 APP 마스터에 대한 컨테이너를 생성(APP 마스터의 상태를 주기적으로 관찰)
- 컨테이너는 작업 노드의 메모리, CPU 쌍으로 구성(각 작업의 태스크들이 컨테이너를 할당받아 작업을 수행)
- YARN은 1개 이상의 컨테이너에서 수행하게 되어있음
- APP 마스터는 하나의 YARN 애플리케이션마다 생성
- Node Manager
- 자원 관리자에게 자신의 자원에 대한 정보 제공(보유 중인 컨테이너 정보와 노드가 살아있다는 정보 보낸다)
- Application Master로부터 요청받은 컨테이너에 해당 프로세스를 론칭
- 애플리케이션에 대한 실행 로그들을 모아 HDFS에 저장
- 노드 레벨에서의 보안을 관리하면서 부가 서비스를 수행
하둡 v1
하둡 v2
요약
- 마스터 노드(=네임 노드)
1) 네임노드
- 파일의 메타정보 관리(실제 데이터는 데이터 노드에 저장)
- 클라이언트로부터 특정 파일 요구가 발생시 데이터가 보관된 데이터 노드의 위치를 알려줌
- 고용량의 RAM이 필요(128GB 이상)
2) Job Tracker - 클라이언트가 맵리듀스 작업을 제출 -> Job Tracker가 받는다 -> 클러스터에서 사용가능한 Task Tracker로 작업을 push
- 슬레이브 노드(=작업 노드=데이터 노드)
- 대용량의 디스크가 필요
- 노드간 블록 이동은 최소화하도록 구성
1) Task Tracker - Job Tracker로 부터 작업을 받음 -> 작업 수행 -> Job Tracker로 상태 알림(heartbeat 전송)
에코시스템
하둡은 위의 두 기능(저장,처리)만으로는 데이터를 수집하고 분석하기엔 부족하다. 따라서 하둡 을 보완하기 위한 하둡 기반의 소프트웨어들을 에코시스템이라고 한다.
-
머하웃(Mahout): 데이터마이닝 라이브러리. 가장 많이 사용되는 데이터 마이닝 알고리즘을 포함하며, 군집화, 분류, 회귀, 통계 모델링 수행을 위한 확장 가능한 머신러닝 알고리즘을 보유하고 있다.
-
Hbase: 컬럼기반의 No-SQL 분산 빅데이터 저장소. 빅데이터에 대한 임의(random) 및 실시간(real-time) 읽기/쓰기 접근을 제공한다. 구글 빅테이블에서 영감을 받아 고안되어 컬럼 기반의 데이터 저장 모델로 디자인되엇다.
-
Hive: 페이스북에서 개발한 하둡 기반의 데이터웨어하우징 프레임워크이며, HiveQL 같은 하둡 맵리듀스를 고도로 추상화한 SQL 유사 언어를 이용해 사용자가 쿼리를 할 수 있게 해준다. 맵리듀스 경험이 없는 SQL 프로그래머가 데이터웨어하우스를 사용할 수 있게 해주며 실시간 쿼리 처리를 위해 비지니스 인텔리전스나 시각화 툴에 대한 연동을 쉽게 만들어 준다.
-
Pig: 자체적인 SQL 유사 언어인 Pig Latin을 통해 대규모 데이터셋을 분석하기 위한 하둡 기반의 오픈소스 플랫폼이다. 피그는 대량의 복잡한 데이터 병렬 연산을 위한 간단한 작업과 프로그래밍 인터페이스를 제공한다. 피그와 하이브는 맵리듀스를 쉽게 만든 데이터 분석 툴.
-
우지(Oozie): 여러 단계를 거쳐 데이터 처리를 수행하는 경우에 사용한다. 워크플로우 정의 및 수행, 의존관계 표시 및 수행순서 결정.
-
플럼(flume): 외부 데이터 소스들로부터 데이터를 수집할 수 있는 도구(소스-채널-싱크로 구성)
-
스쿱(Sqoop): 관계형 데이터베이스, 데이터웨어하우스, 비관계형 데이터스가 대량의 데이터를 새로운 방법으로 빠르게 전송하는 하둡 데이터 처리 플랫폼을 제공한다. 하둡 HDFS에서 데이터를 가져오고 RDBMS로 내보내는 쌍방향의 데이터 도구이다.
-
주키퍼(Zookeeper): 분산 코디네이터로 하둡, 하이브, 피그, HBase등의 여러 프로젝트를 관리하는 데 사용된다. 서버/클라이언트 두 부분으로 나뉘며, 설정 정보, 네이밍 서비스, 분산 동기화 및 그룹 서비스를 유지하기 위한 중앙 집중화된 서비스이다.
이외에도 다양한 툴들이 존재한다.
Leave a comment