当客户端关闭连接时,hadoop如何处理未复制的数据?

lnlaulya  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(394)

我正在运行一个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,那么这看起来是非常无用的。

5f0d552i

5f0d552i1#

我认为flume agend在成功关闭文件之前就失去了hdfs连接。dfs客户端在本地缓存一些数据。在关闭文件之前,它必须刷新此本地缓存。如果hdfs连接丢失,close将失败,块将被标记为corrupt。有一种情况是hdfs连接意外关闭。hdfs客户机注册关闭挂钩。不能保证调用shutdown hook的顺序。在您的情况下,如果flume代理正在关闭,hdfs client shutdown可能会被调用,file close将失败。如果您认为这是可能的,请尝试禁用关闭挂钩。

fs.automatic.close = false

相关问题