HDFS EC低版本存在许多bug,导致文件损坏,这些bug是在一定的条件下才有机率性的错误重构。
我们当前版本是3.1.1,使用前已修复部署EC patch了,但还是损坏了文件,而且这些文件是无任何提示异常的。是在进行读数据的时候发现数据损坏,这是很严重的问题。
在3.1.1版本中增加了这个补丁,就是在EC重构的时候进行验证,如果验证异常让NN重试。并增加了相关日志输出,根据日志告警和排查问题。[HDFS-15759] EC: Verify EC reconstruction correctness on DataNode - ASF JIRA
如果坏块没有全部损坏,比如RS-3-2-1024K的,只有2个节点损坏,这种情况还是能恢复的。
恢复思路,屏蔽损坏的datanode节点,强制数据从好节点上读取,这里需要用到hdfs api的方式处理,修改了hdfs client的逻辑,增加skip ip参数进行跳过损坏的ip,RS-3-2-1024K 是5x个节点需要for循环所有ip,相关逻辑请看代码。
然后再对文件进行验证,目前我实现了 orc parquet text textGzip的表验证,如果验证到最后,还是不能读取则文件确实损坏了3个节点的数据。
相关代码如下:
https://github.com/liangrui1988/hadoop-client-op/blob/main/src/main/java/com/yy/bigdata/orc/OpenFileLine.java