java - HDFS 缓冲写/读操作

标签 java hadoop hdfs

我正在使用 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/

相关文章:

hadoop - 无法将文件从本地目录放入 HDFS

hadoop - 如何以破坏Flume中的目录路径的方式访问远程主机中的文件夹

hadoop - 从 hdfs 复制文件并重命名(如果存在)

java - Eclipse STS 与 Java 9 的源兼容性问题

java - 在没有 Apache 的情况下从 301 重定向获取 URL

java - 在 Java MapReduce 作业中写入 Hive

java - 将普通的Java代码转换为hadoop代码而不使用mapreduce?

java - DB2 中的错误代码=-4461,SQLSTATE=42815

java - Android模拟器在尝试了很多方法来修复它后仍然黑屏

java - 转储不适用于 pigrunner