AWS EMR集群的/emr路径写满导致的故障处理

背景

AWS EMR集群在长期运行且动态扩缩频繁的集群中,会有一个潜在故障风险,那就是日志文件写入过多导致磁盘写满而引发机器故障。

如果这个节点是Master节点的话,更会导致上面的服务停止,如果这个集群是单Master节点集群的话,将会导致整个集群不可用。


故障分析

故障表现

某一天EMR集群中所有的扩容集群都处于已停止的状态,而且集群监控中查看到节点一直没有成功拉起

而且在yarn集群页面中,所有的作业都一直在等待资源而没有启动。


instance controller

根据过去的经验,EMR扩缩容停止是由于该服务失败导致AWS侧判断该集群故障而引发的。

在主节点中,使用指令查看进程,发现 instance controller 的zk的确挂了

systemctl --type=service
● ic-zookeeper-quorum.service         loaded failed     failed       Zookeeper server used for EMR instance controller coordination in multi master mode

尝试手动启动该服务,结果启动失败

systemctl start ic-zookeeper-quorum.service
Job for ic-zookeeper-quorum.service failed because a configured resource limit was exceeded. See "systemctl status ic-zookeeper-quorum.service" and "journalctl -xe" for details.

查看ic_zookeeper的日志,报错信息看着是启动时使用的snapshot版本不是最新导致启动失败

cd /emr/instance-controller/log
cat zookeeper.log

2022-06-12 04:01:03,369 ERROR org.apache.zookeeper.server.quorum.QuorumPeerMain (main): Unexpected exception, exiting abnormally
java.lang.RuntimeException: Unable to run quorum server 
        at org.apache.zookeeper.server.quorum.QuorumPeer.loadDataBase(QuorumPeer.java:693)
        at org.apache.zookeeper.server.quorum.QuorumPeer.start(QuorumPeer.java:635)
        at org.apache.zookeeper.server.quorum.QuorumPeerMain.runFromConfig(QuorumPeerMain.java:170)
        at org.apache.zookeeper.server.quorum.QuorumPeerMain.initializeAndRun(QuorumPeerMain.java:114)
        at org.apache.zookeeper.server.quorum.QuorumPeerMain.main(QuorumPeerMain.java:81)
Caused by: java.io.IOException: The accepted epoch, 4 is less than the current epoch, 6
        at org.apache.zookeeper.server.quorum.QuorumPeer.loadDataBase(QuorumPeer.java:689)
        ... 4 more

根据报错信息和AWS技术支持的指导,将该整个快照文件夹进行重命名后重启zk成功

cd /emr/instance-controller/lib/zookeeper/data/
mv version-2 version-2_bak

systemctl start ic-zookeeper-quorum

但是ic_zk启动了,集群还是处于故障状态,作业还是一直没有运行完成,而且EMR集群管理页面中显示的申请资源数也是已停止。


ResourceManger

后面到以下路径中检查yarn的日志文件

cd /var/log/hadoop-yarn

发现存在以下报错

2022-06-12 04:01:02,713 ERROR org.apache.hadoop.util.HostsFileReader (IPC Server handler 0 on default port 8033): error parsing /emr/instance-controller/lib/yarn.nodes.exclude.xml
org.xml.sax.SAXParseException; Premature end of file.
	at org.apache.xerces.parsers.DOMParser.parse(Unknown Source)
	at org.apache.xerces.jaxp.DocumentBuilderImpl.parse(Unknown Source)
	at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:121)
	at org.apache.hadoop.util.HostsFileReader.readXmlFileToMapWithFileInputStream(HostsFileReader.java:150)
	at org.apache.hadoop.util.HostsFileReader.readFileToMapWithFileInputStream(HostsFileReader.java:133)
	at org.apache.hadoop.util.HostsFileReader.readFileToMap(HostsFileReader.java:124)
	at org.apache.hadoop.util.HostsFileReader.refresh(HostsFileReader.java:200)
	at org.apache.hadoop.yarn.server.resourcemanager.NodesListManager.refreshHostsReader(NodesListManager.java:235)
	at org.apache.hadoop.yarn.server.resourcemanager.NodesListManager.refreshNodesGracefully(NodesListManager.java:589)
	at org.apache.hadoop.yarn.server.resourcemanager.AdminService.refreshNodes(AdminService.java:463)
	at org.apache.hadoop.yarn.server.api.impl.pb.service.ResourceManagerAdministrationProtocolPBServiceImpl.refreshNodes(ResourceManagerAdministrationProtocolPBServiceImpl.java:144)
	at org.apache.hadoop.yarn.proto.ResourceManagerAdministrationProtocol$ResourceManagerAdministrationProtocolService$2.callBlockingMethod(ResourceManagerAdministrationProtocol.java:273)
	at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:507)
	at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:1034)
	at org.apache.hadoop.ipc.Server$RpcCall.run(Server.java:994)
	at org.apache.hadoop.ipc.Server$RpcCall.run(Server.java:922)
	at java.security.AccessController.doPrivileged(Native Method)
	at javax.security.auth.Subject.doAs(Subject.java:422)
	at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1893)
	at org.apache.hadoop.ipc.Server$Handler.run(Server.java:2833)

直接访问报错文件时,发现这个文件为空,对比其他2个处于stand by的rm后发现,这个文件在stand by的RM中是有内容的,而在active的RM中为空,明显异常

/emr/instance-controller/lib/yarn.nodes.exclude.xml

AWS的技术支持表示,这个文件是用于RM拉取实例的时候,把某些实例的IP排除在外,例如不健康的节点、被回收的Spot等等。当时这个文件是空的,RM没有办法正常读取列表,所以扩容是有问题的。

因此,就算ic_zk已经重新启动了,这个集群的yarn服务还是处于异常状态。

所以当时重启服务,让active节点切换到其他备节点中,以使集群恢复可用状态

systemctl stop hadoop-yarn-resourcemanager

systemctl start hadoop-yarn-resourcemanager

但发现resourcemanager服务启动失败,报错信息一样是

org.xml.sax.SAXParseException; Premature end of file.

后面通过修改yarn.nodes.exclude.xml文件,添加上XML声明后成功启动

<?xml version="1.0" encoding="UTF-8"?>
<hosts>
</hosts>

 /emr路径

当时查看到/emr这个路径的使用率是100%,所以是怀疑这个路径满了导致以上所有问题

df -h

Filesystem      Size  Used Avail Use% Mounted on
/dev/nvme1n1p1  5.0G  2.7G  2.4G  53% /emr

然后根据指令排查文件数最大的路径

du -a /emr | sort -n -r | head -n 20

2700332 /emr
2635948 /emr/instance-controller
2521424 /emr/instance-controller/lib
1504548 /emr/instance-controller/lib/info
1016736 /emr/instance-controller/lib/zookeeper
1016732 /emr/instance-controller/lib/zookeeper/data
596048  /emr/instance-controller/lib/zookeeper/data/version-2
420680  /emr/instance-controller/lib/zookeeper/data/version-2_bak

可以看到是这个路径的文件最大

cd /emr/instance-controller/lib/info
ll
-rw-rw-r-- 1 hadoop hadoop   8023908 May 30 23:58 job-flow-state.txt.YYYY-MM-DD

打开后发现,这里的文件是用于记录EMR集群信息,而且从节点启动到现在每天保存一份,若集群的动态扩缩容非常的频繁,那么这个文件会变得非常大

为了避免/emr路径再次写满,先将这部分文件进行压缩并删除源文件

mkdir old
mv job-flow-state.txt.2021* old


tar -zcvf old.gz old/
ll


rm -rf old

进过上述操作后,存储空间减少至50%左右。

df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/nvme1n1p1  5.0G  2.7G  2.4G  53% /emr

解决方法

由于导致/emr磁盘写满的文件是 AWS侧程序生成的,所以目前我们这边进行的下面操作仅为缓解问题而没有解决根因,根因需要AWS侧给出修复补丁解决不停生成的job-flow-state.txt文件才行

目前通过手动配置脚本自动备份log文件到S3桶里

30 15 * * * find /emr/instance-controller/lib/info/ -mtime +1 -name "*job-flow-tate.txt.2*" -exec aws s3 mv {} s3://<S3 bucket>/log/<ec2-id>/ \; > /dev/null

此命令的用途是于每天UTC 15:30分(UTC +8 北京时间 23:30) 将 /emr/instance-controller/lib/info/ 下超过一天的 job-flow-state.txt.2* 移动到 s3 桶里

请记得替换上列命令<S3 bucket>为对应区域的桶名,<ec2-id> 为对应实例的ec2 id

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

默哀d

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值