繁体   English   中英

来自 HDFS 文件的定位读取或 seek() 会加载并忽略文件的全部内容吗?

[英]Will positioned read or seek() from HDFS file load and ignore whole content of the file?

我想从某个偏移量/位置读取大文件的子内容。 例如,我有一个 1M 行的文件,我想从第 100 行开始读取 50 行。 (行号:101 至 150 - 包括在内)

我想我应该使用 PositionalReadable。 https://issues.apache.org/jira/browse/HADOOP-519

我看到FSInputStream.readFully实际上使用了Seekableseek()方法。

当我检查seek()的底层实现时,我发现它使用BlockReader.skip()

blockReader.skip() 不会读取整个数据直到 position 以跳过字节吗? 问题是 HDFS 是否也会加载前 100 行以便到达第 101 行。

如何在不加载内容的 rest 的情况下使 position 位于文件中的任何所需偏移量,例如文件的第 10000 行? s3 在标头偏移中提供的东西。

这是我发现的类似问题: How to read files with an offset from Hadoop using Java ,但它建议使用seek()并且评论中认为seek()是昂贵的操作,应谨慎使用。 我猜这是正确的,因为 seek 似乎读取了所有数据以便跳到 position。

简短的回答可能会或可能不会读取与skip(n)一样多的数据。 正如您所说, seek()在内部调用BlockReader.skip() BlockReader是一种接口类型,通过BlockReaderFactory()创建。 创建的BlockReader实现是BlockReaderRemoteBlockReaderLocal (正好, ExternalBlockReader也是可以的,只是特例排除)

BlockReaderRemote是客户端通过RPC over TCP从.network上的远程DataNode读取数据时使用的。此时分析skip()方法代码可以看到readNextPacket被重复调用了n个字节到跳过。 也就是说,它实际读取的是要跳过的数据。

当客户端与存储块的DataNode在同一台机器上时,使用BlockReaderLocal 在这种情况下,客户端可以直接读取块文件,并更改dataPos在下一次读取操作时实际执行基于偏移量的跳过。

我建议您查看 SequenceFile 格式,它可能会满足您的需求。

我们使用 seek 从文件的任意位置读取。

https://hadoop.apache.org/docs/r2.8.2/hadoop-project-dist/hadoop-common/api/org/apache/hadoop/io/SequenceFile.Reader.html#seek(long)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM