[Spark_2_보충] HDFS Basic

Hadoop HDFS Architecture

하기는 링크 자료를 토대로 HDFS 개념을 정리한 내용입니다.

모든 그림은 해당 링크에서 발췌했습니다.


0. 요약

1) 구성

  • NameNode
  • DataNode
  • Secondary NameNode
  • Block

2) Operation/Process

  • Replication
  • HDRF Write & Read
  • Data Streaming

1. 기본

  • HDFS는 기본적으로 Data를 쪼개서 관리(block-structured file system)
  • Write Once! - Read Many!(이미 Write하면 바꿀 수 없음. New data를 또 Write함)

2. 구성

  • 1) NameNode
    • metadata(block 저장 위치, 파일 사이즈, 권한 등등) 들고 있다가 Client 요청이 들어오면 해당 DataNode의 IP를 알려줌
    • DataNode와 주기적으로 정보를 교환하여, Block 위치, 정보 등을 계속 업데이트
    • metadata는 FsImage(namespace포함한 데이터 모든 정보) / EditLogs(DataNode에서 발생한 데이터 변환 내역)으로 이루어짐
    • namespace는 데이터를 특정할(identify) 수 있게 하는 역할
  • 2) Secondary NameNode
    • Check Point의 역할
    • NameNode의 RAM을 계속 백업
    • FsImage를 EditLogs에 결합하여 저장하며, NameNode는 이 FsImage를 copy
  • 3) DataNode
    • 고장나면 갈아치울 수 있는 값싼 하드웨어로 이해
    • 실제 block의 read/write 요청에 대응
    • 대략 3초 주기로 block 상황을 NameNode에 보고
  • 4) Block
    • 작은 location
    • HDFS가 아닌 일반적인 경우에는 Collection of Blcoks로 데이터를 저장
    • HDFS는 각 Block으로 쪼개서 저장
    • 기본 128MB/Block

3. Operation / Process

  • 1) Replicate: HDFS는 각 Block을 3벌씩 저장; DataNode와 Rack 고려
    • Data = BlockA + BlockB라면 BlockA3, BlockB3 개를 서로 다른 6개 DataNode에 저장
    • 각 6개 Block을 replication factor라고 부름
    • NameNode는 replication factor의 갯수와 저장장소(DataNode 겹치지 않도록) 관리(del or add)
    • Rack: 서버 담는 캐비닛.
      • BlockA의 replication factor 3개는 Rack1, Rack2에 1:2로 나누어 저장.
        • 어떤 rack을 고를까요? rack awarness algorithm을 따름
      • Rack 하나 통째로 날아갈 위험이 있어서 2개로 나눔
      • 그럼 왜 3개로 안나누는가? 같은 rack에 있으면 속도가 빠름(greater network bandwidth). 3개 다 같은 rack에 두고 싶으나 부득불 1:2로 나눈 것.
  • 2) Write
    • Data = BlockA + BLockB Write해보자
    • Client: NameNode에게 저장가능한지 확인 요청
    • NameNode: 확인후 허가. DataNodes IP(랜덤하게 DataNode 선택)를 전달.
      • 이때 DataNode availability, different DataNode, Rack awareness algorithm을 고려
      • BlockA: DataNode1,2,3
      • BlockB: DataNode4,5,6
    • DataNode에 replication factor 작성
  • 3) Write_details
    • 파이프라인 구축
    • 데이터 흘려보내기streaming & 복사replication
    • 파이프라인 종료
    • 상기 과정에서 데이터를 흘려보내는 과정 이해할 필요
      • Client가 각 DataNode에 파이프 라인을 각각 만들고(1번 과정)
      • BlockA, B를 첫번째 DataNode(1, 4)에 write
      • 그럼 DataNode(1, 4)가 그다음 DataNode(2, 5)에 데이터를 흘려보냄
  • 4) Read
    • Client: 원하는 Data(=BlockA + BlockB) 위치(DataNode1, 2)를 NameNode에게 받고
    • 각 DataNode에서 Parellel하게 Block(BlockA, BlockB)들을 읽어냄
< !-- add by yurixu 替换Google的jquery并且添加判断逻辑 -->