HDFS BLOCK



1. 블록


물리적인 디스크는 블록 크기란 개념이 있다. 블록 크기는 한 번에 읽고 쓸 수 있는 데이터의 최대량이다. 단일 디스크를 위한 파일시스템은 디스크 블록 크기의 정배수인 파일시스템 블록 단위로 데이터를 다룬다. 파일시스템 블록의 크기는 보통 수 킬로바이트고, 디스크 블록의 크기는 기본적으로 512 바이트다. 사용자는 파일의 크기와 상관없이 파일을 읽고 쓸 수 있으며, 특정 파일 시스템에 구애받지도 않는다. 하지만 파일시스템의 블록 수준에서 파일 시스템의 유지관리를 수행하는 df나 fsck와 같은 도구도 있다.

df는 디스크 여유 공간을 나타내며 Linux 및 Unix 파일 시스템에서 사용 가능한 디스크 공간의 양에 대한 통계를 표시하는 데 사용됩니다. 이 도구는 역사적인 Bell Labs에서 개발되었으며 기본적으로 다음과 함께 제공됩니다. 모든 주요 Linux 배포판. 시스템 사용자에게 디스크 공간을 유지 관리하고 시스템 문제를 해결할 수 있는 서비스를 제공함.


  • HDFS 블록
    • HDFS 블록은 기본적으로 128MB와 같이 굉장히 큰 단위다. HDFS의 파일은 단일 디스크를 위한 파일시스템처럼 특정 블록 크기의 청크로 쪼개지고 각 청크는 독립적으로 저장된다.
    • 단일 디스크를 위한 파일시스템은 디스크 블록 크기보다 작은 데이터라도 한 블록 전체를 점유하지만, HDFS 파일은 블록 크기보다 작은 데이터일 경우 전체 블록 크기에 해당하는 하위 디스크를 모두 점유하지는 않는다.
    • HDFS의 블록 크기가 128MB고 1MB 크기의 파일을 저장한다면 128MB의 디스크를 사용하는 것이 아니라 1MB의 디스크만 사용한다.</b>


HDFS 블록이 큰 이유는 탐색 비용을 최소화하기 위해서이다. 블록이 매우 크면 블록의 시작점을 탐색하는 데 걸리는 시간을 줄일 수 있고 데이터를 전송하는 데 더 많은 시간을 할애할 수 있다. 따라서 여러 개의 블록으로 구성된 대용량 파일을 전송하는 시간은 디스크 전송 속도에 크게 영향을 받는다.

탐색 시간이 10ms고 전송률이 100MB/s라고 하면, 탐색 시간을 전송 시간의 1%로 만들기 위해서는 블록 크기를 100MB로 정하면 된다. 하둡 배포판에 따라 다르지만 블록 크기의 기본값은 128MB다(대부분의 HDFS는 이보다 큰 블록의 크기를 사용한다). 기본 블록 크기는 디스크 드라이브의 전송 속도가 향상될 때마다 계속 증가할 것이다.

그러나 맵리듀스의 맵 테스크는 기본적으로 한 번에 하나의 블록을 처리하므로 테스크의 수에 잡 수행 시간 차이가 난다. 클러스터에 있는 노드보다 테스크가 적을 경우 테스크 수가 많을 때보다 잡이 더 느리게 수행된다.


  • 분산 파일시스템에 블록 추상화의 개념을 도입하면서 얻게 된 이득

    • 파일 하나의 크기가 단일 디스크의 용량보다 더 커질 수 있다. 하나의 파일을 구성하는 여러 개의 블록이 동일한 디스크에만 저장될 필요가 없으므로 클러스터에 있는 어떤 디스크에도 저장될 수 있다. (HDFS는 클러스터의 전체 디스크를 모두 채울 정도로 큰 파일 하나를 저장하는 것도 가능)

    • 파일 단위보다는 블록 단위로 추상화를 하면 스토리지의 서브시스템을 단순하게 만들 수 있다. 블록을 다루는 스토리지의 서브시스템은 스토리지 관리를 단순화하기 쉽고(블록은 고정 크기고 저장에 필요한 디스크 용량만 게산하면 된다) 메타데이터에 대한 고민을 덜 수 있다. 블록은 단지 저안되 데이터의 청크일 뿐이고 권한 정보와 같은 파일의 메타데이터는 블록과 함께 저장될 필요가 없으므로 별도의 시스템에서 다루도록 분리할 수 있다.

    • 내고장성과 가용성을 제공하는 데 필요한 복제를 구현할 때 매우 적합하다. 각 블록은 물리적으로 분리된 다수의 머신(보통 3개)에 복제된다. 블록을 이용할 수 없는 상화이 되면 복사본을 읽도록 클라이언트에 알려주고, 복제 계수를 정상 수준으로 돌아오게 할 수 있다.

    • fsck 명령어로 블록을 관리할 수 있다.

      hdfs fsck / -files -blocks