我正在使用HDFS Java API和FSDataOutput以及FSDataInput流将文件写入/读取到4台计算机的Hadoop 2.6.0群集中。
FS流实现有一个 bufferSize 构造函数参数,我假设它是用于流的内部缓存。但它似乎对写入/读取速度完全没有任何影响,无论其值如何(我尝试了8KB到几MB之间的值)。
我想知道是否有某种方法可以实现对HDFS群集的缓冲写入/读取,不同于将FSDataOutput / Input包装到BufferedOutput / Input流中?
答案 0 :(得分:2)
我找到了答案。
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。