Hadoop ha CDH5.15.1-hadoop集群启动后,两个namenode都是standby模式

                                             作者:尹正杰

版权声明:原创作品,谢绝转载!否则将追究法律责任。

  一说起周五,想必大家都特别开心对吧?其实我也很开心呀~眼看还剩下一个小时就下班了。然而在这一个小时内,我都心里活动真的是跌宕起伏呀~不是因为放假,而是身为一名大数据运维技术人员需要替公司大数据生态圈中面临都各种问题。

  这不,遇到了一个奇葩的问题,让我花了接近一个小时才处理完呢!深感惭愧啊,要是有小伙伴遇到跟我同样的问题,别慌!恭喜你,在这里你需要花费1分钟看完我的处理过程,然后可能只需要不到10分钟就能这个问题给解决掉。因为这个坑我已经替你给添了。

  

一.踩坑环境准备

1>.昨天下午15:30左右对操作系统进行调优,修改一大波内核参数,具体参数如下:(如果大家对下面的参数觉得有任何不合理的地方,欢迎大家留言,帮我指正。)

net.ipv6.conf.all.disable_ipv6 =
net.core.rmem_default =
net.core.rmem_max =
net.core.wmem_default =
net.core.wmem_max =
net.core.netdev_max_backlog =
net.core.somaxconn =
net.core.optmem_max =
net.ipv4.tcp_mem =
net.ipv4.tcp_rmem =
net.ipv4.tcp_wmem =
net.ipv4.tcp_keepalive_time =
net.ipv4.tcp_keepalive_intvl =
net.ipv4.tcp_keepalive_probes =
net.ipv4.tcp_sack =
net.ipv4.tcp_fack =
net.ipv4.tcp_timestamps =
net.ipv4.tcp_window_scaling =
net.ipv4.tcp_syncookies =
net.ipv4.tcp_tw_reuse =
net.ipv4.tcp_tw_recycle =
net.ipv4.tcp_fin_timeout =
net.ipv4.ip_local_port_range =
net.ipv4.tcp_max_syn_backlog =
vm.dirty_ratio =
vm.dirty_background_ratio =
vm.swappiness =

2>.开发反馈spark程序和mapreduce程序跑的倍儿慢

  开发说和之前想比较,同样的任务之前跑不到5分钟就可以跑完,现在跑个20分钟才能跑完。还有的任务跑的直接就提交不了!一个劲儿的报错,哎呀妈呀~我心里以嘀咕,这波参数调的有点小尴尬啊,没把集群调试更好,反而调试的更差啦!开发还给我发了相关日志记录,如下:

[root@rsync115 against_cheating_extract]# yarn logs -applicationId application_1542888832576_2698 > application_1542888832576_2698
// :: INFO client.RMProxy: Connecting to ResourceManager at calculation101.aggrx/10.1.1.101:
// :: WARN hdfs.BlockReaderFactory: I/O error constructing remote block reader.
java.net.SocketTimeoutException: millis timeout while waiting for channel to be ready for read. ch : java.nio.channels.SocketChannel[connected local=/10.1.3.115: remote=/10.1.1.119:]
at org.apache.hadoop.net.SocketIOWithTimeout.doIO(SocketIOWithTimeout.java:)
at org.apache.hadoop.net.SocketInputStream.read(SocketInputStream.java:)
at org.apache.hadoop.net.SocketInputStream.read(SocketInputStream.java:)
at org.apache.hadoop.net.SocketInputStream.read(SocketInputStream.java:)
at java.io.FilterInputStream.read(FilterInputStream.java:)
at org.apache.hadoop.hdfs.protocolPB.PBHelper.vintPrefixed(PBHelper.java:)
at org.apache.hadoop.hdfs.RemoteBlockReader2.newBlockReader(RemoteBlockReader2.java:)
at org.apache.hadoop.hdfs.BlockReaderFactory.getRemoteBlockReader(BlockReaderFactory.java:)
at org.apache.hadoop.hdfs.BlockReaderFactory.getRemoteBlockReaderFromTcp(BlockReaderFactory.java:)
at org.apache.hadoop.hdfs.BlockReaderFactory.build(BlockReaderFactory.java:)
at org.apache.hadoop.hdfs.DFSInputStream.blockSeekTo(DFSInputStream.java:)
at org.apache.hadoop.hdfs.DFSInputStream.readWithStrategy(DFSInputStream.java:)
at org.apache.hadoop.hdfs.DFSInputStream.read(DFSInputStream.java:)
at java.io.DataInputStream.readFully(DataInputStream.java:)
at java.io.DataInputStream.readLong(DataInputStream.java:)
at org.apache.hadoop.io.file.tfile.BCFile$Reader.<init>(BCFile.java:)
at org.apache.hadoop.io.file.tfile.TFile$Reader.<init>(TFile.java:)
at org.apache.hadoop.yarn.logaggregation.AggregatedLogFormat$LogReader.<init>(AggregatedLogFormat.java:)
at org.apache.hadoop.yarn.logaggregation.LogCLIHelpers.dumpAllContainersLogs(LogCLIHelpers.java:)
at org.apache.hadoop.yarn.client.cli.LogsCLI.run(LogsCLI.java:)
at org.apache.hadoop.yarn.client.cli.LogsCLI.main(LogsCLI.java:)
// :: WARN hdfs.DFSClient: Failed to connect to /10.1.1.119: for block BP--10.1.1.101-:blk_1095494105_21758975, add to deadNodes and continue.
java.net.SocketTimeoutException: millis timeout while waiting for channel to be ready for read. ch : java.nio.channels.SocketChannel[connected local=/10.1.3.115: remote=/10.1.1.119:]
at org.apache.hadoop.net.SocketIOWithTimeout.doIO(SocketIOWithTimeout.java:)
at org.apache.hadoop.net.SocketInputStream.read(SocketInputStream.java:)
at org.apache.hadoop.net.SocketInputStream.read(SocketInputStream.java:)
at org.apache.hadoop.net.SocketInputStream.read(SocketInputStream.java:)
at java.io.FilterInputStream.read(FilterInputStream.java:)
at org.apache.hadoop.hdfs.protocolPB.PBHelper.vintPrefixed(PBHelper.java:)
at org.apache.hadoop.hdfs.RemoteBlockReader2.newBlockReader(RemoteBlockReader2.java:)
at org.apache.hadoop.hdfs.BlockReaderFactory.getRemoteBlockReader(BlockReaderFactory.java:)
at org.apache.hadoop.hdfs.BlockReaderFactory.getRemoteBlockReaderFromTcp(BlockReaderFactory.java:)
at org.apache.hadoop.hdfs.BlockReaderFactory.build(BlockReaderFactory.java:)
at org.apache.hadoop.hdfs.DFSInputStream.blockSeekTo(DFSInputStream.java:)
at org.apache.hadoop.hdfs.DFSInputStream.readWithStrategy(DFSInputStream.java:)
at org.apache.hadoop.hdfs.DFSInputStream.read(DFSInputStream.java:)
at java.io.DataInputStream.readFully(DataInputStream.java:)
at java.io.DataInputStream.readLong(DataInputStream.java:)
at org.apache.hadoop.io.file.tfile.BCFile$Reader.<init>(BCFile.java:)
at org.apache.hadoop.io.file.tfile.TFile$Reader.<init>(TFile.java:)
at org.apache.hadoop.yarn.logaggregation.AggregatedLogFormat$LogReader.<init>(AggregatedLogFormat.java:)
at org.apache.hadoop.yarn.logaggregation.LogCLIHelpers.dumpAllContainersLogs(LogCLIHelpers.java:)
at org.apache.hadoop.yarn.client.cli.LogsCLI.run(LogsCLI.java:)
at org.apache.hadoop.yarn.client.cli.LogsCLI.main(LogsCLI.java:)
// :: INFO hdfs.DFSClient: Successfully connected to /10.1.1.115: for BP--10.1.1.101-:blk_1095494105_21758975
[root@rsync115 against_cheating_extract]# yarn logs -applicationId application_1542888832576_2698 > application_1542888832576_2698
// :: INFO client.RMProxy: Connecting to ResourceManager at calculation101.aggrx/10.1.1.101:
[root@rsync115 against_cheating_extract]#

导出日志故障,想看内容可以戳我~

  其实,上面的报错信息只是程序运行的日志,还有其他服务也出现类似的故障啦!并没有什么太大的参考意义。于是我将我的配置还原,把修改的参数使用默认的恢复回去,发现依旧没有解决问题,没法了,我就只得重启操作系统啦!在重启操作系统之前,需要把所有的服务都正常关闭。其次,我将上面一大坨参数进行了修改,只保留了一条优化:

vm.swappiness = 10             #这个是降低使用swap几率的内核参数,越小越好,但不推荐设置为0。

3>.重启操作系统后,hdfs集群没法正常使用了。

二.填坑步骤详解

1>.查看hdfs的WebUI

2>.查看webUI界面,发现NN节点容量竟然为0!

3>.集群处于安全模式

  想必大家都懂hdfs的原理,NN节点在启动时需要加载编辑日志和镜像文件,而加载的过程也就是它校验,比如副本数,块数,权限之类的等等,等他将所有需要检验的数据校验完毕就会自动退出安全模式。

查看集群的安全模式:hadoop dfsadmin -safemode get

DEPRECATED: Use of this script to execute hdfs command is deprecated.
Instead use the hdfs command for it. Safe mode is ON in calculation101.aggrx/10.1.1.101:
Safe mode is ON in calculation111.aggrx/10.1.1.111:

4>.手动退出安全模式

手动退出安全模式:hdfs dfsadmin -safemode leave

再次查看集群的安全模式:hadoop dfsadmin -safemode get

DEPRECATED: Use of this script to execute hdfs command is deprecated.
Instead use the hdfs command for it. Safe mode is OFF in calculation101.aggrx/10.1.1.101:
Safe mode is OFF in calculation111.aggrx/10.1.1.111:

5>.发现是有数据了,但是查看10.1.1.101节点,其状态为standby模式

6>. 查看10.1.1.111节点,其状态依旧是standby模式

7>.手动切换NameNode节点的状态(很显然,权限被拒绝了。因为我开启了zkfc负责管理NN节点的状态,因此手动修改是无效的!)

[hdfs@calculation101 ~]$ hdfs haadmin -transitionToActive nn1
Automatic failover is enabled for NameNode at calculation101.aggrx/10.1.1.101:
Refusing to manually manage HA state, since it may cause
a split-brain scenario or other incorrect state.
If you are very sure you know what you are doing, please
specify the forcemanual flag.
You have new mail in /var/spool/mail/root
[hdfs@calculation101 ~]$  

8>.关闭自动容灾并重启hdfs集群(dfs.ha.automatic-failover.enabled)

9>.关闭zkfs后,发现我的NN节点就有一个节点变为active模式啦!

10>.告警信息预览(zkfc服务被我禁用掉啦!)

三.为什么会出现这种情况,如何防止?

1>.一般导致NameNode切换的原因

随着集群规模的变大和任务量变多,NameNode的压力会越来越大,一些默认参数已经不能满足集群的日常需求,除此之外,异常的Job在短时间内创建和删除大量文件,引起NN节点频繁更新内存的数据结构从而导致RPC的处理时间变长,CallQueue里面的RpcCall堆积,甚至严重的情况下打满CallQueue,导致NameNode响应变慢,甚至无响应,ZKFC的HealthMonitor监控自己的NN异常时,则会断开与ZooKeeper的链接,从而释放锁,另外一个NN上的ZKFC进行抢锁进行Standby到Active状态的切换。这是一般引起的切换的流程。

当然,如果你是手动去切换这也是可以的,当Active主机出现异常时,有时候则需要在必要的时间内进行切换。

2>.ZKFC的作用是什么?如何判断一个NN是否健康

在正常的情况下,ZKFC的HealthMonitor主要是监控NameNode主机上的磁盘还是否可用(空间),我们都知道,NameNode负责维护集群上的元数据信息,当磁盘不可用的时候,NN就该进行切换了。

除了可用状态(SERVICE_HEALTHY)之外,还有SERVICE_UNHEALTHY(磁盘空间不可用),SERVICE_NOT_RESPONDING(其他的一些情况)状态,在这两个状态中,它都认为NN是不健康的。

3>.NameNode HA是如何实现的?

  详情请参考:https://www.cnblogs.com/lixiaolun/p/6897706.html

4>.NameNode因为断电导致不能切换的原理,怎样进行恢复

ActiveNN断电,网络异常,负载过高或者机器出现异常无法连接,Standby NN无法转化为Active,使得HA集群无法对外服务,原因是Active NN节点在断电和不能服务的情况下,zknode上保存着ActiveBreadCrumb, ActiveStandbyElectorLock两个Active NN的信息,ActiveStandbyElectorLock由于Active NN出现异常断开,Standby NN去抢锁的时候就会去检查ActiveBreadCrumb是否有上一次的Active NN节点,如果有,就会就会尝试让Active NN变为Standby NN,自己转化为Active NN,但是由于调用出现异常,所以会采用ssh的方式去Fence之前的Active NN,因为机器始终连接不上,所以无法确保old active NN变为Standby NN,自己也无法变为Active NN,所以还是保持Standby状态,避免出现脑裂问题。

解决方案是确定Active关机的情况下重新hdfs zkfc -formatZK就可以了。

  如何上述问题解决不了,可以删除掉zkfc在zookeeper保存hdfs高可用状态的目录并重启服务或者格式化zkfc即可。

Hadoop ha CDH5.15.1-hadoop集群启动后,两个namenode都是standby模式的更多相关文章

  1. Hadoop ha CDH5.15.1-hadoop集群启动后,集群容量不正确,莫慌,这是正常的表现!

    Hadoop ha CDH5.15.1-hadoop集群启动后,集群容量不正确,莫慌,这是正常的表现! 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.集群启动顺序 1>. ...

  2. 全网最详细的Hadoop HA集群启动后,两个namenode都是active的解决办法(图文详解)

    不多说,直接上干货! 这个问题,跟 全网最详细的Hadoop HA集群启动后,两个namenode都是standby的解决办法(图文详解) 是大同小异. 欢迎大家,加入我的微信公众号:大数据躺过的坑  ...

  3. 全网最详细的Hadoop HA集群启动后,两个namenode都是standby的解决办法(图文详解)

    不多说,直接上干货! 解决办法 因为,如下,我的Hadoop HA集群. 1.首先在hdfs-site.xml中添加下面的参数,该参数的值默认为false: <property> < ...

  4. Hadoop的多节点集群启动,唯独没有namenode进程?(血淋淋教训,一定拍快照)(四十五)

    前言 大家在搭建hadoop集群时,第一次格式化后,一路要做好快照.别随便动不动缺少什么进程,就来个格式化. 问题描述:启动hadoop时报namenode未初始化:java.io.IOExcepti ...

  5. hadoop启动后jps 没有namenode

      hadoop集群启动后,jps 发现没有namenode. 网上查了下,这问题可能是由于两次或两次以上格式化NameNode造成的. 因为我的是刚刚新搭建的集群,里面没什么资料,所以我直接删除各个 ...

  6. k8s集群启动了上万个容器(一个pod里放上百个容器,起百个pod就模拟出上万个容器)服务器超时,无法操作的解决办法

    问题说明: 一个POD里放了百个容器,然后让K8S集群部署上百个POD,得到可运行上万个容器的实验目的. 实验环境:3台DELL裸机服务器,16核+64G,硬盘容量忽略吧,上T了,肯定够. 1.一开始 ...

  7. Hadoop HA on Yarn——集群启动

    这里分两部分,第一部分是NameNode HA,第二部分是ResourceManager HA (ResourceManager HA是hadoop-2.4.1之后加上的) NameNode HA 1 ...

  8. Hadoop的HA集群启动和停止流程

    假设我们有3台虚拟机,主机名分别是hadoop01.hadoop02和hadoop03. 这3台虚拟机的Hadoop的HA集群部署计划如下: 3台虚拟机的Hadoop的HA集群部署计划 hadoop0 ...

  9. HADOOP HA 报错 - 所有 namenode 都是standby --集群报错: Operation category READ is not supported in state standby

    报错: 经过查看集群的jps如下: ==================== hadoop01 jps =================== FsShell ResourceManager Name ...

随机推荐

  1. JAVA优先级队列元素输出顺序测试

    package code.test; import java.util.Comparator; import java.util.Iterator; import java.util.Priority ...

  2. 洛谷P3690 Link Cut Tree (模板)

    Link Cut Tree 刚开始写了个指针版..调了一天然后放弃了.. 最后还是学了黄学长的板子!! #include <bits/stdc++.h> #define INF 0x3f3 ...

  3. X问题 HDU - 1573(excrt入门题)

    X问题 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  4. Quartus prime16.0 与modelsim ae 联调

    前言 quartus和modelsim联调对仿真还是很方便的,当然最好是quartus干综合到烧录的活,modelsim单独仿真.而且ae版的性能比se版差. 流程: 1.配置modelsim ae路 ...

  5. 【XSY2751】Mythological IV 线性插值

    题目描述 已知\(f(x)\)为\(k\)次多项式. 给你\(f(0),f(1),\ldots,f(k)\),求 \[ \sum_{i=1}^nf(i)q^i \] \(k\leq 500000,n\ ...

  6. bzoj 1264: [AHOI2006]基因匹配Match (树状数组优化dp)

    链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1264 思路: n大小为20000*5,而一般的dp求最长公共子序列复杂度是 n*n的,所以我 ...

  7. Day24-ModelForm操作及验证

    Day23内容回顾--缺失,遗憾成狗. 一:Model(2个功能) -数据库操作: -验证,只有一个clean方法可以作为钩子. 二:Form(专门来做验证的)--------根据form里面写的类, ...

  8. QML 用QSortFilterProxyModel实现搜索功能

    搞了一晚上终于实现了,写个博客纪念一下吧. c++部分的代码: #include <QQmlApplicationEngine> #include <QQmlContext> ...

  9. poj2083 Fractal

    我一开始的想法是间断性的输出空格和solve(k-1) 但是发现问题很大. 雨菲:可以用一个数组保存啊 我:那不爆了? 雨菲:不会爆. 我一算:729 × 729,还真没爆. 然后就直接WA了.... ...

  10. A1109. Group Photo

    Formation is very important when taking a group photo. Given the rules of forming K rows with N peop ...