文件实际是写完的,因为checkpoint做失败了,导致文件没有被hdfs计算在内。
我们用flink 写入到hdfs,报错信息会提示replicas副本数量不足。
hdfs元信息里面记录的文件大小和实际落地的文件大小不一致。
导致hive的任务只获取到一部分数据。
这种情况很偶发,认为是hdfs集群负载过高导致。
但是集群的运维说其实这种问题也出现过几次了,其实就是hdfs的租约问题。
hdfs 写到最后,checkpoint失败的话,导致元数据没有及时被更新,导致读不到这个文件。或者读取有问题
解决:加上flink任务状态和错误日志的监控,出现问题告警。
但是实际上是因为checkpoint 失败,导致hdfs租约失败。
比如一个20k的文件,写到5k的时候,元数据记录成5k,然后后续还没更改元数据,然后客户端断了,可能会导致强制关闭文件。
然后会文件大小和元数据记录的大小不一致,文件就有问题。
关于hdfs的租约,网上也有很多详细的资料:
https://blog.csdn.net/androidlushangderen/article/details/52850349
总结:在HDFS中,当每次客户端用户往某个文件中写入数据的时候,为了保持数据的一致性,此时其它客户端程序是不允许向此文件同时写入数据的。那么HDFS是如何做到这一点的呢?答案是租约(Lease)。换句话说,租约是HDFS给予客户端的一个写文件操作的临时许可证,无此证件者将不被允许操作此文件