3

ファイルを読み取り、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"

プログラムを実行する前に毎回。

4

1 に答える 1

2

ファイルのコピー時間は、1) ファイル サイズ、2) ネットワークの遅延と転送速度、3) ハード ドライブのシーク時間と読み取り/書き込み時間、4) hdfs レプリケーションの量など、多くの要因の影響を受けます。

小さなファイル (5 MB から 50 MB は小さなファイル) で作業している場合、レイテンシーとシーク時間によってコピー時間の下限が決まり、その上に転送速度と読み取り/書き込み時間があります。基本的に、かなり大きなファイルで作業を開始しない限り、直線的な時間の増加は期待できません。HDFS ファイルシステムは大きなブロックに基づいています。デフォルトは 64MB だと思いますが、多くの場合、512MB 以上に設定されています。

io 時間をテストするには、これら、TestDFSIO、および testfilesystem を使用してみてください。これらは、hadoop hadoop-mapreduce-client-jobclient-*.jar にあります。

于 2013-04-29T23:47:18.360 に答える