hadoop 살펴보기(2)
- Posted at 2006/08/31 09:27
- Filed under project/lucene_hadoop
File System에 대한 일반적인 생각은 OS에서 기본적으로 제공하는 기능으로 생각하고 있다. 물론 Windows와 Linux와 같은 OS는 기본적으로 파일을 관리하는 기능을 제공하고 있다. 파일 관리 기능 역시 OS가 제공해야 하는 기능 중의 하나이기 때문이다. 하지만 OS에서 제공하는 File System 만으로는 시스템이 요구하는 Scalability, Reliablity 등을 충분히 제공 받을 수 없는 경우가 있다. 이런 여러 가지 이유로 인해 OS에서 기본적으로 제공하는 File System 외에 추가로 특수한 목적으로 만들어진 File System을 사용하게 된다. Google, Hadoop에서 말하는 File System은 분산 컴퓨팅 환경을 목적으로 만들어진 파일시스템이라고 할 수 있다.
Hadoop은 Google File System의 기본 개념을 그대로 가져와 구현하고 있다. 따라서 Hadoop을 이해하기 위해서는 Google File System 에 대한 이해가 필수이다. Google File System은 다음과 같은 특징을 가지고 있다.
- PC와 같은 일반적으로 값싼 장비를 이용한다.
- NAS 등과 같은 고비용의 장비를 사용하지 않고 소프트웨어로 해결한다.
- 많은 수의 대용량 파일(수백 MB ~ 수 GB)을 처리할 수 있어야 한다.
- 추가로 데이터에 대한 백업을 하지 않는다.
- 장비의 추가 및 제거가 자유로워야 한다.
- 특정 노드 장애 시에도 별도의 복구 절차 없이 지속적인 서비스 제공이 가능하다.

위의 그림은 Google File System의 기본 아키텍처이다. Google File System은 GFS master, GFS chunkserver 두 개의 데몬 서버와 이 데몬 서버와 통신을 통해 파일을 처리할 수 있게 하는 client로 구성된다. GFS master는 파일이름, 크기 등과 같은 파일에 대한 메타데이터를 관리한다. 이것은 커널 레벨에서 운영되는 애플리케이션이라기 보다는 WAS(Web Application Server)나 DBMS와 같은 사용자 애플리케이션 수준이라고 할 수 있다.
GFS chunkserver는 실제 파일을 저장하는 역할을 수행하는 노드이다. GFS는 수백 MB ~ 수 GB 이상의 크기를 가지고 있는 하나의 파일을 여러 조각으로 나눈 다음, 이것을 여러 chunkserver에 저장시킨다. GFS에서는 이렇게 나누어진 파일의 조각을 chunk라고 부른다. 환경설정을 통해 조정할 수 있지만 default 에서는 64MB로 설정되어 있다. GFS chunkserver 역시 사용자 애플리케이션으로 만들어진 데몬 프로그램이다.
GFS Client는 GFS master와 GFS chunkserver와의 통신을 통해 파일의 생성, 읽기, 쓰기 등의 작업을 수행하는 역할을 한다. 일반적으로는 API 형태로 제공되고 내부적으로 socket 등의 통신을 이용하여 서버와 통신한다.
파일에 대한 처리 순서를 설명하면 다음과 같다.
2. GFS Client는 GFS master에세 해당 파일에 대한 정보를 요청한다.
3. GFS master는 자신이 관리하는 파일 메타 데이터에서 client에서 요청한 파일의 정보를 전달한다. 이때 전달되는 데이터는 파일의 크기와 같은 정보 뿐만 아니라 조각으로 나누어진 chunk의 수, chunk size, chunk가 저장 chunkserver의 주소 값등을 전달한다.
4. GFS client는 파일 내에서 자신이 처리해야 하는 위치가 저장되어 있는 chunk를 계산하여 해당 chunk가 저장되어 있는 chunkserver로 접속한 후 파일 처리를 요청한다.
5. GFS chunkserver는 실제 파일에 대한 처리를 수행한다.
이런 방식으로 동작하기 때문에 client와 master 사이에는 파일에 대한 정보만 주고 받을 뿐 실제 파일 데이터의 이동 및 처리는 client와 chunkserver 사이에만 발생하게 된다. 이것은 수백 ~ 수천대의 chnukserver와 수 ~ 수십 PT의 데이터 불륨, 수 억개의 파일을 관리해야 하는 상황에서 master의 부하를 최소화 하도록 한 것이다.
Google File System의 가장 큰 특징 중의 하나는 바로 replication 기능이라고 할 수 있다. Google File System은 chunk를 하나의 chunkserver에만 저장시키는 것이 아니라 여러 개의 chunkserver에 복사본을 저장한다. 기본적으로는 3개의 복사본을 가지도록 한다. Chunkserver의 down 등으로 인해 정해진 복사본 수만큼 가지고 있지 않는 경우 master는 새로운 복사본을 만들도록 관리하고 있다. 이렇게 복사본을 관리할 경우 다음과 같은 장점이 있다.
- chunk를 저장하고 있는 chunkserver가 down 되어도 장애 없이 서비스를 제공할 수 있도록 한다.
- 항상 복사본이 존재하고 있기 때문에 파일 시스템 수준에서 RAID1 수준의 미러링 백업을 제공한다.
(실제로 Google은 NAS아 같은 고비용의 스토리지 장비를 사용하지 않기 때문에 Yahoo와 같은 다른 경쟁업체에 비해 월등하게 싼 가격으로 시스템을 운영하고 있다.)
- 특정 파일 또는 chunk에 read에 대한 access가 집중되는 경우 하나의 chunkserver로 집중되는 부하를 분산시킬 수 있으며 서버에 대한 분산뿐만 아니라 Disk head 와 같은 물리적인 장치에 대한 분산 효과가 있다.
장점이 있으면 물론 단점도 있다.
- Google File System에서의 복사본을 생성하는 것은 비동기적인 방식이 아니라 동기적인 방식으로 생성한다. 이것은 파일을 생성하는 시점에 복사본까지 완전히 저장된 후에 파일 생성에 대한 완료처리를 한다는 것이다. 따라서 일반 파일 시스템에 비해 기본적으로 3배 이상의 write 속도 저하가 발생한다. 따라서 Google File System의 경우 온라인 실시간 시스템에서는 사용하기 부적합 할 수 있으며 파일을 한번 생성한 다음부터는 계속해서 읽기 작업만 발생하는 시스템에 적합하다고 할 수 있다. 대표적인 시스템이 검색, 동영상, 이미지, 메일(Mime 파일) 서비스 등이다(모두 Google의 핵심 서비스라고 할 수 있다.).
- 3개의 복사본을 저장하기 때문에 3배의 디스크 공간을 필요로 한다. Google File System의 경우 기본적으로 PC에 붙어 있는 값싼 디스크도 사용할 수 있기 때문에 NAS와 같이 고비용의 스토리지를 사용하는 엔터프라이즈 환경에서는 단점이라고 할 수 없다.
Posted by 김형준
- Response
- 225 Trackbacks , 4 Comments
Trackback URL : http://www.jaso.co.kr/trackback/101
Comments List
-
잘 읽었습니다. 하나의 파일이 여러 서버에 분산되어 저장되는 것이 아니라 하나의 파일이 여러 서버에 복사되어 전송되는 경우라면 RMI를 이용하여서도 가능할것 같은데요. 물론 RPC와 IPC의 차이에 의한 속도문제는 고려되어야 겠지요. 그리고 hadoop의 경우 클라이언트가 하나만 존재해야 하는지 아니면 여러개의 클라인트가 존재할수 있는지가 궁금하군요. 클라이언트가 하나만 존재한다면 해당 클라이언트가 죽을 경우 클러스터의 이점은 없을듯 한데요. 잠깐 hadoop class를 멸갸 살펴보니 꼭 그렇지 않을듯도 싶고, 하나의 파일이 단순 복사본으로 여러대에 들어가면 제가 고민하는 문제는 해결될듯 싶긴 한데 GFS의 경우 chunk master의 위치가 고민되는군요. chuck master도 여러 서버에서 돌아가는건지 아님 클라이언트서버에서 돌아가는건지? ㅎㅎ 하여간 계속 기대할께요..
-
이 부분에 대해서 계속 컬럼 쓰면서 자세한 답변은 드리도록 하겠습니다. 먼저 간단하게 말씀드리면 client라고 하는 것은 DataNode라고 합니다. 하나의 파일이 여러개의 chunk로 쪼개지고 다시 이 chunk는 여러 DataNode에 복제되어 저장되는 방식입니다.
그리고 Master서버는 active, active로는 구성할 수 없고 active-standby로 구성하고 메타데이터의 변경로그를 지속적으로 백그라운드에서 rsync와 같은 것을 이용하여 동기화 시키면서 master가 장애시 slave로 change 할 수 있습니다. 이런 내용은 hadoop에 대한 본격적인 소개를 하면서 설명할 예정입니다.
-
-
본문중에,
"기본적으로는 3개의 복사본을 가지도록 한다. Chunkserver의 down 등으로 인해 정해진 복사본 수만큼 가지고 있지 않는 경우 master는 새로운 복사본을 만들도록 관리하고 있다."고 했는데, "파일을 생성하는 시점에 복사본까지 완전히 저장된 후에 파일 생성에 대한 완료처리를 한다"는 건 왜 그런거죠?
client가 Chunkserver에 생성한 파일을 master가 transaction후에 알아서 copy본을 만들면 될것 같은데... 구지 3배의 속도저하를 감수하고, 그렇게 하는 이유가 뭔지 궁금해요... 제가 잘못 이해한건가요? ^^;-
복사본에 대한 처리를 동기화로 할것인가 비동기화로 할 것인가에 대한 문제입니다. 백그라운드에서 처리하게 되면 문제는 복제본이 만들어지기 전에 첫번째 파일이 저장된 서버가 다운되면 해당 파일을 사용할 수 없는 문제가 발생합니다. 파일을 생성한 클라이언트 입장에서 보면 파일 저장 OK가 떨어졌는데 조금있다 들어가 보니 파일이 없어졌다라는 메세지를 받게 되는거죠. 이런 문제 때문에 비동기식으로 하는 경우 다른 백업 메커니즘이 필요하게 됩니다.
hadoop이나 Google File System의 경우 이런 백업 메커니즘 자체를 사용하지 않겠다는 것입니다. 자체에서 self-healing 기능을 다 가지고 있겠다는 것이 기본 전략입니다. 물론 성능은 약간 포기하더라도 말입니다.
-






