
# 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"文件。
 
