2013-04-29 211 views
2

我有一個Java程序讀取文件並使用HDFS數據輸入/輸出流將內容寫入新文件。我的目標是找出HDFS的I/O吞吐量。下面是執行讀/寫和定時的代碼片段:如何測試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" 

運行程序之前每次。

回答

1

文件複製時間受很多因素影響,其中一些包括1)文件大小,2)網絡延遲和傳輸速度,3)硬盤驅動器查找和讀取/寫入時間,4)hdfs複製數量。

當您使用小文件(並且您的5mb到50mb爲小文件)時,延遲時間和查找時間會給您複製時間的下限,最重要的是您具有傳輸速度和讀/寫倍。本質上,除非您開始使用大量更大的文件,否則不要期望看到線性時間增加。 HDFS文件系統基於大塊,我認爲默認是64MB,並且通常人們把它放到512MB或更大。

爲了測試io次嘗試使用這些,TestDFSIO和testfilesystem。它們在hadoop hadoop-mapreduce-client-jobclient中發現 - *。jar

+0

謝謝!我使用更大尺寸的文件(例如64 MB,96 MB)嘗試了該程序。這次I/O速率非常穩定,非常接近本機OS I/O速度(例如7MB/s)。 – mike 2013-04-30 21:37:44