我有一个 Java 程序,它使用 HDFS 数据输入/输出流读取文件并将内容写入新文件。我的目标是找出我的 HDFS 的 I/O 吞吐量。下面是执行读/写和计时的代码片段:
long start = System.currentTimeMillis();
FSDataInputStream in = fs.open( new Path(input) );
FSDataOutputStream out = fs.create( new Path(output), true);
while ((bytesRead = in.read(buffer)) > 0) {
out.write(buffer, 0, bytesRead);
data += bytesRead;
}
in.close();
out.close();
long end = System.currentTimeMillis();
System.out.println("Copy data " + data + " Bytes in " +
((double)end-start) + " millisecond");
我预计复制文件的时间与文件大小成正比。但是当我对 5MB 到 50MB 的文件运行程序时,结果并没有显示出这种相关性:
Copy data 5242880 Bytes in 844.0 millisecond
Copy data 10485760 Bytes in 733.0 millisecond
Copy data 15728640 Bytes in 901.0 millisecond
Copy data 20971520 Bytes in 1278.0 millisecond
Copy data 26214400 Bytes in 1304.0 millisecond
Copy data 31457280 Bytes in 1543.0 millisecond
Copy data 36700160 Bytes in 2091.0 millisecond
Copy data 41943040 Bytes in 1934.0 millisecond
Copy data 47185920 Bytes in 1847.0 millisecond
Copy data 52428800 Bytes in 3222.0 millisecond
我的问题是:为什么复制时间与文件大小不成比例?我使用了错误的方法吗?任何反馈将不胜感激。
我的 Hadoop 在伪分布式操作模式下运行,我使用命令清除缓存:
sudo sh -c "sync; echo 3 > /proc/sys/vm/drop_caches"
每次运行程序之前。