반응형
[하둡이란]
대용량의 데이터를 분산처리하게 해주는 아파치 톱 레벨 오픈소스 프로젝트
HDFS와 MapReduce라는 이름의 분산처리 시스템으로 구성
특징
- 오픈소스
- 데이터가 있는 곳으로 코드를 이동
대부분의 경우 데이터의 크기가 소스코드보다 훨씬 크기 때문에 - 스케일 아웃(vs. 스케일 업)
다수의 저렴한 서버를 사용 - 병렬처리를 가능하게 해주는 단순한 데이터 모델
처리하는 레코드만 보고 작업하면 되므로 병렬성이 높고 다수의 서버에서 실행하기 쉬움
프로그래머는 맵, 리듀스 함수만 구현하고 처리할 입력 데이터가 HDFS상 어디에 있는지 처리된 데이터가 어디 저장될지만 지정해주면 나머지는 프레임워크가 알아서 병렬로 처리 - 오프라인 배치 프로세싱에 최적화
실시간 처리가 필요한 환경에서는 사용할 수 없다
[하둡 아키텍처]
HDFS나 MapReduce 모두 하나의 마스터, 다수의 슬레이브로 구성
HDFS는 마스터가 네임노드, 슬레이브가 데이터노드
네임노드에 문제가 생기면 파일 시스템 전체에 문제가 생기기 때문에 문제 발생시 복구를 위해 2차 네임노드 별도 존재하여 네임노드 데이터 주기적으로 백업
맵리듀스는 마스터가 잡트래커, 슬레이브가 태스크 트래커.
맵리듀스 프로그램 실행하면 잡 트래커가 태스크 트래커들에 태스크 나눠주어 병렬로 실행
맵리듀스는 입력 데이터를 HDFS에서 읽고 처리된 데이터를 다시 HDFS에 쓴다
HDFS는 자체로 분산 파일 시스템으로 쓰일 수 있지만 맵리듀스 프레임워크는 HDFS를 데이터 읽기와 쓰기를 위해 필요로 함
[HDFS 개요]
마스터/슬레이브 구조의 분산파일 시스템
마스터-네임노드, 슬레이브-데이터노드
* 특징
- 파일을 여러 개의 블록으로 나누어 저장
하나의 파일은 여러 개의 블록으로 나뉘어져 가능한 한 여러 데이터노드에 저장
작은 크기의 파일을 다수 저장하는 용도로는 부적합, 큰 파일 다루는데 적합 - 하부 운영체제 파일 시스템 그대로 사용
데이터노드들이 동작하는 서버 운영체제의 파일 시스템을 그대로 사용 - 하드웨어가 고장나도 문제 해결 가능
네임노드가 특정 데이터 노드에 문제가 발생한 것을 알면 바로 해당 노드의 데이터블록들을 다른 노드로 복제 - Write Once Read Many
기본적으로 파일 내용 수정 불가능 - 다른 시스템의 기본 구성 블록
- 웹에서 접근 가능
REST API 제공
* 네임노드
HDFS마다 단 하나만 존재하는 마스터.
각종 파일, 디렉토리 메타정보 저장, 관리. 실제 데이터는 다수의 데이터노드에 분산 저장하는 역할 담당
네임노드 메타정보
2차 네임노드와 체크포인트
문제 발생 시 복구 위해 2차 네임노드와 체크포인트, 에디트로그 사용
2차 네임노드는 주기적으로 네임노드에게 체크포인트 요청. 네임노드는 메모리에 존재하는 파일시스템 메타정보를 디스크 파일로 써버림. 이를 체크포인트라 하며 이파일을 2차 네임노드가 복사해감. 그리고 체크포인트 사이에 발생할 수 있는 문제 대비해 체크포인트 사이의 모든 HDFS 트랜잭션은 모두 에디트로그 파일에 수록. 그리고 체크포인트 시마다 에디트로그 내용은 리셋.
네임노드에 문제 발생하여 복구할 때 하둡 클러스터 관리자는 2차 네임노드에서 마지막 체크포인트된 파일 위에 네임노드에 있는 에디트로그를 리플레이해서 HFDS를 마지막 최종 상태로 복구하게 됨
네임노드와 데이터노드 간의 통신
주기적으로 데이터노드가 네임노드에게 현재 상태를 보고 - 하트비트
네임노드 웹 인터페이스
네임노드는 자신의 현재 상황을 보여주기 위한 방편으로 간단한 웹 인터페이스를 제공
* HDFS I/O
읽기
HDFS 클라이언트는 먼저 네임노드와 통신하여 읽고자 하는 파일의 이름을 넘기고 네임노드로부터 해당 파일의 데이터 블록 위치 리스트를 얻어옴
네임노드의 간섭없이 데이터노드들(정확히는 데이터노드 데몬 - TCP 포트 50010에서 대기)과 직접 통신하여 데이터 블록을 차례대로 읽어 들이게 됨.
쓰기
- HDFS 클라이언트는 먼저 파일을 로컬 파일 시스템에 생성하고 데이터를 여기에 쓰기 시작
- 파일 생성 끝나거나 크기가 데이터 블록 크기보다 커지면 네임노드를 접촉. 네임노드는 파일 생성 요청을 메모리 메타정보와 에디트로그에 기록
- 네임노드는 이 데이터가 저장될 데이터 블록의 ID와 이 블록이 저장될 데이터노드들의 이름 결정 하여 HDFS 클라이언트에게 보내줌
- 클라이언트는 이중 첫번 째 데이터 노드에 블록을 쓰면서 복제가 발생해야하는 나머지 데이터노드들의 리스트를 같이 넘김
- 첫번째 데이터노드는 데이터를 클라이언트로 복사받으면서 두번째 노드와 접촉하여 그곳으로 복제 시작
- 마지막 데이터노드에서 블록의 복제가 완료되면 이 시점에 해당 데이터 블록 생성이 완료된 것으로 간주 - 복제 파이프라이닝
- 파일 생성이 완료된 것이 아니면 2로 다시 감.
[MapReduce 프레임워크]
마스터-잡트래커, 슬레이브-태스크 트래커
* 특징
소스코드보다 데이터의 크기가 훨씬 커서 데이터가 있는 서버로 코드를 전송함
=> 같은 랙 내에서의 데이터 전송은 하나의 스위치를 통과하기 때문에 훨씬 빠르다
데이터를 키/벨류 데이터셋의 변환으로 처리
- 입력 데이터를 하나 이상의 조각으로 나눈 후 그것들을 데이터 조각의 수만큼 서버에서 각기 병렬처리 - 맵 태스트
- 여러 개의 맵 태스트로부터의 출력을 모아서 최종 처리하는 과정 - 리듀스 태스크
Share Nothing 아키텍처
맵 태스트, 리듀스 태스트는 병렬성이 아주 높음, 각기 자기가 처리할 레코드만 보고 처리하면 되기 때문
* 잡 트래커
하나의 잡은 보통 하나 이상의 맵 태스트와 하나 이상의 리듀스 태스크로 구성
역할 : 하둡 맵리듀스 프레임워크의 마스터 서비스로 사용자로부터 하둡 잡 실행 요청을 받아 태스크들을 해당 맵리듀스 클러스터 내 태스크 트래커들로 나눠서 실행하고 종료될 때까지 관리함
태스크 트래커는 각 태스크마다 별개의 JVM을 할당하고 자식 프로세스로 실행
잡 트래커와 태스크 트래커 간의 통신
잡트래커는 주기적으로 태스크 트래커들의 현재 상황에 대한 보고를 받음 - 하트비트
* 잡 스케줄러
클러스터에 여러 잡을 동시에 실행하게 함
디폴트 스케줄러 : FIFO 스케줄러
선택 순서 : 우선순위가 높은 잡, 가장 먼저 요청된 것
FIFO 스케줄러는 선점을 지원하지 않음
야후의 Capacity 스케줄러
클러스터 내 여러개의 큐 정의, 각 큐 내에서 FIFO 스케줄러와 같은 방식으로 동작
페이스북의 Fair 스케줄러
여러 개의 풀들을 정의
* 맵리듀스 프로그래밍
자바가 가장 로우레벨 프로그래밍 언어이다.
Hive/Pig 는 맵리듀스의 매퍼와 리듀서에 대한 이해없이 HDFS상의 데이터를 조작할 수 있는 방법을 제공해주는 하이레벨 언어
하이레벨 프로그래밍 언어의 장점은 맵리듀스 프로그래밍을 잘 몰라도 된다, 생산성이 높다 단점은 속도가 상대적으로 느리다.
[MapReduce 사용 적합 분야와 부적합 분야]
* 적합 분야
병렬도가 굉장히 높은 단순 작업
로그 분석
머신러닝 (클러스터링이나 Classification)
* 부적합 분야
리얼타임 데이터 스트림 처리 : 리얼타임 액세스를 위해서는 RDBMS, NoSQL, 검색엔진으로 이동시킨 후 그 시스템을 사용하는 것이 일반적
반복실행이 많이 필요한 작업들 : 맵과 리듀스 사이의 셔플링/소팅 단계의 오버헤드가 꽤 크다
맵리듀스를 구현할 때 네트워크 데이터 전송량이 너무 큰 경우 : 기본적으로 맵리듀스 프레임워크의 가장 큰 병목지점은 네트워크 대역폭인 경우가 많음
반응형
'개발 > Data Engineering' 카테고리의 다른 글
Avro와 Parquet (0) | 2021.06.24 |
---|---|
태블로 데이터 원본 구성 방법 - 관계와 조인 (0) | 2021.04.16 |
HDFS 네임노드 OutOfMemory 에러 (0) | 2016.09.27 |
hdfs에서 name node is safe mode 라고 나올 때 (0) | 2016.09.22 |
hdfs stop 시 no namenode to stop 에러 (0) | 2016.09.12 |