-
[Hadoop] Secondary NameNode 알아보기Hadoop 2024. 1. 30. 08:08728x90반응형
- 목차
들어가며.
이번 글에서는 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
< 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
반응형'Hadoop' 카테고리의 다른 글
[Hadoop] MapReduce Combiner 알아보기 (0) 2024.02.11 [Hadoop] MapReduce Configuration 알아보기 (0) 2024.02.03 Zookeeper Ensemble 알아보기 (Leader Election, Sequential Znode) (0) 2023.12.19 Zookeeper Watch Mechanism 알아보기 (2) 2023.12.19 Zookeeper Znode 알아보기 (0) 2023.12.19