HDFS 缓冲写/读操作

Kri*_*rov 2 java hadoop hdfs

我正在使用 HDFS Java API 和 FSDataOutput 和 FSDataInput 流将文件写入/读取到由 4 台机器组成的 Hadoop 2.6.0 集群。

FS 流实现有一个bufferSize构造函数参数,我假设它用于流的内部缓存。但它似乎对写入/读取速度完全没有影响,无论其值如何(我尝试了 8KB 到几个 MBytes 之间的值)。

我想知道是否有某种方法可以实现对 HDFS 集群的缓冲写入/读取,与将 FSDataOutput/Input 包装到 BufferedOutput/Input 流不同?

Kri*_*rov 5

我找到了答案。

FileSystem.create()的bufferSize参数实际上是io.file.buffer.size,我们可以从文档中读取到:

“用于序列文件的缓冲区大小。该缓冲区的大小可能应该是硬件页面大小(Intel x86 上的 4096)的倍数,它决定了在读写操作期间缓冲了多少数据。”

从“Hadoop:权威指南”一书中,我们可以了解到将其设置为 128KB 是一个很好的起点。

至于客户端内部缓存:Hadoop以数据包的形式传输数据(默认大小为64KB)。可以使用Hadoop hdfs-site.xml配置中的dfs.client-write-packet-size选项调整此参数。出于我的目的,我使用了 4MB。