Hadoop datanode 는 일정 시간 간격 으로 오 류 를 끊 습 니 다: java. lang. OutOfmory 오류: GC overhead limit exceeded

배경:
       이전 데이터 양 이 증가 하여 클 러 스 터 가 10000 millis timeout while waiting for channel to be ready for write 를 잘못 보고 하기 시 작 했 습 니 다. 나중에 hdfs 가 데 이 터 를 쓸 때 시간 이 초과 되 었 고 설정 파일 을 수정 하여 클 러 스 터 가 정상 적 인 것 을 발 견 했 습 니 다.
https://blog.csdn.net/dehu_zhou/article/details/81533802
 
클 러 스 터 가 며칠 동안 실 행 된 후에 또 새로운 문제 가 발생 한 것 을 발 견 했 습 니 다. datanode 는 항상 일괄 적 으로 끊 겼 습 니 다. 매번 같은 노드 가 아니 라 로 그 를 계속 보 았 습 니 다.
datanode 로 그 를 계속 인쇄 하 는 것 을 발 견 했 습 니 다:
2018-08-09 09:49:42,830 INFO org.apache.hadoop.util.JvmPauseMonitor: Detected pause in JVM or host machine (eg GC): pause of approximately 1102ms
GC pool 'PS MarkSweep' had collection(s): count=1 time=1450ms
2018-08-09 09:49:44,371 INFO org.apache.hadoop.util.JvmPauseMonitor: Detected pause in JVM or host machine (eg GC): pause of approximately 1040ms
GC pool 'PS MarkSweep' had collection(s): count=1 time=1396ms
2018-08-09 09:49:47,343 INFO org.apache.hadoop.util.JvmPauseMonitor: Detected pause in JVM or host machine (eg GC): pause of approximately 1169ms
GC pool 'PS MarkSweep' had collection(s): count=1 time=1542ms
2018-08-09 09:49:50,286 INFO org.apache.hadoop.util.JvmPauseMonitor: Detected pause in JVM or host machine (eg GC): pause of approximately 1042ms
GC pool 'PS MarkSweep' had collection(s): count=1 time=1444ms
2018-08-09 09:50:15,703 INFO org.apache.hadoop.util.JvmPauseMonitor: Detected pause in JVM or host machine (eg GC): pause of approximately 2197ms
GC pool 'PS MarkSweep' had collection(s): count=1 time=2679ms
2018-08-09 09:50:18,903 INFO org.apache.hadoop.util.JvmPauseMonitor: Detected pause in JVM or host machine (eg GC): pause of approximately 1595ms

본인 은 JVM 에 대해 서도 모 르 기 때문에 메모리 부족 으로 인 한 GC 시간 초과 라 고 의심 할 수 밖 에 없습니다. 좋 습 니 다. 어 리 석 은 사람 은 어 리 석 은 방법 을 사용 하여 datanode 의 메모 리 를 증가 합 니 다.
datanode 의 haoop - env. sh 에 설정 (자신의 클 러 스 터 에 따라 매개 변 수 를 조정)
export HADOOP_DATANODE_OPTS="-Xmx3g -Xms3g -Xmn2g -Xloggc:$HADOOP_LOG_DIR/datanode_gc.log"

설정 이 완료 되 었 습 니 다. 모든 노드 에 복사 되 었 습 니 다. 마침 클 러 스 터 가 실행 할 작업 이 없 었 습 니 다. 클 러 스 터 를 다시 시작 한 다음 에 클 러 스 터 가 다시 시작 되 기 를 기다 리 고 있 습 니 다.
。。。。。。。。。。。。。。。。。
20 분 을 기 다 렸 는데 클 러 스 터 가 아직 일어나 지 않 았 고 edit 파일 을 불 러 오고 있 습 니 다. 평소에 그렇게 느 리 지 않 았 습 니 다. 빨리 namenode 로 그 를 보 러 갔 는데 namenode 도 잘못 보고 한 것 을 발 견 했 습 니 다.
java.lang.RuntimeException: java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: GC overhead limit exceeded
        at org.apache.hadoop.hdfs.server.datanode.DirectoryScanner.getDiskReport(DirectoryScanner.java:549)
        at org.apache.hadoop.hdfs.server.datanode.DirectoryScanner.scan(DirectoryScanner.java:422)
        at org.apache.hadoop.hdfs.server.datanode.DirectoryScanner.reconcile(DirectoryScanner.java:403)
        at org.apache.hadoop.hdfs.server.datanode.DirectoryScanner.run(DirectoryScanner.java:359)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
        at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)
Caused by: java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: GC overhead limit exceeded
        at java.util.concurrent.FutureTask.report(FutureTask.java:122)
        at java.util.concurrent.FutureTask.get(FutureTask.java:192)
        at org.apache.hadoop.hdfs.server.datanode.DirectoryScanner.getDiskReport(DirectoryScanner.java:545)
        ... 10 more
Caused by: java.lang.OutOfMemoryError: GC overhead limit exceeded
        at java.io.UnixFileSystem.resolve(UnixFileSystem.java:108)
        at java.io.File.(File.java:262)
        at java.io.File.listFiles(File.java:1212)
        at org.apache.hadoop.fs.FileUtil.listFiles(FileUtil.java:1162)
        at org.apache.hadoop.hdfs.server.datanode.DirectoryScanner$ReportCompiler.compileReport(DirectoryScanner.java:595)
        at org.apache.hadoop.hdfs.server.datanode.DirectoryScanner$ReportCompiler.compileReport(DirectoryScanner.java:610)
        at org.apache.hadoop.hdfs.server.datanode.DirectoryScanner$ReportCompiler.compileReport(DirectoryScanner.java:610)
        at org.apache.hadoop.hdfs.server.datanode.DirectoryScanner$ReportCompiler.compileReport(DirectoryScanner.java:610)
        at org.apache.hadoop.hdfs.server.datanode.DirectoryScanner$ReportCompiler.call(DirectoryScanner.java:585)
        at org.apache.hadoop.hdfs.server.datanode.DirectoryScanner$ReportCompiler.call(DirectoryScanner.java:570)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        ... 3 more

나 니, 또 JVM 문제 야. 나 를 괴 롭 히 고 JVM 을 몰라.............................................................
namendoe 노드 의 hadop - env. sh 를 수정 합 니 다.
# The maximum amount of heap to use, in MB. Default is 1000.
export HADOOP_HEAPSIZE=10240
export HADOOP_NAMENODE_INIT_HEAPSIZE="100000"

namenode 를 계속 다시 시작 합 니 다. 3 분 정도 기다 리 면 클 러 스 터 가 성공 적 으로 시 작 된 것 을 발견 합 니 다. 지금까지 100 여 개의 작업 을 성공 적 으로 실 행 했 고 3 일 동안 실 행 했 습 니 다. 클 러 스 터 가 일시 적 으로 정상 이라는 것 을 의미 합 니 다.
 
이상 은 순 전 히 개인 적 인 어 리 석 은 생각 입 니 다. 그리고 모두 사용 하 는 어 리 석 은 방법 입 니 다. 더 좋 은 방법 이 있 는 대신 교 류 를 환영 합 니 다. 감사합니다!
 
hadop env 가 설정 할 수 있 는 매개 변 수 를 첨부 합 니 다:
대신 공유 감사합니다, 원문 링크:https://blog.csdn.net/zxln007/article/details/79356654
환경 매개 변수
매개 변수 설정
매개 변수 설명
비고
HADOOP_OPTS
-Djava.net.preferIPv4Stack=true
IPV 4 우선 사용, IPV 6 사용 안 함
 
HADOOP_NAMENODE_OPTS
Xms140G
초기 메모리 크기
 
 
Xmx140G
최대 메모리 크기
 
 
XX:NewRatio=8
젊 은 세대 와 늙 은 세대 의 비율 을 설정 하 다.예 를 들 어 3 은 젊 은 세대 와 늙 은 세대 의 비율 이 1: 3 이 고 젊 은 세대 가 전체 젊 은 세대 와 늙 은 세대 의 1 / 4 를 차지 한 다 는 것 을 나타 낸다.
 
 
XX:SurvivorRatio=4
젊 은 세대 중 Eden 지역 과 두 개의 Survivor 지역 의 비율.Survivor 구역 이 두 개 있 습 니 다.예 를 들 어 3. 에덴: Survivor = 3: 2 를 나타 내 는데 하나의 Survivor 구역 은 전체 젊 은 세대 의 1 / 5 를 차지한다.
 
 
XX:MaxPermSize=200M
지구 대 크기 설정
 
 
XX:+UseParNewGC
파 뉴 수집 기 는 사실 시리 얼 수집 기의 다 중 스 레 드 버 전 입 니 다.신세대 병행, 옛날 직렬;신세대 복제 알고리즘, 연대 표기 - 압축
 
 
XX:+UseConcMarkSweepGC
CMS 수집 기 설정 (병렬 수집 기)
 
 
XX:+CMSParallelRemarkEnabled
두 번 째 일시 정지 시간 을 줄 이기 위해 병렬 reark 를 엽 니 다.
 
 
XX:MaxDirectMemorySize=512M
이 매개 변 수 는 Direct ByteBuffer 가 할당 한 메모리 가 지정 한 크기 에 도달 하면 Full GC 를 실행 한 다 는 뜻 입 니 다.
 
 
XX:CMSInitiatingOccupancyFraction=75
CMS 수집 기 가 옛날 공간 에서 얼마나 사용 되 었 는 지 설정 한 후 쓰레기 수집 을 촉발 합 니 다. 기본 값 은 68% 이 고 CMS 를 사용 할 때 만 적 용 됩 니 다.
 
 
XX:ConcGCThreads=8
 
 
 
verbose:gc
 
 
 
XX:+PrintGCDetails
GC 상세 정보 인쇄
 
 
XX:+PrintGCDateStamps
GC 타임 스탬프 인쇄
 
 
Xloggc:/home/bigdata/hadoop/logs/namenode.gc.log
gc 로그 의 디 렉 터 리 및 파일 이름
 
 
Dcom.sun.management.jmxremote
 
 
HADOOP_DATANODE_OPTS
Xms3G
초기 메모리
 
 
Xmx3G
최대 메모리
 
 
Xmn512M
젊 은 세대 크기 설정
 
 
XX:MaxDirectMemorySize=512M
이 매개 변 수 는 Direct ByteBuffer 가 할당 한 메모리 가 지정 한 크기 에 도달 하면 Full GC 를 실행 한 다 는 뜻 입 니 다.
 
 
XX:+UseParNewGC
 
 
 
XX:+UseConcMarkSweepGC
 
 
 
XX:CMSInitiatingOccupancyFraction=75
 
첨부: 인터넷 에서 찾 은 대 신의 설정, 대 신의 공유 에 감 사 드 립 니 다.
원본 링크: http://blog.csdn.net/maijiyouzou/article/details/23740225 
JVM_OPTS="-server -verbose:gc
  -XX:+PrintGCDateStamps
  -XX:+PrintGCDetails
  -XX:+UseGCLogFileRotation
  -XX:NumberOfGCLogFiles=9
  -XX:GCLogFileSize=256m
  -XX:+DisableExplicitGC
  -XX:+UseCompressedOops
  -XX:SoftRefLRUPolicyMSPerMB=0
  -XX:+UseFastAccessorMethods
  -XX:+UseParNewGC
  -XX:+UseConcMarkSweepGC
  -XX:+CMSParallelRemarkEnabled
  -XX:CMSInitiatingOccupancyFraction=70
  -XX:+UseCMSCompactAtFullCollection
  -XX:CMSFullGCsBeforeCompaction=0
  -XX:+CMSClassUnloadingEnabled
  -XX:CMSMaxAbortablePrecleanTime=301
  -XX:+CMSScavengeBeforeRemark
  -XX:PermSize=160m
  -XX:GCTimeRatio=19
  -XX:SurvivorRatio=2
  -XX:MaxTenuringThreshold=100" //       ,MaxTenuringThreshold                Minor GC       ,    15


# Command specific options appended to HADOOP_OPTS when specified
export HADOOP_NAMENODE_OPTS="$JVM_OPTS -Xmx80g -Xms80g -Xmn21g -Xloggc:$HADOOP_LOG_DIR/namenode_gc.log"
export HADOOP_SECONDARYNAMENODE_OPTS="$JVM_OPTS -Xmx80g -Xms80g -Xmn21g"
export HADOOP_DATANODE_OPTS="$JVM_OPTS -Xmx3g -Xms3g -Xmn2g -Xloggc:$HADOOP_LOG_DIR/datanode_gc.log"
export HADOOP_BALANCER_OPTS="$JVM_OPTS -Xmx1g -Xms1g -Xmn512m -Xloggc:$HADOOP_LOG_DIR/balancer_gc.log"


export HADOOP_JOBTRACKER_OPTS="$JVM_OPTS -Xmx1g -Xms1g -Xmn512m -Xloggc:$HADOOP_LOG_DIR/jobtracker_gc.log"
export HADOOP_TASKTRACKER_OPTS="$JVM_OPTS -Xmx1g -Xms1g -Xmn512m -Xloggc:$HADOOP_LOG_DIR/tasktracker_gc.log"
export HADOOP_CLIENT_OPTS="$JVM_OPTS -Xmx512m -Xms512m -Xmn256m"

좋은 웹페이지 즐겨찾기