2017-03-22 15 views
0

私はHDFSからファイルを読み込んでいます。私はこれを達成するために以下のコードを使用しています。Javaコードが完全にHDFSからファイルを読み取れない

public class ClassMain { 

    public static void main(String[] args) throws IOException { 

    Configuration conf = new Configuration(); 
    FileSystem fs = FileSystem.get(conf); 
    Path inFile = new Path(args[1]); 
    Path outFile = new Path(args[2]); 
    FSDataInputStream in = fs.open(inFile); 
    FSDataOutputStream out = fs.create(outFile); 
    byte buffer[] = new byte[4096]; 
    try{ 
    int bytesRead = 0; 
    while ((bytesRead = in.read(buffer)) > 0) 
    { 
    out.write(buffer, 0, bytesRead); 
    } 
    } 
    catch (IOException e) 
    { 
    System.out.println("ERROR*****************"+e); 
    } 
    finally 
    { 
    in.close(); 
    out.close(); 
    } 

私のファイルをHDFSから完全に読み取ることができません。サンプルファイルのサイズは、私が

byte buffer[] = new byte[12000000]; 

という高い値を大きくしようとしたが、まだ完全にファイルを読み取ることができません1004.9 Kです。

これを行う別の方法はありますか?これは、HDFSでわずか1 MBのサンプルサイズに過ぎません。ファイルは3〜4 GBほどの大きさになります。 long buffer[] = new long[12000000];のようなものを使用する方法はありますか。そのため、バッファに大きなサイズを収容することができます。

+0

ファイル全体をダウンロードする必要はありますか?もしそうなら、なぜそれをHDFSに入れましたか?たとえば、Sparkを使用してファイルの一部を操作できますか? –

答えて

1
(bytesRead = in.read(buffer)) > 0 

条件が間違っているため、ストリームがネットワーク上で0バイトを読み取ることは完全に可能です。 -1だけがストリームの終わりを決定します。

だからそれはあなたのための問題を修正する必要があります:あなたが想像できるように

while ((bytesRead = in.read(buffer)) != -1) 

、すでにそのためのライブラリがあり、例えばcommons-iocopyと呼ばれる手法が付属してそのコピーを別のストリームを。

三行で

簡単な例:私の作品にこのコードを発見

try(FSDataInputStream in = fs.open(inFile)){ 
    try(FSDataOutputStream out = fs.create(outFile)){ 
     IOUtils.copy(in, out); 
    } 
} 
+0

while((bytesRead = in.read(buffer))!= -1)は役に立ちませんでした。それは実際には、より小さなサイズのファイルでもパフォーマンスを低下させました。そしてそれは大きなファイルの問題を解決しませんでした。 – earl

+0

2番目のオプションは、小さいファイルと大きいファイルでも同じでした – earl

+0

新しいbyte []の値を増やして、その状態をin.read(buffer)!= -1として保持しようとしています。小さな値の場合、バッファーの小さな部分を読み込み、それをさらに増加させました。 517888の後には効果がありません。この点を超えてバッファによって読み取られた部分は変更されません。私は自分のコードで何が問題なのか分かりません。 – earl

0

。より大きなサイズのファイルも読み込むことができます。

public class MainClass { 

public static void main(String[] args) throws IOException{ 

    Configuration conf = new Configuration(); 
    FileSystem fs = FileSystem.get(conf); 
    Path inFile = new Path(args[1]); 
    Path outFile = new Path(args[2]); 

    BufferedReader br=new BufferedReader(new InputStreamReader(fs.open(inFile))); 
    String line; 
    line=br.readLine(); 

    String concatAllLines = line; 
    while (line != null){ 
      //System.out.println("reading lines"); 
      line=br.readLine(); 
      System.out.println(line); 
      if(line != null) 
       concatAllLines += line; 
    } 

    System.out.println(concatAllLines); 
} 
関連する問題