💡 HDFS의 구조에 대해 알아봅니다.
HDFS는 Master, Slave 구조로 하나의 Namenode와 이에 할당된 여러 개의 Datanode로 구성됩니다. 네임노드는 메타데이터(데이터 노드의 위치정보 등등)를 가지고 있고 데이터는 블룩 단위로 나누어서 데이터노드에 저장됩니다. User는 네임노드를 활용해서 데이터를 쓰고, 읽을 수 있습니다.
💡 HDFS는 파일의 수정을 지원하지 않음네임노드는 메타데이터의 관리와 데이터 노드를 관리합니다.
네임노드는 다음의 순서로 구동됩니다. Fsimage와 Edits를 읽어서 작업을 처리하기 때문에 두 파일의 크기가 크면 구동 시작시간이 오래 걸릴 수 있습니다.
메타데이터는 파일이름, 파일크기, 파일생성시간, 파일접근권한, 파일 소유자 및 그룹 소유자, 파일이 위치한 블록의 정보 등으로 구성되는데 각 데이터노드에서 전달하는 메타데이터를 받아서 전체 노드의 메타데이터 정보와 파일 정보를 묶어서 관리합니다.
메타 데이터는 사용자가 설정한 위치(dfs.name.dir)에 보관되며. 네임노드 실행 시 이 파일을 읽어 메모리에 보관합니다. 운영중에 발생한 수정사항은 네임노드의 메모리에는 바로 적용되고, 데이터의 수정사항을 다음 구동시 적용을 위해 주기적으로 Edist 파일에 저장합니다.
사용자가 설정한 위치에 다음과 같은 형태로 저장됩니다.
# 네임노드의 메타 데이터가 다음과 같은 형태로 생성됨
$ ls -alh /hadoop/hdfs/namenode/current
total 1847556
-rw-r--r-- 1 hdfs hadoop 217 Sep 2 03:36 VERSION
-rw-r--r-- 1 hdfs hadoop 1523554 Feb 21 14:30 edits_0000000003027897761-0000000003027906608
-rw-r--r-- 1 hdfs hadoop 1351557 Feb 21 14:32 edits_0000000003027906609-0000000003027914396
-rw-r--r-- 1 hdfs hadoop 1391038 Feb 21 14:34 edits_0000000003027914397-0000000003027922191
...
-rw-r--r-- 1 hdfs hadoop 836860 Feb 21 23:53 edits_0000000003029906692-0000000003029911098
-rw-r--r-- 1 hdfs hadoop 890807 Feb 21 23:55 edits_0000000003029911099-0000000003029915811
-rw-r--r-- 1 hdfs hadoop 1048576 Feb 21 23:56 edits_inprogress_0000000003029915812
-rw-r--r-- 1 hdfs hadoop 760128990 Feb 21 18:50 fsimage_0000000003028899087
-rw-r--r-- 1 hdfs hadoop 62 Feb 21 18:50 fsimage_0000000003028899087.md5
-rw-r--r-- 1 hdfs hadoop 762005689 Feb 21 23:50 fsimage_0000000003029901533
-rw-r--r-- 1 hdfs hadoop 62 Feb 21 23:50 fsimage_0000000003029901533.md5
-rw-r--r-- 1 hdfs hadoop 11 Feb 21 23:55 seen_txid
데이터노드는 파일을 저장하는 역할을 합니다. 파일은 블록단위로 저장됩니다. 데이타노드는 주기적으로 네임노드에 하트비트와 블록리포트를 전달합니다. 하트비트는 데이타노드의 동작여부를 판단하는데 이용됩니다. 네임노드는 하트비트가 전달되지 않는 데이터노드는 동작하지 않는 것으로 판단하여 더이상 데이터를 저장하지 않도록 설정합니다. 블록리포트로 블록의 변경사항을 체크하고, 네임노드의 메타데이터를 갱신합니다.
네임노드는 데이터노드가 주기적으로 전달하는 하트비트(3초, dfs.heartbeat.interval
)와 블록리포트(6시간, dfs.blockreport.intervalMsec
)를 이용하여 데이터 노드의 동작상태, 블록상태를 관리합니다.
사용자가 설정한 위치(dfs.data.dir)에 다음과 같은 파일의 형태로 저장됩니다. 블록은 블록과 블록의 메타 정보로 저장됩니다.
./hdfs/current/BP-11233441/current/finalized/subdir187/subdir191:
total 676K
drwxr-xr-x 2 hdfs hdfs 4.0K Sep 8 04:30 .
drwxr-xr-x 258 hdfs hdfs 8.0K Aug 31 22:21 ..
-rw-r--r-- 1 hdfs hdfs 40K Aug 31 22:46 blk_12345
-rw-r--r-- 1 hdfs hdfs 327 Aug 31 22:46 blk_12345_29082353.meta
-rw-r--r-- 1 hdfs hdfs 19K Aug 31 22:46 blk_12346
-rw-r--r-- 1 hdfs hdfs 155 Aug 31 22:46 blk_12346_29082375.meta
-rw-r--r-- 1 hdfs hdfs 262K Aug 31 22:46 blk_12347
-rw-r--r-- 1 hdfs hdfs 2.1K Aug 31 22:46 blk_12347_29082433.meta
데이터 노드의 상태를 나타내는 정보는 두 가지로 구분할 수 있습니다. 첫번째 유형은 활성 상태입니다. 두 번째 유형은 서비스가 운영 중인지를 나타냅니다.
활성 상태는 데이터노드가 Live 상태인지 Dead 상태인지를 나타냅니다. 데이터노드가 하트비트를 주기적으로 전달하여 살아 있는지 확인되면 Live 상태입니다. 데이터노드에 문제가 발생하여 지정한 시간동안(dfs.namenode.stale.datanode.interval
)하트비트를 받지 못하면 네임노드는 데이터노드의 상태를 Stale 상태로 변경합니다. 이후 지정한 시간동안 응답이 없으면 Dead 노드로 변경합니다.
운영 상태는 데이터노드의 업그레이드, 패치 같은 작업을 하기 위해 서비스를 잠시 멈추어야 할 경우 블록을 안전하게 보관하기 위해 설정합니다. 다음의 상태가 있습니다.
dfs.hosts
파일(DataNodeAdmin에 노드의 상태를 json 형태로 기술하여 운영중에 서비스를 잠시 멈추고 정비를 한 후 다시 진행할 수 있습니다.
HDFS의 파일에 접근하는 가장 간단한 방법은 HDFS 명령행 인터페이스를 이용하는 것입니다. 또한 Java, C API를 제공하여 이를 구현해서 접근하면 됩니다.