java—如何测试hdfs i/o吞吐量

bq3bfh9z  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(762)

我有一个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"

每次运行程序之前。

ego6inou

ego6inou1#

文件复制时间受许多因素影响,其中一些因素包括1)文件大小、2)网络延迟和传输速度、3)硬盘寻道和读/写时间、4)hdfs复制量。
当您处理小文件(从5mb到50mb都是小文件)时,延迟和寻道时间为您提供了一个复制时间的下限,此外,还提供了传输速度和读/写时间。从本质上讲,除非开始处理非常大的文件,否则不要期望看到线性时间增加。hdfs文件系统是基于大数据块的,我认为默认值是64mb,通常人们会将其设置为512mb或更大。
要测试io时间,请尝试使用testdfsio和testfilesystem。它们可以在hadoop hadoop mapreduce client jobclient-*.jar中找到

相关问题