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. rsync 服务器搭建遇到的问题

    问题一: @ERROR: chroot failed rsync error: error starting client-server protocol (code 5) at main.c(152 ...

  2. java中值类型与引用类型的关系

    值类型:就是java的基本类型.byte.short.int.long.float.char.double.boolean 引用类型:类(class).接口(Interface).数组(Array) ...

  3. IDM下载神器

    破解版IDM 个人评价:基本上能满足日常下载需求,除bt.磁力外. 不管是在线视频, 还是音乐, 电子书, 统统都能下载, 还附有爬虫功能~~ 直接附链接: 百度云链接: https://pan.ba ...

  4. 洛谷P1434滑雪题解及记忆化搜索的基本步骤

    题目 滑雪是一道dp及记忆化搜索的经典题目. 所谓记忆化搜索便是在搜索的过程中边记录边搜索的一个算法. 当下次搜到这里时,便直接使用. 而且记忆化搜索一定要满足无后效性,为什么呢,因为如果不满足无后效 ...

  5. BZOJ 4326 运输计划

    二分答案+树链剖分+树上差分 我们假设x是最小的花费,可以想到给定x,所有运输计划中花费大于x的计划必须经过虫洞,且最长的一条的花费减去虫洞所在边的花费要小于等于x 那么对于x,虫洞所在的位置肯定是确 ...

  6. 【XSY2693】景中人 区间DP

    题目描述 平面上有\(n\)个点,你要用一些矩形覆盖这些点,要求: 每个矩形的下边界为\(y=0\) 每个矩形的大小不大于\(s\) 问你最少要用几个矩形. \(n\leq 100,1\leq y\l ...

  7. SPHINX 文档写作工具安装简要指南 - windows 版 - 基于python

    此教程基于本地己安装好 PYTHON 并配置过全局变量:一定具备相应的基础再操作: 上传图片以免产生误导,以下为文字描述,按下列操作即可: 下载 get-pip.py脚本; python get-pi ...

  8. 在 CentOS 上编写 init.d service script [转]

    背景:之前编写了一些脚本,下载了一些开源软件,想把它们做成系统服务,通过 service your_prog_name start 这样的方式来后台运行,并在开机时自动启动.在了解了 daemon 命 ...

  9. 洛谷P3602 Koishi Loves Segments(贪心,multiset)

    洛谷题目传送门 贪心小水题. 把线段按左端点从小到大排序,限制点也是从小到大排序,然后一起扫一遍. 对于每一个限制点实时维护覆盖它的所有线段,如果超过限制,则贪心地把右端点最大的线段永远删去,不计入答 ...

  10. 环境变量PS1,修改命令行提示符样式

    推荐模板  export PS1="\[\e[37;40m\][\[\e[31;40m\]\u\[\e[0m@\[\e[33;40m\]\H \[\e[36;40m\]\w\[\e[0m\] ...