我正在运行一个hadoop2.5.0-cdh5.3.2集群。flume正在别处运行,正在将数据写入此群集。当集群处于重载状态时,flume代理完成写入并尝试在hdfs完成数据复制之前关闭文件。关闭失败并重试,但flume代理配置了超时,当关闭无法及时完成时,flume代理将断开连接。
hdfs如何处理尚未完成复制的文件?我的印象是后台线程将完成复制,但我在集群中只看到部分写入的块。该块有一个好的副本,而副本仅部分写入,因此hdfs认为该块已损坏。
我通读了恢复过程,没想到会留下未写的积木。
我有以下客户端设置:
dfs.client.block.write.replace-datanode-on-failure.enable=true
dfs.client.block.write.replace-datanode-on-failure.policy=ALWAYS
dfs.client.block.write.replace-datanode-on-failure.best-effort=true
我设置这些是因为flume代理似乎正在丢失到datanodes的连接并失败。我想再试一次,但如果写了一个块,就称它为好的,然后继续。
是 best-effort
阻止写入剩余的块?如果它导致最后一个块被称为corrupt,那么这看起来是非常无用的。
1条答案
按热度按时间5f0d552i1#
我认为flume agend在成功关闭文件之前就失去了hdfs连接。dfs客户端在本地缓存一些数据。在关闭文件之前,它必须刷新此本地缓存。如果hdfs连接丢失,close将失败,块将被标记为corrupt。有一种情况是hdfs连接意外关闭。hdfs客户机注册关闭挂钩。不能保证调用shutdown hook的顺序。在您的情况下,如果flume代理正在关闭,hdfs client shutdown可能会被调用,file close将失败。如果您认为这是可能的,请尝试禁用关闭挂钩。