ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Hadoop] Secondary NameNode 알아보기
    Hadoop 2024. 1. 30. 08:08
    728x90
    반응형

     

    - 목차

     

    들어가며.

    이번 글에서는 Secondary NameNode 에 대해서 알아보는 시간을 가지겠습니다.

    Hadoop 은 크게 NameNode 와 DataNode 로 구성됩니다.

    하나의 파일을 Hadoop 에 저장하게 되면, 파일은 여러 블록들로 나뉘어져 저장됩니다.

    이러한 나누어진 블록들은 분산된 DataNode 들에 저장됩니다.

     

     

    하나의 온전한 파일이 여러 Block 들로 분리되고, 분리된 Block 들은 분산된 DataNode 로 저장됩니다.

    이 상황에서 NameNode 는 분산된 Block 들이 어떤 DataNode 에 저장되어 있는지,

    파일과 블록의 크기는 어떤지에 대한 메타데이터를 관리하게 됩니다.

    그래서 클라이어트가 어떤 파일을 요청하게 되면 NameNode 는 파일의 블록들의 위치 정보를 알 수 있기 때문에

    원본의 파일 형태로 복원할 수 있습니다.

     

    NodeNode 는 필연적으로 파일과 블록의 메타데이터들을 In-Memory 로써 관리합니다.

    그리고 On-Disk 구조로써 fsImage 와 Edit Log 라는 두가지 파일을 취급하는데요.

    이번 글의 주제인 Secondary NameNode 는 fsImage 와 Edit Log 와 관련이 깊습니다.

     

    Fsimage 와 Edit Log 에 대해서.

    fsImage 는 HDFS 의 전체적인 파일 구조의 스냅샷입니다.

    즉, NameNode 가 메모리 상에서 관리하는 메타데이터들을 기록해놓은 상태이자 파일입니다.

    fsImage 는 HDFS 가 수행하는 파일 생성, 수정, 삭제 등으로 인한 변화를 실시간으로 반영하지 않습니다.

    이러한 변경 사항들은 Edit Log 에 기록됩니다.

    그래서 Edit Log 와 Fsimage 를 병합함으로써 NameNode 는 현재 상태를 복원할 수 있게 됩니다.

     

    만약 NameNode 가 재시작하게 된다면 (Restart),

    NameNode 는 Edit Log 의 변경 사항에 대한 기록과 FsImage 를 병합하여 최신의 FsImage 을 만들고,

    이를 기반으로 메모리에 로드하여 NameNode 는 Ready 상태가 됩니다.

     

    그리고 Checkpoint 로 설정된 시간을 기준으로 새로운 fsImage 가 만들어집니다.

    dfs.namenode.checkpoint.period, dfs.namenode.checkpoint.txns 와 같은 설정을 통해서

    Checkpoint 의 주기를 설정할 수 있는데요.

    Checkpoint 주기마다 Edit Log 의 내용을 토대로 새로운 fsImage 가 만들어집니다.

     

    Secondary NameNode 란 ?

    Secondary NameNode 는 NameNode 가 수행하는 fsImage 를 생성하는 역할을 분담합니다.

    NameNode 가 HDFS 의 Entrypoint 로써 클라이언트에게 File 과 관련된 기능을 제공합니다.

    NameNode 의 이러한 본연의 역할에 집중할 수 있도록

    Secondary NameNode 는 NameNode 의 Edit Log 를 Merge 하여 새로운 New fsImage 를 생성하는 역할을 수행합니다.

     

    Secondary NameNode 는 어떻게 동작할까 ?

    Secondary NameNode 의 가장 큰 역할을 NameNode 의 Edit Log 을 fsImage 와 병합하여 최신의 fsImage 를 생성하는 작업입니다.

    Secondary NameNode 는 주기적으로 NameNode 의 Edit Log 을 조회합니다.

    그리고 Edit Log 의 변경 사항에 대한 기록과 FsImage 를 병합하여 새로운 New FsImage 를 생성합니다.

    새롭게 생성된 FsImage 는 NameNode 로 전달됩니다.

     

     

     

     

    Secondary NameNode 실행해보기.

    docker-compose 를 활용해서 Hadoop Cluster 와 Secondary NameNode 를 실행시켜보겠습니다.

    도커 이미지는 big-data-europe 에서 제공되는 이미지와 코드들을 참고하였습니다.

     

    https://github.com/big-data-europe

     

    Big Data Europe

    Integrating Big Data, software & communicaties for addressing Europe's societal challenges - Big Data Europe

    github.com

     

    < hadoop.env >

    cat <<EOF> /tmp/hadoop.env
    CORE_CONF_fs_defaultFS=hdfs://namenode:9000
    CORE_CONF_hadoop_http_staticuser_user=root
    CORE_CONF_hadoop_proxyuser_hue_hosts=*
    CORE_CONF_hadoop_proxyuser_hue_groups=*
    CORE_CONF_io_compression_codecs=org.apache.hadoop.io.compress.SnappyCodec
    
    HDFS_CONF_dfs_webhdfs_enabled=true
    HDFS_CONF_dfs_permissions_enabled=false
    HDFS_CONF_dfs_namenode_datanode_registration_ip___hostname___check=false
    HDFS_CONF_dfs_replication=1
    HDFS_CONF_dfs_namenode_secondary_http__address=0.0.0.0:50090
    HDFS_CONF_dfs_namenode_checkpoint_period=3600
    HDFS_CONF_dfs_namenode_checkpoint_txns=1000000
    
    YARN_CONF_yarn_log___aggregation___enable=true
    YARN_CONF_yarn_log_server_url=http://historyserver:8188/applicationhistory/logs/
    YARN_CONF_yarn_resourcemanager_recovery_enabled=true
    YARN_CONF_yarn_resourcemanager_store_class=org.apache.hadoop.yarn.server.resourcemanager.recovery.FileSystemRMStateStore
    YARN_CONF_yarn_resourcemanager_scheduler_class=org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler
    YARN_CONF_yarn_scheduler_capacity_root_default_maximum___allocation___mb=8192
    YARN_CONF_yarn_scheduler_capacity_root_default_maximum___allocation___vcores=4
    YARN_CONF_yarn_resourcemanager_fs_state___store_uri=/rmstate
    YARN_CONF_yarn_resourcemanager_system___metrics___publisher_enabled=true
    YARN_CONF_yarn_resourcemanager_hostname=resourcemanager
    YARN_CONF_yarn_resourcemanager_address=resourcemanager:8032
    YARN_CONF_yarn_resourcemanager_scheduler_address=resourcemanager:8030
    YARN_CONF_yarn_resourcemanager_resource__tracker_address=resourcemanager:8031
    YARN_CONF_yarn_timeline___service_enabled=true
    YARN_CONF_yarn_timeline___service_generic___application___history_enabled=true
    YARN_CONF_yarn_timeline___service_hostname=historyserver
    YARN_CONF_mapreduce_map_output_compress=true
    YARN_CONF_mapred_map_output_compress_codec=org.apache.hadoop.io.compress.SnappyCodec
    YARN_CONF_yarn_nodemanager_resource_memory___mb=16384
    YARN_CONF_yarn_nodemanager_resource_cpu___vcores=8
    YARN_CONF_yarn_nodemanager_disk___health___checker_max___disk___utilization___per___disk___percentage=98.5
    YARN_CONF_yarn_nodemanager_remote___app___log___dir=/app-logs
    YARN_CONF_yarn_nodemanager_aux___services=mapreduce_shuffle
    
    MAPRED_CONF_mapreduce_framework_name=yarn
    MAPRED_CONF_mapred_child_java_opts=-Xmx4096m
    MAPRED_CONF_mapreduce_map_memory_mb=4096
    MAPRED_CONF_mapreduce_reduce_memory_mb=8192
    MAPRED_CONF_mapreduce_map_java_opts=-Xmx3072m
    MAPRED_CONF_mapreduce_reduce_java_opts=-Xmx6144m
    MAPRED_CONF_yarn_app_mapreduce_am_env=HADOOP_MAPRED_HOME=/opt/hadoop-3.2.1/
    MAPRED_CONF_mapreduce_map_env=HADOOP_MAPRED_HOME=/opt/hadoop-3.2.1/
    MAPRED_CONF_mapreduce_reduce_env=HADOOP_MAPRED_HOME=/opt/hadoop-3.2.1/
    EOF

     

    < docker-compose YAML >

    cat <<EOF> /tmp/hadoop-docker-compose.yaml
    version: "3"
    
    services:
      namenode:
        image: bde2020/hadoop-namenode:2.0.0-hadoop3.2.1-java8
        container_name: namenode
        restart: always
        ports:
          - 9870:9870
          - 9000:9000
        volumes:
          - hadoop_namenode:/hadoop/dfs/name
        environment:
          - CLUSTER_NAME=test
        env_file:
          - /tmp/hadoop.env
    
      secondarynamenode:
        image: bde2020/hadoop-namenode:2.0.0-hadoop3.2.1-java8
        container_name: secondarynamenode
        # restart: always
        volumes:
          - hadoop_secondary_namenode:/hadoop/dfs/name
        environment:
          - CLUSTER_NAME=test
        env_file:
          - /tmp/hadoop.env      
        entrypoint: ['/entrypoint.sh', 'hdfs', '--config', '/etc/hadoop', 'secondarynamenode']
    
      datanode:
        image: bde2020/hadoop-datanode:2.0.0-hadoop3.2.1-java8
        container_name: datanode
        restart: always
        volumes:
          - hadoop_datanode:/hadoop/dfs/data
        environment:
          SERVICE_PRECONDITION: "namenode:9870"
        env_file:
          - /tmp/hadoop.env
      
      resourcemanager:
        image: bde2020/hadoop-resourcemanager:2.0.0-hadoop3.2.1-java8
        container_name: resourcemanager
        ports:
          - 8088:8088    
        restart: always
        environment:
          SERVICE_PRECONDITION: "namenode:9000 namenode:9870 datanode:9864"
        env_file:
          - /tmp/hadoop.env
    
      nodemanager1:
        image: bde2020/hadoop-nodemanager:2.0.0-hadoop3.2.1-java8
        container_name: nodemanager
        restart: always
        environment:
          SERVICE_PRECONDITION: "namenode:9000 namenode:9870 datanode:9864 resourcemanager:8088"
        env_file:
          - /tmp/hadoop.env
      
      historyserver:
        image: bde2020/hadoop-historyserver:2.0.0-hadoop3.2.1-java8
        container_name: historyserver
        restart: always
        environment:
          SERVICE_PRECONDITION: "namenode:9000 namenode:9870 datanode:9864 resourcemanager:8088"
        volumes:
          - hadoop_historyserver:/hadoop/yarn/timeline
        env_file:
          - /tmp/hadoop.env
      
    volumes:
      hadoop_namenode:
      hadoop_secondary_namenode:
      hadoop_datanode:
      hadoop_historyserver:
    
    EOF

     

    < docker-compose 실행하기 >

    docker-compose -f /tmp/hadoop-docker-compose.yaml -p hadoop up -d

     

    위 명령어들을 순차적으로 실행하시면 아래 이미지와 같이 Secondary NameNode 를 포함한 Hadoop Cluster 가 생성됩니다.

     

    NameNode 의 Edit Log , FsImage 확인하기.

    아래와 같이 NameNode 의 EditLog 와 FsImage 들을 확인할 수 있습니다.

    docker exec -it namenode ls -al /hadoop/dfs/name/current
    drwx------ 2 root root    4096 Mar  6 04:20 .
    drwxr-xr-x 3 root root    4096 Mar  4 11:22 ..
    -rw-r--r-- 1 root root     214 Mar  5 23:18 VERSION
    -rw-r--r-- 1 root root 1048576 Mar  4 11:43 edits_0000000000000000001-0000000000000000008
    -rw-r--r-- 1 root root 1048576 Mar  4 11:54 edits_0000000000000000009-0000000000000000045
    -rw-r--r-- 1 root root 1048576 Mar  5 00:13 edits_0000000000000000046-0000000000000000080
    -rw-r--r-- 1 root root 1048576 Mar  5 23:18 edits_0000000000000000081-0000000000000000081
    -rw-r--r-- 1 root root   14664 Mar  6 00:09 edits_0000000000000000082-0000000000000000232
    -rw-r--r-- 1 root root 1048576 Mar  6 00:09 edits_0000000000000000233-0000000000000000233
    -rw-r--r-- 1 root root   27642 Mar  6 04:20 edits_0000000000000000234-0000000000000000516
    -rw-r--r-- 1 root root 1048576 Mar  6 04:20 edits_inprogress_0000000000000000517
    -rw-r--r-- 1 root root    1734 Mar  6 00:09 fsimage_0000000000000000232
    -rw-r--r-- 1 root root      62 Mar  6 00:09 fsimage_0000000000000000232.md5
    -rw-r--r-- 1 root root    1734 Mar  6 04:20 fsimage_0000000000000000516
    -rw-r--r-- 1 root root      62 Mar  6 04:20 fsimage_0000000000000000516.md5
    -rw-r--r-- 1 root root       4 Mar  6 04:20 seen_txid

     

    그리고 NameNode 의 Edit Log 와 FsImage 는 Secondary NameNode 에서도 확인할 수 있는데요.

    아래의 명령어를 통해서 Secondary NameNode 가 Edit Log 와 FsImage 를 NameNode 로부터 복사하여,

    싱크를 유지하고 있음을 확인할 수 있습니다.

     

    docker exec -it secondarynamenode ls -al /tmp/hadoop-root/dfs/namesecondary/current
    drwxr-xr-x 2 root root    4096 Mar  6 04:20 .
    drwxr-xr-x 3 root root    4096 Mar  6 04:19 ..
    -rw-r--r-- 1 root root     214 Mar  6 04:20 VERSION
    -rw-r--r-- 1 root root 1048576 Mar  6 00:09 edits_0000000000000000081-0000000000000000081
    -rw-r--r-- 1 root root   14664 Mar  6 00:09 edits_0000000000000000082-0000000000000000232
    -rw-r--r-- 1 root root 1048576 Mar  6 04:20 edits_0000000000000000233-0000000000000000233
    -rw-r--r-- 1 root root   27642 Mar  6 04:20 edits_0000000000000000234-0000000000000000516
    -rw-r--r-- 1 root root    1734 Mar  6 04:20 fsimage_0000000000000000232
    -rw-r--r-- 1 root root      62 Mar  6 04:20 fsimage_0000000000000000232.md5
    -rw-r--r-- 1 root root    1734 Mar  6 04:20 fsimage_0000000000000000516
    -rw-r--r-- 1 root root      62 Mar  6 04:20 fsimage_0000000000000000516.md5

     

     

    반응형
Designed by Tistory.