Amazon EMR 클러스터에서 NameNode용 안전 모드 서비스를 해제하려면 어떻게 해야 합니까?

6분 분량
0

Amazon EMR 클러스터에서 Apache Hadoop 또는 Apache Spark 작업을 실행하려고 하면 NameNode 서비스가 안전 모드로 전환됩니다. 안전 모드를 끄려고 시도했지만 즉시 다시 켜집니다. NameNode를 안전 모드에서 꺼내고 싶습니다.

간략한 설명

Amazon EMR 클러스터에서 Apache Hadoop 또는 Apache Spark 작업을 실행할 때 다음 오류 메시지 중 하나를 받을 수 있습니다.

"Cannot create file/user/test.txt._COPYING_. Name node is in safe mode."

"org.apache.hadoop.hdfs.server.namenode.SafeModeException: Cannot delete /user/hadoop/.sparkStaging/application_15xxxxxxxx_0001. Name node is in safe mode. It was turned on manually. Use "hdfs dfsadmin -safemode leave" to turn safe mode off. NamenodeHostName:ip-xxx-xx-xx-xx.ec2.internal"

NameNode에 대한 안전 모드는 Hadoop 분산 파일 시스템(HDFS) 클러스터의 읽기 전용 모드입니다. 안전 모드에서는 파일 시스템 또는 블록을 수정할 수 없습니다. DataNodes에서 대부분의 파일 시스템 블록을 사용할 수 있다고 보고한 후 NameNode는 자동으로 안전 모드를 종료합니다. 그러나 다음과 같은 이유로 NameNode가 안전 모드로 전환될 수 있습니다.

  • 사용 가능한 공간의 크기가 NameNode 저장소 디렉터리에 필요한 공간보다 작습니다. NameNode 디렉터리에 필요한 공간의 크기는 파라미터 dfs.namenode.resource.du.reserved에 정의되어 있습니다.
  • NameNode에서 FsImageEditLog를 메모리에 로드할 수 없습니다.
  • NameNode가 DataNode에서 블록 보고서를 받지 못했습니다.
  • 클러스터의 일부 노드가 다운되었을 수 있습니다. 이로 인해 노드의 블록을 사용할 수 없게 됩니다.
  • 일부 블록이 손상되었을 수 있습니다.

NameNode 로그 위치 **/var/log/hadoop-hdfs/**에서 문제의 근본 원인을 확인합니다.

해결 방법

안전 모드를 종료하기 전에 NameNode가 안전 모드에서 멈춘 이유를 알고 이해했는지 확인합니다. 모든 DataNode와 NameNode 로그의 상태를 검토합니다.

중요: 경우에 따라 안전 모드를 수동으로 끄면 데이터가 손실될 수 있습니다.

안전 모드를 수동으로 끄려면 다음 명령을 실행합니다.

sudo -u hdfs hadoop dfsadmin -safemode leave

오류의 근본 원인에 따라 다음 문제 해결 단계 중 하나 이상을 완료하여 안전 모드를 끄십시오.

다중 프라이머리 노드가 있는 클러스터로 전환

단일 프라이머리 노드가 있는 클러스터에서는 체크포인트가 자동으로 수행되지 않습니다. 즉, HDFS 편집 로그가 새 스냅샷(FsImage)에 백업되지 않고 제거되지 않습니다. HDFS는 편집 로그를 사용하여 스냅샷 간의 파일 시스템 변경 사항을 기록합니다. 단일 프라이머리 노드가 있는 클러스터에서 편집 로그를 수동으로 제거하는 것이 가장 좋습니다. 편집 로그를 수동으로 제거하지 않으면 로그가 /mnt의 모든 디스크 공간을 사용할 수 있습니다. 이 문제를 해결하려면 다중 프라이머리 노드가 있는 클러스터를 시작합니다. 기본 노드가 여러 개 있는 클러스터는 HDFS NameNode의 고가용성을 지원합니다. NameNode의 고가용성은 체크포인트 문제를 해결합니다.

자세한 내용은 프라이머리 노드 계획 및 구성을 참조하세요.

/mnt에서 불필요한 파일 제거

/mnt에 사용할 수 있는 최소 디스크 공간은 dfs.namenode.resource.du.reserved 파라미터에 의해 지정됩니다. /mnt에서 사용 가능한 디스크의 공간이 dfs.namenode.resource.du.reserved에 설정된 값보다 낮은 값으로 떨어지면 NameNode가 안전 모드로 들어갑니다. dfs.namenode.resource.du.reserved의 기본값은 100MB입니다. NameNode가 안전 모드에 있으면 파일 시스템 또는 블록 수정이 허용되지 않습니다. 따라서 /mnt에서 불필요한 파일을 제거하면 문제를 해결하는 데 도움이 될 수 있습니다.

더 이상 필요하지 않은 파일을 삭제하려면 다음 단계를 완료합니다.

1.    SSH를 사용하여 프라이머리 노드에 연결합니다.

2.    NameNode 로그를 확인하여 디스크 공간이 부족하여 NameNode가 안전 모드에 있는지 확인합니다. 해당 로그는 /var/log/hadoop-hdfs에 있습니다. 디스크 공간이 충분하면 로그는 다음과 비슷할 수 있습니다.

2020-08-28 19:14:43,540 WARN org.apache.hadoop.hdfs.server.namenode.NameNodeResourceChecker (org.apache.hadoop.hdfs.server.namenode.FSNamesystem$NameNodeResourceMonitor@5baaae4c): Space available on volume '/dev/xvdb2' is 76546048, which is below the configured reserved amount 104857600

디스크 공간이 부족할 경우 로그는 다음과 비슷할 수 있습니다.

2020-09-28 19:14:43,540 WARN org.apache.hadoop.hdfs.server.namenode.FSNamesystem (org.apache.hadoop.hdfs.server.namenode.FSNamesystem$NameNodeResourceMonitor@5baaae4c): NameNode low on available disk space. Already in safe mode.

3.    다음 명령을 실행하여 NameNode가 여전히 안전 모드에 있는지 확인합니다.

[root@ip-xxx-xx-xx-xxx mnt]# hdfs dfsadmin -safemode get
Safe mode is ON

4.    /mnt에서 불필요한 파일을 삭제합니다.

디렉터리 in/mnt/namenode/current가 하나의 프라이머리 노드가 있는 클러스터에서 많은 공간을 사용하는 경우, 새 스냅샷(FsImage)을 생성합니다. 그런 다음 이전 편집 로그를 제거합니다.

예를 들어, 다음 작업을 수행하는 스크립트를 실행합니다.
새 스냅샷을 생성합니다.
오래된 편집 로그를 Amazon Simple Storage Service(Amazon S3) 버킷에 백업합니다.
편집 로그를 제거합니다.

예제 스크립트:

#!/bin/bash
hdfs dfsadmin -safemode enter
hdfs dfsadmin -saveNamespace
sudo su - root -c "hdfs dfs -put /mnt/namenode/current/*edits_[0-9]* s3://doc-example-bucket/backup-hdfs/"
sudo su - root -c "rm -f /mnt/namenode/current/*edits_[0-9]*"
sudo su - root -c "rm -f /mnt/namenode/current/seen*"
hdfs dfsadmin -safemode leave

참고: 위 스크립트는 진행 중인 편집에 대한 로그를 제거하지 않습니다.

5.    /mnt에서 사용 가능한 디스크 공간의 크기를 확인합니다. 사용 가능한 공간이 100MB를 초과하면 안전 모드 상태를 다시 확인합니다. 그런 다음 안전 모드를 끕니다.

[hadoop@ip-xxx-xx-xx-xxx ~]$ hdfs dfsadmin -safemode get
Safe mode is ON
[hadoop@ip-xxx-xx-xx-xxx ~]$ hdfs dfsadmin -safemode leave
Safe mode is OFF

여전히 /mnt에 사용 가능한 공간이 100MB 미만인 경우 다음 조치 중 하나 이상을 수행합니다.

더 많은 파일 제거

1.    SSH를 사용하여 프라이머리 노드에 연결합니다.

2.    /mnt 디렉터리로 이동합니다.

cd /mnt

3.    디스크 공간을 가장 많이 사용하고 있는 폴더를 확인합니다.

sudo du -hsx * | sort -rh | head -10

4.    디스크 공간 문제의 원인을 찾을 때까지 계속 조사합니다. 예를 들어 var 폴더가 많은 디스크 공간을 사용하는 경우 var에서 가장 큰 하위 폴더를 확인합니다.

cd var
sudo du -hsx * | sort -rh | head -10

5.    디스크 공간을 차지하는 파일 폴더를 확인한 후 해당 파일을 삭제합니다. 더 이상 필요하지 않은 파일만 삭제해야 합니다. /mnt/var/log/hadoop-hdfs/ 및 **/mnt/var/log/hadoop-yarn/**의 압축된 로그 파일은 Amazon S3 로깅 버킷에 이미 백업되어 있습니다. 이러한 로그 파일은 삭제하기에 적합합니다.

6.    불필요한 파일을 삭제한 후 안전 모드 상태를 다시 확인합니다. 그런 다음 안전 모드를 끕니다.

[hadoop@ip-xxx-xx-xx-xxx ~]$ hdfs dfsadmin -safemode get
Safe mode is ON
[hadoop@ip-xxx-xx-xx-xxx ~]$ hdfs dfsadmin -safemode leave
Safe mode is OFF

손상되었거나 누락된 블록/파일이 있는지 확인

1.    다음 명령을 실행하여 클러스터의 상태를 확인하는 데 도움이 되는 보고서를 확인합니다. 보고서는 또한 복제되지 않은 블록의 비율과 누락된 복제본의 수를 제공합니다.

hdfs fsck /

2.    목록의 각 파일에 대해 다음 명령을 실행하여 파일의 각 블록에 대한 DataNode를 찾습니다.

hdfs fsck example_file_name -locations -blocks -files

참고: example_file_name을 파일 이름으로 바꿉니다.

표시되는 메시지는 다음 메시지와 유사합니다.

0. BP-762523015-192.168.0.2-1480061879099:blk_1073741830_1006 len=134217728 MISSING!
1. BP-762523015-192.168.0.2-1480061879099:blk_1073741831_1007 len=134217728 MISSING!
2. BP-762523015-192.168.0.2-1480061879099:blk_1073741832_1008 len=70846464 MISSING!

이전 메시지에서 블록이 저장된 DataNode를 찾을 수 있습니다. 예를 들면 "192.168.0.2."입니다. 그런 다음 해당 DataNode의 로그를 보고 블록 ID(blk_xxx)와 관련된 오류를 검색할 수 있습니다. 노드가 종료되어 블록이 누락되는 경우가 많습니다.

3.    손상된 파일을 삭제하려면 안전 모드를 종료합니다. 그리고 다음 명령을 실행합니다.

hdfs dfs -rm example_file_name

참고: example_file_name을 파일 이름으로 바꿉니다.

CloudWatch 지표를 사용하여 HDFS의 상태 모니터링

다음 Amazon CloudWatch 지표는 NameNode가 안전 모드로 전환되는 잠재적 원인을 모니터링하는 데 도움이 될 수 있습니다.

  • HDFSUtilization: 사용 중인 HDFS 스토리지의 비율입니다.
  • MissingBlocks: HDFS에 복제본이 없는 블록 수입니다. 손상된 블록일 수 있습니다.
  • UnderReplicatedBlocks: 한 번 이상 복제해야 하는 블록 수입니다.

관련 정보

HDFS 사용자 가이드(Apache Hadoop 웹 사이트에서 제공)

AWS 공식
AWS 공식업데이트됨 일 년 전