我正在使用hdfsjavaapi和fsdataoutput和fsdatainput流将文件写入/读取到由4台机器组成的hadoop2.6.0集群。fs流实现有一个buffersize构造函数参数,我假设它是流的内部缓存的参数。但它似乎对写/读速度完全没有影响,不管它的值是多少(我尝试了8kb到几MB之间的值)。我想知道是否有什么方法可以实现对hdfs集群的缓冲写/读,不同于将fsdataoutput/input Package 到bufferedoutput/input流中?
mbzjlibv1#
我找到了答案。filesystem.create()的buffersize参数实际上是io.file.buffer.size,从文档中可以看到:“用于序列文件的缓冲区大小。此缓冲区的大小可能是硬件页大小的倍数(英特尔x86上为4096),它决定了在读写操作期间缓冲了多少数据。”从《hadoop:权威指南》一书中我们可以看到,一个好的起点是将其设置为128kb。至于客户端的内部缓存:hadoop以包的形式传输数据(默认大小为64kb)。可以使用hadoop hdfs-site.xml配置中的dfs.client-write-packet-size选项调整此参数。为了我的目的,我用了4mb。
1条答案
按热度按时间mbzjlibv1#
我找到了答案。
filesystem.create()的buffersize参数实际上是io.file.buffer.size,从文档中可以看到:
“用于序列文件的缓冲区大小。此缓冲区的大小可能是硬件页大小的倍数(英特尔x86上为4096),它决定了在读写操作期间缓冲了多少数据。”
从《hadoop:权威指南》一书中我们可以看到,一个好的起点是将其设置为128kb。
至于客户端的内部缓存:hadoop以包的形式传输数据(默认大小为64kb)。可以使用hadoop hdfs-site.xml配置中的dfs.client-write-packet-size选项调整此参数。为了我的目的,我用了4mb。