HDFS执行Balance时被异常停止如何处理
问题
在HDFS客户端启动一个Balance进程,该进程被异常停止后,再次执行Balance操作,操作会失败。
回答
通常,HDFS执行Balance操作结束后,会自动释放“/system/balancer.id”文件,可再次正常执行Balance。
但在上述场景中,由于第一次的Balance操作是被异常停止的,所以第二次进行Balance操作时,“/system/balancer.id”文件仍然存在,则会触发append /system/balancer.id操作,进而导致Balance操作失败。
- 如果“/system/balancer.id”文件的释放时间超过了软租期60s,则第二次执行Balance操作的客户端的append操作会抢占租约,此时最后一个block处于under construction或者under recovery状态,会触发block的恢复操作,那么“/system/balancer.id”文件必须等待block恢复完成才能关闭,所以此次append操作失败。
append /system/balancer.id操作失败后,客户端发生RecoveryInProgressException异常:
org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.protocol.RecoveryInProgressException): Failed to APPEND_FILE /system/balancer.id for DFSClient because lease recovery is in progress. Try again later.
- 如果该文件的释放时间没有超过默认设置60s,原有客户端会继续持有该租约,则会发生AlreadyBeingCreatedException异常,实际上向客户端返回的是null,导致客户端出现如下异常:
java.io.IOException: Cannot create any NameNode Connectors.. Exiting...
可通过以下方法避免上述问题:
- 方案1:等待硬租期超过1小时后,原有客户端释放租约,再执行第二次Balance操作。
- 方案2:执行第二次Balance操作之前删除“/system/balancer.id”文件。