2016-08-16 8 views
0

AlluxioをローカルのSparkにインストールし、Alluxioのメモリに1000個のファイルを挿入しました。
ただし、読み込みファイルが非常に遅いため、Alluxioメモリからのファイル読み込み時間はディスクからの読み込み時間と同等です。私は、ファイルAPIを使用してデータを読む...なぜAlluxioのSpark javaで複数のファイルを読むのが遅い

File Name Size Block Size In-Memory Persistence State Pin Creation Time Modification Time 
file1 54.73KB 512.00MB  100% NOT_PERSISTED NO 08-16-2016 12:52:31:278 08-16-2016 12:52:31:372 
file2 54.73KB 512.00MB  100% NOT_PERSISTED NO 08-16-2016 12:52:31:377 08-16-2016 12:52:31:384 
file3 54.72KB 512.00MB  100% NOT_PERSISTED NO 08-16-2016 12:52:31:386 08-16-2016 12:52:31:393 
file4 54.71KB 512.00MB  100% NOT_PERSISTED NO 08-16-2016 12:52:31:394 08-16-2016 12:52:31:400 
file5 54.72KB 512.00MB  100% NOT_PERSISTED NO 08-16-2016 12:52:31:401 08-16-2016 12:52:31:407 
... 

をunderstantません:

FileSystem fs = FileSystem.Factory.get(); 
AlluxioURI path = new AlluxioURI(/partition0); 
List<URIStatus> status = fs.listStatus(path); 
for (int i=0; i<status.size(); i++) 
        { 
         path = new AlluxioURI(status.get(i).getPath()); 
         if(fs.exists(path)==true) 
         { 
          FileInStream in = fs.openFile(path); 
          String file = ""; 

          InputStreamReader ipsr = new InputStreamReader(in); 

          BufferedReader br=new BufferedReader(ipsr); 
          String line; 
          line=br.readLine(); 
          while (line != null){ 
           //System.out.println(line); 

           file = file + line; 
           line=br.readLine(); 
          } 

          byte[] cfv = file.getBytes(); 
          br.close(); 
          // Close file relinquishing the lock 
          in.close(); 
         } 
        } 

千個のファイルでパーティションを読み込むためのテストがあるので、私は本当に今のSparkは使用しないでください非常に遅い...(私はfuturでSparkとパーティションでファイルを読みたい)。

誰かにアイデアを教えてください。その理由は読書がとても遅いのですか?

答えて

2

あなたの例では少し見えるものがいくつかあります。

まずファイルに表示される情報は、ファイルがそれぞれ約50 kBで非常に小さく、Alluxioが512 MBブロックを使用するように設定されていることを示しています。これは、実際に必要とするよりもはるかに多くのデータを転送している可能性があります。考慮すべき点の1つは、主に小さなファイルを使用する場合は、はるかに小さなブロックサイズに設定する方がよいということです。

第2に、テストケースでファイルを実際に読み取る方法は、ひどく非効率です。文字列として行単位で読み込み、文字列連結を使用してファイルを構築し、次にそれをバイトに変換します。したがって、メモリ内のバイトから文字列へ、次にバイトへと戻ります。さらに、文字列連結を使用することによって、あなたが読んだファイルの全体を強制的にメモリテクニックにコピーすることができます。通常

あなたするか、別のWriterへの書き込み/ StringBuilderに行毎にファイルを読み込むか、別のOutputStream例えばへの書き込み/ byte[]にバイトとして、あなたは、ファイルを読んでいました最終的にbyte[]を取得したい場合は、ByteArrayOutputStreamのサイズがあらかじめわかりません。

3番目の考慮事項は、コードがクラスタ内で実行される場所です。ファイルがメモリー内にあっても、クラスター内のすべてのノード上のメモリーに存在しないことがあります。ファイルをまだメモリに格納されていないノードから読み込んだ場合は、そのファイルをネットワーク経由で読み取る必要があります。その時点でパフォーマンスが低下します。

最後に考慮すべき点は、OSファイルのキャッシュです。テストファイルを生成してからテストを実行した場合、それらのファイルはOSによってメモリにキャッシュされる可能性があります。キャッシュがOSレベルであるため、Alluxioよりも優れたパフォーマンスを得ることができます。意味のある比較をしたいのであれば、ファイルベースのテストを実行する前にOSファイルキャッシュをフラッシュする必要があります。

+0

ありがとうございました、私は間違いなく私の間違いを理解しています。ブロックのサイズに応じて最適なブロックサイズを選択するルールはありますか? – TiGi

0

いくつかのテストの後、ファイルのサイズが読み込み時間の主な問題です。小さなファイルには、読書時間が20倍以上になることがあります。 ブロックのサイズは読み込み時間にも影響します。読み込み時間は約1%増加します。

関連する問題