我正在使用 HDFS Java API 以及 FSDataOutput 和 FSDataInput 流将文件写入/读取到由 4 台机器组成的 Hadoop 2.6.0 集群。
FS 流实现有一个bufferSize 构造函数参数,我假设它用于流的内部缓存。但它似乎对写入/读取速度完全没有影响,无论其值如何(我尝试了 8KB 到几兆字节之间的值)。
我想知道是否有某种方法可以实现对 HDFS 集群的缓冲写入/读取,而不是将 FSDataOutput/Input 包装到 BufferedOutput/Input 流中?
最佳答案
我找到了答案。
FileSystem.create() 的 bufferSize 参数实际上是 io.file.buffer.size 我们可以从文档中读到:
“序列文件中使用的缓冲区大小。此缓冲区的大小可能是硬件页面大小(在 Intel x86 上为 4096)的倍数,它决定了在读写操作期间缓冲了多少数据。”
从《Hadoop: The Definitive Guide》一书中我们可以了解到,将其设置为 128KB 是一个很好的起点。
关于客户端内部缓存:Hadoop以数据包的形式传输数据(默认大小为64KB)。可以使用 Hadoop hdfs-site.xml 配置中的 dfs.client-write-packet-size 选项调整此参数。出于我的目的,我使用了 4MB。
关于java - HDFS 缓冲写/读操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30524640/