ファイルを読み取り、HDFS データ入出力ストリームを使用してコンテンツを新しいファイルに書き込む Java プログラムがあります。私の目標は、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 は Pseudo-Distributed Operation モードで実行されており、次のコマンドを使用してキャッシュをクリアしています。
sudo sh -c "sync; echo 3 > /proc/sys/vm/drop_caches"
プログラムを実行する前に毎回。