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