반응형

잘못된 정보가 있다면 댓글로 알려주시면 감사하겠습니다!

 

HDFS(Hadoop Distributed File System)

대량의 데이터를 다루기 위한 분산 처리 오픈 소스 프레임워크, 하둡(Hadoop)의 file system을 담당하는

분산 저장소이다.

 

  • 하나의 물리 저장소 용량을 초과하는 데이터를 다룰 때, 여러개의의 저장소에 데이터를 나누어 저장한 뒤, 병렬 처리한다. 이를 분산  파일 시스템이라 한다.
  • 저장소의 연결은 네트워크로 이루어져 있다.
  • 많은 데이터 처리량을 목적으로 하기 때문에 access time에는 불리함(Trade off)
  • 저장소의 중심 역할 NameNode와 실질적으로 데이터를 저장하는 DataNode들로 이루어진다.
    • NameNode의 메모리에 file들의 메타 데이터(in namespace)를 가지고 있기 때문에 전체 저장소의 용량은 NameNode의 메모리 용량에 영향을 받는다.
  • 데이터는 Block이라는 단위로 쪼개져서 저장된다. (default = 128MB, why? 128MB가 비트단위로 딱 떨어진다고 함 = 메모리 낭비X)
  • NameNode가 잘못되면 데이터를 읽을 수 없는데, 이를 방지하기 위해 Secondary NameNode를 사용한다. 또한, 메타데이터는 백업 파일로 유지한다.

 

 

Replication & 저장 & 불러오기

- 데이터 보존, 신뢰성을 보장한다.

  • 하나의 Block을 최소 3개의 서로 다른 DataNode에 저장한다. 따라서, 하나의 Block이 잘못되어도 다른 Block을 가져올 수 있다.
  • DataNode는 주기적으로 NameNode에게 신호(heartbeat)를 보낸다. DataNode가 다운되는 것을 이 신호로 판단한다. 
  • 또한 DataNode에 데이터가 저장될 때, checksum이 함께 보내진다. 이 checksum을 통해 주기적으로 block 상태에 대한 block report를 NameNode에게 보낸다.
    • 만약 손상된 block이 있다면 해당 block을 삭제하고 해당 block을 가지고 있는 DataNode에게 새로운 복제를 요청한다.
  • 파일의 저장 과정
    • client가 file 저장 → 해당 file은 지정된 block size에 따라 block 단위로 쪼개진다.
    • 첫번째 block 부터 NameNode에 저장 요청
    • NameNode는 해당 block을 지정된 replica 개수 만큼의 DataNode를 선정하여 client에게 목록 전달
      • 정상 작동하는 DataNode를 어떻게 알까? heartbeat! (곧 언급된다.)
    • client는 전달 받은 DataNode list 중 첫번째에게 데이터(block)을 전달
    • block을 전달 받은 DataNode가 다음 DataNode에게 동일한 block 전달 → 마지막 DataNode까지
    • 모든 replication의 저장이 정상적으로 완료되면 NameNode에게 저장완료(ACK) 신호를 보낸다.(중간에 하나의 DataNode라도 저장 오류가 발생하면 해당 block의 저장은 처음부터 다시 시작) 
    • client가 NameNode에게 다음 block 저장 요청 → 반복하여 모든 block을 저장
    • file이 정상적으로 분산 저장되면, NameNode에는 복제본을 포함한 해당 file에 대한 block들의 저장 정보, meta data를 저장한다. 
  • 파일 불러오기 과정
    • 접근하고자 하는 file을 NameNode에게 요청.
    • NameNode에는 해당 file의 meta data를 client에게 반환해준다.
    • client는 첫번째 block 부터 해당 block을 저장하고 있는 DataNode 중 한 곳에 접근하는데,
      • 이 때, network상 더 가까운 곳에 있는 DataNode를 우선적으로 선택한다.(속도 측면)
    • 모든 block을 받아오고 병합 

 

Locality

데이터 접근 속도, 보존

  • 임의 file의 block들은 첫번째 block은 client와 가까운 곳에 저장함(같은 서버 or 같은 rack)
  • NameNode 이하 DataNode들은 rack이라는 스위칭 가능한 네트워크 단위로 묶여있다.
  • 해당 rack이 다운되면 안에 있는 DataNode들은 모두 다운된다. 따라서 연관성 있는 block들과, 그들의 replica를 '적절하게' 위치시킬 필요가 있다.
    • Data-local : 같은 DataNode에 위치 시킨다.  
    • Rack-local : 같은 rack의 다른 DataNode에 위치시킨다. 
    • Off-local : 다른 rack에 위치시킨다.
  • ex. (replica = 3) 일 때, hdfs는 두개의 block은 같은 rack의 다른 DataNode, 나머지 하나의 block은 다른 rack에 위치시키는 방법을 사용
  • 결국, block을 저장하는 방법을 통해 rack 다운으로 인한 손실 방지, read&write 속도 향상 등 효과를 볼 수 있다.

 

 

 

HDFS VS S3(특성 or 상대적 장점)

- S3

  • S3는 HDFS와 같은 file system이라고 보기 어렵고, Object store이다. 즉, 저장한 object(value)와 이를 가리키는 key가 존재할 뿐이다.
  • S3는 궁극적 일관성(Eventual Consistency)을 가진다. (read, write가 여러군데에서 동시적으로 일어날 경우, 수정 이전 정보를 보여주거나, 결과를 보여주지 않는다.)
  • 용량 대비 가격이 저렴하다. S3는 HDFS와 달리 replica에 대한 비용은 요구하지 않는다.

 

- HDFS

  • 처리량이 높다. 데이터를 연속적으로 저장하는 S3와 달리 여러 Block으로 나누어 병렬 처리하기 때문이다.
  • 지연시간이 짧다. (hdfs의 locality)

 

 

 

 

HDFS 연결&입력 기초

ssh hadoop@<Public IP> # 노드 접속 (DataNode로 실습했음)
wget https://archive.apache.org/dist/hadoop/common/hadoop-<version>
tar -xvf hadoop-<version>.tar.gz

 

이제 configuration files들을 수정해준다.

(hadoop/etc/hadoop/core-site.xml)

HDFS와 Mapreduce에서 공통적으로 사용할 정보들을 설정, hdfs-site와 mapred-site의 공통 설정 부분

<configuration>
        <property>
                <name>fs.defaultFS</name>
                <value>hdfs://localhost:9000</value>
        </property>
</configuration>

(hadoop/etc/hadoop/hdfs-site.xml) : 하둡 파일시스템(HDFS)과 관련된 환경 정보를 설정

<configuration>
        <property>
                <name>dfs.replication</name>
                <value>1</value>
        </property>
</configuration>

(hadoop/etc/hadoop/hadoop-env.sh) Hadoop을 실행하는 쉘스크립트 파일, JDK Path, Classpath, 데몬 옵션 등 설정

# The java implementation to use. (이쪽 부분 수정)
export JAVA_HOME=/usr/lib/jvm/java-8-oracle
export HADOOP_HOME=/home/hadoop/hadoop-2.7.4

 

./bin/hadoop namenode -format # 초기 포맷
./sbin/start-dfs.sh # 실행

jps # check

hdfs 폴더 생성 및 업로드 

bin/hadoop fs -mkdir /user/<name> # 디렉토리 생성
bin/hadoop fs -put <file path> /user/<name>/ # hdfs에 만든 디렉토리에 file 업로드
bin/hadoop fs -ls <hdfs path> # hdfs path에 있는 파일들 확인

 

 

 

 

 

 

 

 

 

출처

yeomko.tistory.com/38

https://data-flair.training/blogs/rack-awareness-hadoop-hdfs/

loustler.io/languages/hdfs-concept/

wikidocs.net/63337

eyeballs.tistory.com/187

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형

+ Recent posts