본문 바로가기
Programming/Hadoop

하둡(hadoop) 의 구조(아키텍처), 파일 입출력 프로세스, 맵 리듀스 개념

by 제타 2018. 4. 21.
반응형

 아파치 하둡(Apache Hadoop, High-Availability Distributed Object-Oriented Platform)이란?


- 대량의 자료를 처리할 수 있는 큰 컴퓨터 클러스터에서 동작하는 분산 응용 프로그램을 지원하는 프리웨어 자바 소프트웨어 프레임워크이다. 원래 너치의 분산 처리를 지원하기 위해 개발된 것으로, 아파치 루씬의 하부 프로젝트이다. 분산처리 시스템인 구글 파일 시스템을 대체할 수 있는 하둡 분산 파일 시스템(HDFS: Hadoop Distributed File System)과 맵리듀스를 구현한 것이다.


하둡 에코 시스템





특징


   1. HDFS는 데이터를 저장하면, 다수의 노드에 복제 데이터도 함께 저장해서 데이터 유실을 방지


   2. HDFS에 파일을 저장하거나, 저장된 파일을 조회하려면 스트리밍 방식으로 데이터에 접근해야 함.


   3. 한번 저장한 데이터는 수정할 수 없고, 읽기만 가능하게 해서 데이터 무결성을 유지.


      (2.0 알파버전부터는 저장된 파일에 append가 가능하게 됨)


   4. 데이터 수정은 불가능 하지만 파일이동, 삭제, 복사할 수 있는 인터페이스를 제공함.



아키텍처


하둡은 하둡 공통 패키지로 구성되어 있다. 이 패키지에는 하둡 파일 시스템(HDFS), OS 수준 앱스트랙션(OS level abstractions) 그리고 맵리듀스(MapReduce) 엔진이 포함되어 있다.또한 필요한 자바 아카이브 파일(Java ARchive, JAR)들과 하둡을 시작할 스크립트, 소스 코드들과 관련 자료들로 구성되어 있다.




작은 하둡 클러스터에는 하나의 마스터와 여러 워커 노드들로 구성 되어 있다. 마스터 노드들은 잡트렉커(JobTracker), 테스크트렉커(TaskTracker), 네임노드(NameNode), 데이터노드(DataNode)로 구성 된다. 슬레이브 또는 워커 노드(Worker Node)는 데이터노드와 테스크트렉커로서 동작을 한다. 하둡은 자바 런타임 환경(Java Runtime Environment, JRE) 1.6 또는 그보다 높은 버전이 필요하다. 일반 시작 및 종료를 위한 스크립트는 클러스터의 노드들간 설정을 하기 위해 시큐어 셸(Secure Shell, ssh)이 필요하다.




대용량 하둡 클러스터에는 HDFS가 파일 시스템 인덱스를 관장하기 위한 네임노드 전담 서버를 통해 관리된다. 그리고 2차 네임노드는 네임노드의 메모리 구조 스냅샷을 만들어서 파일시스템에 장애나 데이터의 손실을 줄여준다. 단독 쟙트렉커 서버는 작업 스케줄링을 관리한다




   1. 블록 구조의 파일 시스템으로, 저장하는 파일은 특정 사이즈의 블록으로 나눠져 분산된 서버에 저장된다.


   2. 하나의 블록은 3개(수정 가능)로 복제되며, 각각 다른 HDFS의 노드에 분산저장됨


   3. HDFS에는 마스터 역할을 하는 네임노드 서버 한 대와, 슬레이브 역할을 하는 데이터노드 서버가


      여러 대로 구성된다.


   4. 네임 노드는 HDFS의 모든 메타데이터(블록들이 저장되는 디렉토리의 이름, 파일명등..)를 관리하고,


      클라이언트가 이를 이용하여 HDFS에 저장된 파일에 접근할 수 있음.


   5. 하둡 어플리케이션은 HDFS에 파일을 저장하거나, 저장된 파일을 읽기 위해 HDFS 클라이언트를


      사용하며, 클라이언트는 API형태로 사용자에게 제공됨.


   6. 데이터 노드는 주기적으로 네임노드에서 블록 리포트(노드에 저장되어 있는 블록의 정보)를 전송하고


      이를 통해 네임노드는 데이터 노드가 정상 동작하는지 확인.


   7. 클라이언트는 네임노드에 접속해서 원하는 파일이 저장된 블록의 위치를 확인하고,


      해당 블록이 저장된 데이터 노드에서 직접 데이터를 조회함.


HDFS

하둡 분산 파일 시스템(HDFS, Hadoop distributed file system)은 하둡 프레임워크를 위해 자바 언어로 작성된 분산 확장 파일 시스템이다. HDFS은 여러 기계에 대용량 파일들을 나눠서 저장을 한다. 데이터들을 여러 서버에 중복해서 저장을 함으로써 데이터 안정성을 얻는다. 따라서 호스트에 RAID 저장장치를 사용하지 않아도 된다.


하둡 분산 파일 시스템은 다음과 같은 시스템에서 잘 동작하는 것을 목표로 하고 있다.


하드웨어 오동작 : 하드웨어 수가 많아지면 그중에 일부 하드웨어가 오동작하는 것은 예외 상황이 아니라 항상 발생하는 일이다. 따라서 이런 상황에서 빨리 자동으로 복구하는 것은 HDFS의 중요한 목표다.

스트리밍 자료 접근 : 범용 파일 시스템과 달리 반응 속도보다는 시간당 처리량에 최적화되어 있다.

큰 자료 집합: 한 파일이 기가바이트나 테라바이트 정도의 크기를 갖는 것을 목적으로 설계되었다. 자료 대역폭 총량이 높고, 하나의 클러스터에 수 백개의 노드를 둘 수 있다. 하나의 인스턴스에서 수천만여 파일을 지원한다.

간단한 결합 모델 : 한번 쓰고 여러번 읽는 모델에 적합한 구조이다. 파일이 한번 작성되고 닫히면 바뀔 필요가 없는 경우를 위한 것이다. 이렇게 함으로써 처리량을 극대화할 수 있다.

자료를 옮기는 것보다 계산 작업을 옮기는 것이 비용이 적게 든다 : 자료를 많이 옮기면 대역폭이 많이 들기 때문에 네트워크 혼잡으로 인하여 전체 처리량이 감소한다. 가까운 곳에 있는 자료를 처리하게 계산 작업을 옮기면 전체적인 처리량이 더 높아진다.

다른 종류의 하드웨어와 소프트웨어 플랫폼과의 호환성 : 서로 다른 하드웨어와 소프트웨어 플랫폼들을 묶어 놓아도 잘 동작한다.


네임노드와 데이터노드
HDFS는 마스터/슬레이브(master/slave) 구조를 가진다. HDFS 클러스터는 하나의 네임노드와, 파일 시스템을 관리하고 클라이언트의 접근을 통제하는 마스터 서버로 구성된다. 게다가 클러스터의 각 노드에는 데이터노드가 하나씩 존재하고, 이 데이터 노드는 실행될 때마다 노드에 추가되는 스토리지를 관리한다. HDFS는 네임스페이스를 공개하여서 유저 데이터가 파일에 저장되는 것을 허락한다. 내부적으로 하나의 파일은 하나 이상의 블록으로 나뉘어 있고, 이 블록들은 데이터노드들에 저장되어 있다. 네임노드는 파일과 디렉터리의 읽기(open), 닫기(close), 이름 바꾸기(rename) 등, 파일시스템의 네임스페이스의 여러 기능을 수행한다. 또한, 데이터 노드와 블록들의 맵핑을 결정한다. 데이터 노드는 파일시스템의 클라이언트가 요구하는 읽기(read), 쓰기(write) 기능들을 담당한다. 또한 데이터 노드는 네임노드에서의 생성, 삭제, 복제 등과 같은 기능도 수행한다.

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


파일 저장 프로세스


1. 어플리케이션이 HDFS 클라이언트에게 파일 저장을 요청하면, HDFS 클라이언트는 네임노드에게 파일 블록들이 저장될 경로 생성을 요청. 네임노드 는 해당 파일 경로가 존재하지 않으면 경로를 생성한 후, 다른 클라이언트가 해당 경로를 수정하지 못하도록 락을 건다. 그 후, 네임노드는 클라이언트에게 해당 파일 블록들을 저장할 데이터노드의 목록을 반환한다.2. 클라이언트는 첫 번째 데이터 노드에게 데이터를 전송한다.

3. 첫 번째 데이터 노드는 데이터를 로컬에 저장한 후, 데이터를 두 번째 데이터 노드로 전송한다.

4. 두 번째 데이터 노드는 데이터를 로컬에 저장한 후, 데이터를 세 번째 데이터 노드로 전송한다.

5, 6. 로컬에 데이터를 저장하였으면 자기에게 데이터를 넘겨준 데이터 노드에게, 데이터의 로컬 저장이 완료 되었음을 응답한다.

7. 첫 번째 데이터 노드는 클라이언트에게 파일 저장이 완료 되었음을 응답한다.


파일 읽기 프로세스


   1. 어플리케이션이 클라이언트에게 파일 읽기를 요청한다.

   2. 클라이언트는 네임노드에게 요청된 파일이 어떤 블록에 저장되어 있는지 정보를 요청한다.

   3. 메타데이터를 통해 파일이 저장된 블록 리스트를 반환한다.

   4. 클라이언트는 데이터 노드에 접근하여 블록 조회 요청한다.

   5. 데이터 노드는 클라이언트에게 요청된 블록을 전송한다.

   6. 클라이언트를 어플리케이션에 데이터를 전달한다.



2. 맵리듀스(MapReduce)

대용량의 데이터 처리를 위한 분산 프로그래밍 모델, 소프트웨어 프레임워크이다.

맵리듀스 프레임워크를 이용하면 대규모 분산 컴퓨팅 환경에서, 대량의 데이터를 병렬로 분석 가능하다.

프로그래머가 직접 작성하는 맵과 리듀스 라는 두 개의 메소드로 구성된다.

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

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


위의 플로우는 문자열 데이터에 포함된 단어의 빈도수를 출력해주는 과정이다.


사실 하둡은 잡을 만들고 수행하고 수정하는 작업이 어렵기도 하지만 맵리듀스 과정을 최적화 시키는 것이 어렵다.

본인이 갖고 있는 에코 시스템의 물리적인 사양에 맞춰 최적화를 시킬 줄 아는 것이 진정한 고수다.


   1. 스플릿팅(Splitting) : 문자열 데이터를 라인별로 나눈다.

   2. 맵핑(Mapping) : 라인별로 문자열을 입력받아, <key, value> 형태로 출력.

   3. 셔플링(Shuffling) : 같은 key를 가지는 데이터끼리 분류.

   4. 리듀싱(Reducing) : 각 key 별로 빈도수를 합산해서 출력.

   5. 종합 : 리듀스 메소드의 출력 데이터를 합쳐서 하둡 파일 시스템에 저장.

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

맵 리듀스(Map Reduce) 시스템 구성 : 맵 리듀스 시스템은 Client, JobTracker, TaskTracker 로 구성된다. 

그리고 잡트래커(JobTracker)는 마스터노드(NameNode)에, 태스크트래커(TaskTracker)는 슬래이브노드(DataNode)에 위치한다.


Client : 분석하고자 하는 데이터를 job의 형태로 JobTracker에게 전달한다.

JobTracker : 하둡 클러스터에 등록된 전체 job을 스케줄링하고 모니터링한다.

TaskTracker : DataNode에서 실행되는 데몬이고, 사용자가 설정한 맵리듀스 프로그램을 실행하며, JobTracker로부터 작업을 요청받고 요청받은 맵과 리듀스 개수만큼 맵 태스크와 리듀스 태스크를 생성한다.

출처 - 위키피디아

반응형