ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [빅데이터 전문가의 하둡관리] 8. 네임노드의 역할과 HDFS의 동작 방식
    Software Development/Big Data 2022. 10. 30. 00:00

    http://www.kyobobook.co.kr/product/detailViewKor.laf?mallGb=KOR&ejkGb=KOR&barcode=9788931555752

     

    빅데이터 전문가의 하둡 관리 - 교보문고

    스파크 얀 HDFS 관리, 튜닝 및 보안 비법 대공개! | 빅데이터 전문가의 하둡 관리 데이터 양이 많은 페이스북같은 기업에서 서버의 트래픽이 몰리지 않고 사용자가 빠른 피드백을 받도록 하려면?

    www.kyobobook.co.kr

    위 책의 내용을 읽으며 공부한 내용을 요약 및 정리한 글입니다. 자세한 내용은 위 책에서 알 수 있습니다.

     

    네임노드와 데이터노드 간의 상호 연결에 대한 설명을 시작으로 클라이언트 간 HDFS에 데이터를 읽고 쓰는 방식 뒤에 숨겨진 이론까지 논의한다. 그 후, HDFS의 저장과 캐시 관리와 같은 기능을 알아본다.

    • 네임노드와 데이터노드 간의 상호작용
    • HDFS 데이터 관리
    • HDFS 데이터를 클라이언트가 읽고 쓰는 방식
    • HDFS 복원 프로세스
    • 하둡 아카이브 스토리

    애플리케이션의 성능을 위해 자주 사용되는 데이터를 캐시하는 HDFS의 중앙 집중적 캐시 관리와 클라이언트가 데이터노드를 통하지 않고 파일 시스템에서 직접 데이터를 읽어올 수 있는 숏서킷 로컬 읽기 기능들을 이용하는 방법을 배운다.

     

    마지막으로 하둡의 이기종 스토리지 기능을 사용해 HDFS 스토리지를 최적화할 수 있는 방법을 배운다.

    HDFS - 네임노드와 데이터노드 사이의 상호 연동

    HDFS의 초점은 레이턴시를 낮추는 것보다는 높은 처리량을 보장하는 데 있다. 파일이 일단 만들어져서 수정, 저장되면 이 내용을 수정할 수 없다.

     

    HDFS는 파일을 읽고 쓰고 디렉토리를 생성하고 삭제하는 기본 파일 시스템이 제공하는 기능을 지원한다. HDFS 간 데이터 블록이 여러 개의 복제본을 저장하는 사실까지는 알 필요가 없다. 사용자 애플리케이션은 HDFS에 저장된 파일을 HDFS 클라이언트를 통해 접근할 수 있다. HDFS 클라이언트는 라이브러리로 HDFS 파일 시스템 인터페이스를 지원한다.

     

    하둡 클러스터 내 마스터 서버로 동작하는 네임노드는 하나다. 이 네임노드가 파일 시스템 네임스페이스를 관리하고 클라이언트가 HDFS에 저장된 파일을 접근하는 것을 통제한다. 데이터노드는 클러스터의 거의 모든 노드에서 실행된다. 데이터노드는 자신이 실행되는 노드의 스토리지를 관리한다. 네임노드는 HDFS 파일과 관련된 메타데이터를 관리한다. 그것을 image 파일에 저장한다. 데이터노드는 HDFS 파일의 실제 데이터를 관리한다. 데이터를 데이터노드가 실행되는 서버에서 파일로 저장한다.

     

    HDFS는 HDFS 파일에 데이터를 저장한다. 각 파일은 여러 개의 블록으로 이뤄져 있다. 이 블록들은 다수의 데이터노드에 복제된다. 네임노드는 HDFS에 관련된 다음과 같은 기능을 처리한다.

    • 파일과 디렉토리를 열고 닫는 등의 모든 HDFS 오퍼레이션을 수행한다.
    • 블록들을 데이터노드에 할당한다.
    • 여러 가지 메타데이터를 관리한다. 메타데이터에서는 파일에 대한 각 블록들의 위치, 파일의 현재 상태, 접근 제어 정보 등이 포함된다.

    데이터노드는 클라이언트의 읽고 쓰기 요청을 처리한다. 네임노드가 명령을 하면 데이터노드는 블록 생성과 삭제 그리고 복제 같은 오퍼레이션을 수행한다. 클라이언트는 직접 데이터노드와 통신해 블록을 생성하고 읽고, 쓰고 복제본을 전송할 수 있다. 데이터노드 데몬은 클라이언트나 다른 데이터노드와 통신하기 위해 열려 있는 소켓을 관리한다. 데이터노드의 데몬은 네임노드에게 서버와 포트 정보를 제공해 클라이언트와 다른 데이터노드가 데이터를 보낼 수 있도록 한다. 서버의 소켓을 열어둔 상태로 계속 유지해 클라이언트가 효율적으로 읽고 쓰기를 할 수 있도록 하기도 한다.

    클라이언트와 HDFS 간의 상호 연동

    애플리케이션은 HDFS 클라이언트 라이브러리로 연동하고, 이 라이브러리는 애플리케이션과 네임노드 또는 데이터노드 사이의 통신을 관리한다. HDFS는 클라이언트 라이브러리 API를 통해 파일의 블록 위치를 노출한다.

    네임노드와 데이터노드 간의 통신

    데이터노드는 네임노드에 직접 연결돼 있지 않고 필요할 때마다 서로 통신한다. 다음은 데이터노드가 네임노드와 통신하게 되는 방법이다.

    • 초기 등록: 데이터노드가 시작되면, 데이터노드는 네임노드에 등록해 네임노드에게 HDFS 읽고 쓰기 오퍼레이션을 데이터노드에서 수행할 수 있다는 것을 알린다.
    • 장기적인 하트비트: 모든 데이터노드는 주기적으로 데이터노드의 사용 정보를 포함하는 하트비트를 네임노드에 보낸다. 이 하트비트를 통해 네임노드가 데이터노드에 블록 복제나 삭제 명령을 보낼 수도 있다.

    네임노드는 데이터노드로부터 긴 시간 동안 하트비트를 받지 못하면, 데이터노드에게 블록 정보를 즉각 요청한다. 데이터노드가 주기적으로 보내야 하는 하트비트를 오랫 동안(10초) 보내지 못하면, 네임노드는 이 데이터노드에 대해 서버가 죽은 것으로 표시하고 다른 데이터노드에게 이 데이터노드가 갖고 있던 데이터를 복제하도록 명령을 보낸다. 이런 방식으로 데이터의 복제 수를 유지한다.

    • 주기적 블록 리포트: 기본적으로 각 데이터노드는 블록 리포트를 네임노드에게 매 시간마다 보낸다. 네임노드는 블록 리포트를 통해 각 데이터노드의 블록 정보를 네임노드 내의 데이터와 동기화한다. 블록 리포트는 데이터노드에서 네임노드로 보내는 주기적 하트비트에 함께 실려 전달된다.
    • 복제본 복사 완료: 데이터노드가 데이터 블록의 복제를 완료하면 완료 메세지를 네임노드에 보낸다.

    데이터노드는 주기적으로 데이터노드가 살아 있다는 사실을 알리기 위해 하트비트를 보내고 주기적으로 데이터 리포트도 보낸다. 네임노드는 블록 리포트를 통해 메타데이터를 생성하고 정보를 업데이트한다.

    액티브 네임노드와 스탠바이 네임노드를 함꼐 운영해 고가용성을 보장하는 구성의 경우, 데이터노드는 블록 리포트를 두 네임노드에 모두 보낸다. 이렇게 해 스탠바이 네임노드가 언제든지 액티브 네임노드의 작업을 넘겨받아 수행할 수 있도록 한다.

    랙 어웨어니스와 토폴로지

    HDFS와 얀은 모두 rack-aware이다. 이 뜻은 HDFS나 얀이 클러스터의 노드들이 상대적으로 어디에 위치하는지를 고려한다는 뜻이다. HDFS의 복사본 중 하나는 다른 랙에 위치하도록 보장하는 방식으로, 매니저는 내고장성을 위해 랙 어웨어니스를 사용한다. 따라서 네트워크 스위치가 고장 나거나 랙 전체가 고장이 난다고 하더라도 데이터를 사용할 수 있다는 것을 보장할 수 있다.

     

    리소스 매니저는 랙 어웨어니스를 활용해 데이터에 가까이 있는 노드에 리소스를 할당한다. 네임노드와 리소스 매니저 데몬은 DNS라는 이름으로 랙 ID를 구할 수 있는 API를 호출해 랙 정보를 얻는다.

    클러스터에 랙 어웨어니스 설정하기

    하둡은 topology.py라는 이름의 스크립트를 제공해 랙 어웨어니스를 클러스터에 설정할 수 있도록 해준다. 하둡은 이 스크립트를 이용해 랙에 있는 노드의 위치를 파악한다. 이 스크립트는 클러스터에 있는 모든 노드의 노드 정보를 추가하는 텍스트 기반 제어 파일을 이용해 동작한다.

    스크립트를 실행하면, 스크립트는 랙 정보 파일로 제공된 IP 주소를 사용해 각 랙에 대한 랙 이름 목록을 리턴한다. core-site.xml에 topology.py를 사용할 수 있도록 명시해야 한다.

    클러스터의 랙 정보 찾기

    관리자가 topology 스크립트를 설정하면, 각 클러스터의 모든 노드에 스크립트를 실행해 각 노드의 랙 ID를 찾게된다.

    dfsadmin -printTopology라는 명령으로 클러스터의 랙 정보를 확인할 수 있다.

    하둡이 데이터를 분산시키는 방법

    소규모 클러스터의 아키텍처에서는 모든 노드들이 하나의 랙에 위치하고, 단순히 노드가 살아있는지만 판단하면 된다.

     

    복제본을 만들 때 다음과 같은 복제가 일어난다.

    • 복제본의 1/3은 한 노드에 쓰인다.
    • 복제본의 2/3은 같은 랙에 쓰인다.
    • 복제본의 1/3은 다른 랙에 분산 저장된다.

    이렇게 하는 목적은 랙 간의 쓰기를 최소화해 쓰기 성능을 높이는 데 있다. 데이터를 3개의 랙이 아니라 2개의 랙에 저장하면 데이터를 읽을 때 네트워크 대역폭을 더 적게 사용할 수도 있다.

    클러스터의 랙 정보 수집하기

    fsck과 dfsadmin 명령을 사용하면 랙 정보를 잘 설정했는지 확인할 수 있다.

    fsck 명령은 클러스터에 있는 랙의 수를 보여준다.

    dfsadmin -report 명령은 클러스터의 각 노드에 대한 랙 정보를 볼 수 있다.

     

    HDFS의 신뢰성과 성능은 복제본을 어떻게 배치할지에 크게 의존한다. 랙 어웨어를 고려한 복제본 복사는 신뢰성을 높이고 데이터의 가용성을 증가시킨다. 랙 토폴로지를 구성할 때 topology 스크립트를 사용하면 랙 전체가 고장이 나는 상황에서도 데이터를 보호할 수 있다. 하둡은 클라이언트가 동작하는 노드에 첫 번째 복사본을 만들고, 나머지 2개는 다른 랙에 있는 서로 다른 노드들에 복제본을 만든다.

    HDFS의 데이터 복제

    HDFS는 HDFS의 데이터를 파일과 디렉토리라는 형태로 구분한다. 이것은 리눅스 파일 시스템에서 파일과 디렉토리가 쓰이는 방식과 비슷하다.

    • HDFS 데이터가 데이터 블록으로 관리되는 방식
    • HDFS 데이터의 복제와 데이터 보호
    • 블록과 복제 상태

    HDFS 데이터 관리 및 데이터 블록

    하둡에서 저장 시에 사용하는 주요 관리 단위는 데이터 블록이다. 이 블록은 데이터를 디스크에 쓰거나 읽을 수 있는 데이터 청크의 최소 단위다. 사용자는 데이터를 파일로 다루지만 fsck와 같은 관리 툴은 블록 레벨로 다룬다.

     

    데이터 블록 사이즈를 크게 하면 디스크에서 데이터를 찾는 비용과 데이터를 전송하는 속도에 의존하는 데이터 전송 비용을 최소화할 수 있다. 하둡은 클러스터의 데이터노드에 데이터 청크들을 나눠 배치한다.

     

    클라이언트가 데이터를 HDFS 파일에 쓰려면 먼저 데이터를 임시 로컬 파일에 기록해야 한다. 로컬 파일의 크기가 HDFS의 블록 사이즈보다 커지지만, 클라이언트가 네임노드에 연결해 HDFS에 파일을 만들도록 요청한다. 네임노드는 파일 이름을 네임스페이스에 만들고 HDFS에 데이터 블록을 배치한다. 네임노드는 클라이언트에게 데이터 블록 넘버를 알려주고, 데이터 블록을 저장하고, 복제된 데이터노드 리스트를 알려준다.

    데이터 복제

    데이터를 멀티 노드에 복제하는 방식으로 신뢰성을 보장한다. 신뢰성을 보장하는 것 이외에 이 방법은 데이터 전송률을 높이고 데이터가 있는 곳에서 계산 로직을 이동할 수 있는 확률을 높이는 용도로 사용한다.

     

    클라이언트가 네임노드에서 데이터노드와 블록 정보를 얻으면 클라이언트는 데이터를 파일 시스템에서 HDFS로 보낸다. 클라이언트는 데이터 블록의 내용을 파일 시스템에서 받아 네임노드에서 받는 데이터노드 리스트의 첫 번째 데이터노드에 보낸다. 데이터 복제는 첫 번째 데이터노드에 데이터 블록의 첫 번째 복사본이 쓰이는 것과 동시에 이뤄진다.

     

    복제된 데이터가 쓰이는 각 데이터노드는 데이터노드 리스트상에 있는 이전 데이터노드에게서 데이터를 받는다. 그리고 데이터를 받을과 동시에 다음 데이터노드로 전송한다. 첫 번째 데이터노드가 데이터를 받기 시작함에 따라 데이터노드는 데이터 청크를 디스크에 기록하고 두 번째 데이터노드에 데이터를 전송한다. 이제 두 번째 데이터노드가 데이터를 기록하고 세 번째 데이터노드 데이터를 넘겨준다.

     

    네임노드는 데이터노드의 하트비트 메세지에 응답할 때 블록의 복제 및 폐기 명령들을 실어 보낸다. 데이터노드가 일정 시간(10분) 동안 하트비트를 보내지 않으면 네임노드는 데이터노드가 죽었다고 판단한다.

    HDFS 복제 계수와 데이터 보호

    하둡이 데이터 복제본을 클러스터의 데이터노드들에 위치시키는 전략은 다음과 같이 결정된다.

    • 첫 번째 복제본은 클라이언트가 동작하고 있는 노드에 위치시킨다. 클라이언트가 클러스터의 외부의 노드에서 동작하고 있으면 복제본은 클러스터의 노드 중 무작위로 선택된 노드에 만들어진다.
    • 두 번째 복제본은 첫 번째 복제본이 있던 랙과 다른 랙의 한 데이터노드에 위치시킨다.
    • 세 번째 복제본은 2단계에서 선택한 원격 랙에서 다른 데이터노드를 무작위로 선택해 위치시킨다.

    블록과 복제본의 상태

    HDFS 데이터 블록의 리눅스 파일 시스템 생성되는 위치

    로컬 파일 시스템에 있는 HDFS 데이터 디렉토리에 각 데이터 블록의 복제본마다 2개의 파일을 갖고 있는 것을 확인할 수 있다. 하나는 데이터 파일로 실제 데이터를 갖고 있고, 다른 하나는 작은 사이즈의 메타 파일로 데이터 파일의 데이터를 설명하는 데이터다. 여기서 데이터 파일 사이즈는 파일(256MB)의 블록 사이즈와 동일하다. 필요하면 데이터노드를 내리고 파일을 다른 디스크로 이동할 수 있다.

    클라이언트가 HDFS 데이터를 읽고 쓰는 방식

    클라이언트가 HDFS 데이터를 읽는 방식

    • 클라이언트가 HDFS 데이터를 읽고자 할 때, 먼저 네임노드에 연결해 읽고자 하는 파일의 처음 몇개 블록들의 위치를 찾는다.
    • 네임노드는 처음 몇 개의 블록에 대한 복제본들이 저장된 모든 데이터노드의 주소들을 반환한다.
    • 클라이언트는 데이터노드에서 데이터를 반환한 목록을 기반으로 데이터를 읽는 작업을 시작한다.
    • 클라이언트가 블록을 읽어 데이터 블록이 디스크에 저장될 때 원래 데이터의 체크섬과 현재 가져온 데이터 블록의 체크섬이 일치하는지 확인한다. 체크섬이 다르면 다음 데이터노드로 이동한다. 이때 클라이언트는 네임노드에도 데이터 블록이 잘못됐다는 것을 알려줘 데이터노드가 문제가 된 데이터 블록에 대해 다른 노드에 복제본을 생성한다. 데이터노드는 자신이 저장하고 있는 모든 데이터 블록에 대해 매 3주마다 체크섬을 확인하다.
    • 클러스터의 데이터노드에서 읽기 요청이 발생하면 클라이언트는 먼저 자신의 데이터노드에서 읽기 요청을 처리할 수 있는지 확인해 다른 곳의 데이터노드에 가지 않도록 한다.
    • 클라이언트가 블록을 읽기 시작하면 네임노드는 다음 데이터 블록들의 위치를 클라이언트에게 보낸다. 네임노드는 각각의 데이터 블록에 대해 클라이언트에 가까운 정보를 갖고 최선의 데이터노드 리스트를 보낸다.

    클라이언트가 HDFS 데이터를 쓰는 방식

    • 클라이언트가 가장 먼저 하는 일은 파일을 생성하고 네임노드에 연결한다.
    • 네임노드는 파일이 기존에 갖고 있는 파일이 아닌지 확인하고 요청한 클라이언트가 명령을 수행할 권한을 갖고 있어 파일을 생성할 수 있는지 확인한다. 그런 다음, 파일에 대한 메타데이터를 기록한다. 블록의 이름과 데이터노드의 목록을 클라이언트에 보낸다.
    • 클라이언트가 HDFS에 쓸 파일을 블록들로 나눈다. 그리고 이 블록들을 여러 데이터노드에 나눠 HDFS에 기록한다.
    • 첫 번째 데이터노드는 리스트의 부 전째 노드에 연결하고 자신이 받은 데이터 블록을 두 번째 데이터노드에 전달한다.
    • 두 번째 노드는 다음 데이터노드에 연결해 데이터를 다시 전달한다.
    • 세 노드 모두에 복제본이 쓰였을 때, 완료 패킷이 데이터노드의 파이프라인을 통해 전달되면서 모든 노드에 데이터 블록이 성공적으로 쓰인 것을 알린다. 클라이언트가 이 사실을 인지하면 다음번 블록에 대한 처리를 시작한다.
    • 모든 블록의 복제본들이 쓰이면 네임노드는 editlog에 블록을 커밋해 데이터가 쓰였음을 표시한다.
    • 클라이언트가 HDFS 파일에 데이터를 기록하는 작업을 완료했을 때 파일을 닫는다.
    • 클라이언트는 네임노드에 파일 쓰기가 완료됐음을 알린다.

    블록의 복제는 비동기적으로 처리된다.

    클라이언트가 데이터 블록을 모든 데이터노드에 보내야 하는 것은 아니다.

    가각의 데이터노드는 노드에 저장할 각각의 데이터 블록의 체크섬을 저장한다. 데이터 블록을 읽을 때, 여기서 만들어진 체크섬으로 데이터에 문제가 없는지 확인한다.

    네임노드는 데이터노드에서 전달받는 블록 리포트를 통해 메타데이터를 생성한다.

    클라이언트가 데이터를 저장하는 위치

    클라이언트가 새 파일 블록을 만들거나 기본 파일에 추가하기 위해 파일을 열 때마다 쓰기 오퍼레이션은 복제본이 저장될 데이터노드의 파이프라인을 생성한다. 모든 쓰기는 복제 파이프라인을 통해 이뤄진다. 복제 파이프라인에 있는 각 데이터노드는 데이터 패킷을 버퍼로 저장한다. 그리고 완전한 데이터 패킷을 받자마자 해당 패킷을 다음 데이터노드에 전송한다. 전송 상태와 상관없이 클라이언트는 데이터노드에서 완료 메세지를 기다리지 않고 다음 패킷을 전송한다. 데이터 무결성 보장을 위해 각 데이터 블록에 대해 데이터의 체크섬을 만들어 데이터노드에 보낸다. 데이터 블록이 데이터노드에 완전히 전송되면 데이터노드가 네임노드에 새로운 데이터 블록이 저장됐다는 것을 리포팅한다. 

    HDFS 복구 프로세스

    • 생성 스탬프
    • 사용권 복구
    • 블록 복구
    • 파이프라인 복구

    생성 스탬프

    네임노드는 생성 스탬프라는 단조 증가 수를 관리한다. 데이터 블록과 복제 데이터는 모든 GS를 갖고 있다. GS는 데이터노드가 클러스터에 다시 조인할 때 복제본 중 변경된 데이터를 찾을 때 도움이 된다.

    사용권 복구

    사용권을 통해 파일에 대한 락으로 사용돼 여러 쓰기 오퍼레이션이 동시에 일어나는 것을 방지하는 데 사용된다.

    블록 복구

    블록 복구는 사용권 복구 이후에만 진행된다. 블록 복구 과정은 사용권 복구 과정에서 파일이 닫혔을 때, 마지막 블록에 대한 모든 복제본들이 같은 크기를 갖도록 보장하는 것이다.

    파이프라인 복구

    데이터노드가 파일을 쓰는 도중 문제가 생겼다는 HDFS는 에러를 복구해 파일에 대한 쓰기 작업을 계속할 수 있도록 한다.

    HDFS의 중앙집중적 캐시 관리

    하이브의 작은 팩트 테이블 같은 일부 파일에 대해 애플리케이션이 자주 사용한다면 하둡의 캐시 관리 기능을 이용해 특정 경로를 캐시하도록 지정할 수 있다.

    중앙 캐시 관리의 핵심 원리

    • 중앙 캐시의 상태 인지: 캐시 지역화를 고려한 잡 스케줄링에 도움이 됨.
    • 로딩 성능에 대한 예상: 클러스터의 캐시 상태를 알고 있기 때문에 가능.
    • 제로-카피: 디스크에 데이터를 내려보내는 대신, 로컬 캐시에 현재 데이터를 고정함으로써 가능.

    하둡의 아카이브 스토리지, SSD와 메모리

    인터랙티브 프로세싱을 위해 하둡을 사용하는 하이브와 다른 애플리케이션은 SSD와 같은 매체가 제공하는 높은 랜덤 I/O 성능이 제품의 성능에 더 영향을 미치게 됐다. 

    댓글

Designed by Tistory.