gpt4 book ai didi

Hadoop HDFS : Read sequence files that are being written

转载 作者:可可西里 更新时间:2023-11-01 15:03:13 26 4
gpt4 key购买 nike

我正在使用 Hadoop 1.0.3。

我将 Hadoop 序列文件的日志写入 HDFS,我在每组日志后调用 syncFS() 但我从不关闭文件(除非我执行每日滚动)。

我要保证的是,在文件还在写入的时候,文件对读者是可用的。

我可以通过 FSDataInputStream 读取序列文件的字节,但是如果我尝试使用 SequenceFile.Reader.next(key,val),它会在第一次调用时返回 false。

我知道数据在文件中,因为我可以使用 FSDataInputStream 或 cat 命令读取它,而且我 100% 确定调用了 syncFS()。

我检查了 namenode 和 datanode 日志,没有错误或警告。

为什么 SequenceFile.Reader 无法读取我当前正在写入的文件?

最佳答案

您无法确保读取完全写入数据节点端的磁盘。您可以在 DFSClient#DFSOutputStream.sync() 的文档中看到这一点,其中指出:

  All data is written out to datanodes. It is not guaranteed that data has
been flushed to persistent store on the datanode. Block allocations are
persisted on namenode.

所以它基本上用当前信息更新名称节点的 block 映射并将数据发送到数据节点。由于您无法将数据刷新到数据节点上的磁盘,而是直接从数据节点读取数据,因此您遇到了数据在某处缓冲且无法访问的时间范围。因此,您的序列文件阅读器会认为数据流已完成(或为空)并且无法读取向反序列化过程返回 false 的其他字节。

如果 block 被完全接收,数据节点将数据写入磁盘(它是预先写入的,但不能从外部读取)。因此,一旦达到您的 block 大小或您的文件已预先关闭并因此确定了一个 block ,您就可以从文件中读取。这在分布式环境中完全有意义,因为您的编写器可能会死掉而无法正确完成一个 block - 这是一致性问题。

因此解决方法是使 block 大小非常小,以便更频繁地完成 block 。但这不是那么有效,我希望你的要求不适合 HDFS 应该很清楚。

关于Hadoop HDFS : Read sequence files that are being written,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14377657/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com