728x90
반응형

참고자료 1 : https://aws.amazon.com/ko/emr/details/hadoop/

참고자료 2 : http://over153cm.tistory.com/entry

참고자료 3 : https://www.facebook.com/

참고자료 4 : http://12bme.tistory.com/70

참고자료 5 : http://yookeun.github.io/java/2015/05/24/hadoop-hdfs/




하둡이란? 


대용량 데이터를 분산 처리할 수 있는 자바기반의 오픈소스 프레임 워크이다. Apache™ Hadoop®은 대규모 데이터 세트를 효율적으로 처리하는 데 사용할 수 있는 오픈 소스 소프트웨어 프로젝트이고, 하나의 대형 컴퓨터를 사용하여 데이터를 처리 및 저장하는 대신, 하둡을 사용하면 상용 하드웨어를 함께 클러스터링하여 대량의 데이터 세트를 병렬로 분석할 수 있다.


이는 분산저장(HDFS)기술과 분산 처리기술(MapReduce)이 탁월하며, 한 번에 여러 디스크로부터 데이터를 읽을 수 있다. 예를 들어 100개의 드라이브가 있고, 각 드라이브는 데이터의 100분의 1을 저장했다고 가정 해 보라. 병렬 동작한다면 우리는 2분 내에 데이터를 읽을 수 있다.

 

다시 말해, 하둡은 HDFS(Hadoop Distributed File System)라는 데이터 저장소와 맵리듀스(MapReduce)라는 분석 시스템을 통해 분산 프로그래밍을 수행하는 프레임 워크 인 것이다.






하둡을 사용하는 이유


한마디로 기존 RDBMS는 비싸지만, 하둡은 싸다.

RDBMS는 빅 데이터의 대용량 데이터를 감당하기엔 비용이 너무 크다한 예로, 2008년 뉴욕타임즈의 130년 분량의 신문기사 1100만 페이지를 하둡을 이용해 하루 만에 200만원의 비용을 들여 PDF로 변환 하였다. 이는 일반서버로 진했을 경우 14이 소요되는 작업 이였다이렇듯 하둡은 분산컴퓨팅 방식을 이용해서 저렴한 구축 비용과 비용 대비 빠른 데이터 처리, 그리고 장애를 대비한 특성을 갖추고 있기 때문이다.


하둡은 여러 대의 서버에 데이터를 저장하고, 저장된 각 서버에서 동시에 데이터를 처리하는 방식이다. 하둡은 기존의 RDBMS(Oracle,MS-SQL, MySQL등)을 대치하는 것이 아니다. 즉 트랜젝션이나 무결성을 보장해야하는 데이터처리에는 적합하지 않다. 하둡은 배치성으로 데이터를 저장하고 처리하는데 적합한 시스템이다.


쇼핑물에서 회원가입이나, 결제진행등은 모두 트랜젝션이나 무결성을 보장해야한다. 이런 것들을 하둡으로 처리하는 것이 아니라, 회원이 관심있게 보는 물품들이나, 이동경로, 머무르는 시간등 배치성으로 저장되는 데이터에 적합하다. 이런 것들을 매번 비용이 비싼 RDBMS에 저장하면 낭비요소이다. 그러므로 하둡은 RDBMS와 경쟁하는 것이 아닌 RDBMS와 협력하는 것이라 볼 수 있다.






하둡은 '분산'

 

하둡은 두가지 큰 요소의 결합이다. '처리(계산)' '저장' 입니다. 즉 '분산처리''분산저장' 이라고 보면 됩니다. 여러개의 저가형 컴퓨터를 마치 하나인것 처럼 묶어주는 기술이라고 보면 된다. 

 

분산저장

하둡 파일시스템(HDFS)을 이용해서 파일을 적당한 블록 사이즈 (64MB)로 나눠서 각 노드 클러스터(각각의 개별 컴퓨터) 에 저장한다. 또한 데이타 유실의 위험이나 사람들이 많이 접근할때 (Access) 할때의 부하처리를 위해서 각 블록의 복사본 (Replication)을 만들어 둔다. 보통 복사본은 최소 3카피 정도다. 왜 이렇게 하냐면 고성능 서버에서 저장공간은 돈이 많이 들어가는 부분이고, 그것을 저가형 저장소 여러개를 묶어서 마치 레이드 처럼 동작하게 하려는 목적으로 분산저장을 하는것이다.

 

분산처리

MapReduce 라는 프레임워크를 이용해서 계산하며, 프레임워크라는 것이 중요하다. 즉 분산처리를 위해서 프레임워크를 만들어 둔것이다. 분산처리를 위해서 프레임워크에 맞추어서 코딩을 하고 하둡 시스템에서 그것을 실행하면 자동으로 분산처리를 해 준다. 맵리듀스라는 프레임 워크는 Map + Reduce 라는 두가지 형식으로 나누어 집니다. 개념은 간단하다. Map 함수에서 데이타를 처리를 하고 Reduce 함수에서 원하는 결과값을 계산시킨다.





하둡의 특징



- Distributed: 수십만대의 컴퓨터에 자료 분산 저장 및 처리


- Scalable: 용량이 증대되는 대로 컴퓨터 추가


- Fault-tolerant: 하나 이상의 컴퓨터가 고장나는 경우에도 시스템이 정상 동작


- Open source: 공개 소프트웨어












하둡 분산 파일 시스템 (Hadoop Distributed File System)


HDFS는 Hadoop Distributed File System의 약자이다. 수십 테라바이트 또는 페타바이트 이상의 대용량 파일을 분산된 서버에 저장하고, 그 저장된 데이터를 빠르게 처리할 수 있게 하는 파일시스템이다. 또한 저사양의 서버를 이용해서 스토리지를 구성할 수 있어 기존의 대용량파일스시스템(NAS, DAS, SAN등)에 비해 장점을 가진다. HDFS는 블록 구조의 파일 시스템이다. 파일을 특정크기의 블록으로 나누어 분산된 서버에 저장된다. 블록크기는 64MB에서 하둡2.0부터는 128M로 증가되었다.

hadoop_diagram





네임노드와 데이터노드


HDFS는 네임노드(마스터)와 데이터노드(슬레이브)로 구현되어 있다.

네임노드(NameNode)는 다음과 같은 핵심기능을 수행한다.


메타데이터관리

파일 시스템을 유지하기 위한 메타데이타를 관리

데이터노드 모니터링 

데이터노드는 네임노드에게 3초마다 하트비트(heartbeat)를 전송한다. 네임노드를 이를 이용하여 데이터노드의 실행상태와 용량을 체크한다. 하트비트를 전송하지 않는 데이터노드는 장애서버로 판단한다.

블록관리

장애가 발생한 데이터노드의 블록을 새로운 데이터노드에 복제한다. 용량이 부족하다면 여유가 있는 데이터노드에 블록을 옮긴다.

클라이언트 요청접수

클라이언트가 HDFS에 접근하려면 반드시 네임노드에 먼저 접속해야 한다. HDFS에 파일을 저장할 경우 기존 파일의 저장여부와 권한 확인 절차를 거쳐 저장을 승인한다. 데이터노드(DataNode)는 클라이언트가 HDFS에 저장하는 파일을 로컬 디스크에 유지하다. 이때 파일은 두가지로 저장되는데 하나는 실제 저장되는 로우데이터이고 다른 하나는 체크섬이나 파일생성일자 같은 메타데이터가 저장된 파일이다.





HDFS에 파일저장

클라이언트에서 먼저 네임노드와 통신과정을 통해 스트림(DFSOutputStream)을 생성한다. 생성된 스트림을 통해 클라이언트에서 파일을 각 데이터노드에 전송한다. 이때 저장할 파일은 패킷단위로 나누어서 전송한다. 파일전송이 완료되면 클라이언트에서는 네임노드에서 얻은 스트림을 close하면 남은 모든 패킷이 Flush된다. 클라이언트에서 네임노드의 complete메소드를 호출해서 정상적으로 저장되었다면 true가 반환된다. 그러면 파일저장이 완료된 것이다.




HDFS에 파일읽기

클라이언트에서 네임노드의 입력스트림객체(DFSInputStream)를 통해 스트림객체를 생성한다. 생성된 스트림객체를 이용하여 기본 블록의 10배수만큼 조회한다. 클라이언트에서 스트림객체에서 블록리더기 생성하는데 블록이 저장된 데이터노드가 같은 서버에 있다면 로컬블록리더기(BlockReaderLocal)를 생성하고, 원격에 있다면 원격블록리더기(RemoteBlockReader)를 생성한다. DFSInputStream은 파일 모두 읽을 때까지 블록을 조회한다. 모두 읽었다면 close를 통해 닫아주어야 한다.






보조네임노드(Secondary Name Node)


네임노드가 메타데이타를 메모리에 담고 처리하는데 만약 서버가 리부팅되면 사라질 수 있다. HDFS는 이러한 점때문에 editslog와 fsimage라는 두 개의 파일을 생성한다. editslog는 HDFS의 모든 변경 이력을 저장하고, fsimage는 메모리에 저장된 메타데이터의 파일 시스템 이미지를 저장한 파일이다. 그런데 만약 editslog가 커지면 fsimage를 만드는데 시간이 많이 소요되게 된다.

이러한 문제를 해결하기 위해서 보조네임노드(Secondary Name Node)가 있다. 보조네임노드는 fsimage를 갱신해준다. 이러한 작업을 체크포인트라고 한다. 그래서 보조네임노드를 체크포인팅 서버라고도 한다. 보조네임노드는 네임노드의 백업이 아니고 단순히 fsimage를 줄여주는 역할만 한다. fsimage가 너무 커서 네임노드가 메모리에 로딩되지 못하는 경우를 예방하기 위해 사용되는 것이다.




728x90
반응형