记得看过一本书,里面是这么写的,软件开发中的二八原则,80%的时间运行的是正常流程,20%的时间是异常流程。而实际代码中,80%的代码是在处理异常逻辑,而正常流程只占20%。
由此可见,异常处理是很重要的一块内容。
本文就以原生的JAVA客户端为例,聊聊HDFS里写文件过程中的异常处理。
先来简单回顾下HDFS的写文件流程,如下图所示:
客户端向NN申请block,NN处理请求后需要将操作写入JN中。随后,客户端向DN建立连接发送数据,最后向NN同步block的信息。详细流程戳这里。
整个流程中,JN、NN、不同的DN出现异常,均可能导致写异常或失败。
【JN异常】
假如在客户端addBlock之前,JN就出现了异常,那么addBlock会失败,因此block会写失败。
而假如在客户端成功addBlock后,JN出现了异常,例如停止所有的JN,会怎样呢?
实测发现,首先两个NN均未重启,但都停止提供服务,其用于rpc通信的端口也没有处于监听状态。其次,客户端一开始并没有报错,还在持续的向dn写入数据,从DN节点的rbw目录中,可以观察到bloc