一、查看namenode日志如下:

  1. 2020-10-29 08:03:27,678 WARN client.QuorumJournalManager (IPCLoggerChannel.java:call(399)) - Remote journal 10.29.37.106:8485 failed to write txns 161825262913-161825262914. Will try to write to this JN again after the next log roll.
  2. org.apache.hadoop.ipc.RemoteException(java.io.IOException): IPC's epoch 401 is less than the last promised epoch 402 ; journal id: hbcm
  3. at org.apache.hadoop.hdfs.qjournal.server.Journal.checkRequest(Journal.java:463)
  4. at org.apache.hadoop.hdfs.qjournal.server.Journal.checkWriteRequest(Journal.java:489)
  1. 2020-10-29 08:03:27,974 FATAL namenode.FSEditLog (JournalSet.java:mapJournalsAndReportErrors(390)) - Error: flush failed for required journal (JournalAndStream(mgr=QJM to [10.29.37.106:8485, 10.29.37.107:8485, 10.29.37.108:8485], stream=QuorumOutputStream starting at txid 161825011815))
  2. org.apache.hadoop.hdfs.qjournal.client.QuorumException: Got too many exceptions to achieve quorum size 2/3. 3 exceptions thrown:
  3. 10.29.37.108:8485: IPC's epoch 401 is less than the last promised epoch 402 ; journal id: hbcm
  4. at org.apache.hadoop.hdfs.qjournal.server.Journal.checkRequest(Journal.java:463)

二.排查问题

1.报错关键信息”IPC’s epoch is less than the last promised epoch”,大部分人的回答都是因为网络原因引起的.
Error: flush failed for required journal (JournalAndStream(mgr=QJM to [10.29.37.106:8485, 10.29.37.107:8485,
namenode与journalnode通信失败。
2.据上,经过看日志,每次启动另一个namenode的时候都会去探测三个journalnode服务的8485端口,提示是faild的,
说明最有可能是网络问题,排查如下:
ifconfig -a看网卡是否有丢包
查看/etc/sysconfig/selinux 配置 SELINUX=disabled 是否是对的
/etc/init.d/iptables status 查看防火墙是否运行,因为我们hadoop是运行内网环境,记得之前部署的时候,防火墙是关闭的
先后检查了,三个 journalnode服务器的防火墙,也都是关闭的

三、总结如下:

hadoop故障网络引起的话
1.查网卡是否丢包
2.查防火墙配置是否正确
当前集群环境下,两个namenode的运行是依懒于journalnode服务,如果通信异常,会导致Namenode HA不可用,服务会down,启动namenode会需要点时间同步日志文件。

四、解决方法:

1)调节journalnode 的写入超时时间
如dfs.qjournal.write-txns.timeout.ms = 90000
其实在实际的生产环境中,也很容易发生类似的这种超时情况,所以我们需要把默认的20s超时改成更大的值,比如60或者90s。
我们可以在hadoop/etc/hadoop下的hdfs-site.xml中,加入一组配置:

dfs.qjournal.write-txns.timeout.ms
60000

2)调整namenode 的java参数,提前触发 full gc,这样full gc 的时间就会小一些。
3)默认namenode的fullgc方式是parallel gc,是stw模式的,更改为cms的格式。调整namenode的启动参数:
-XX:+UseCompressedOops
-XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled
-XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=0
-XX:+CMSParallelRemarkEnabled -XX:+DisableExplicitGC
-XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=75
-XX:SoftRefLRUPolicyMSPerMB=0