Java代码无法完全从HDFS读取文件

时间:2017-03-22 07:35:26

标签: java hadoop hdfs

我正在从HDFS读取文件。我使用下面的代码来实现这一点。

cluster-autoscaler

无法完全从HDFS读取我的文件。样本文件的大小是1004.9 K.我尝试将值增加到

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中1MB的小样本。文件大小为3到4 GB。 有没有办法使用像byte buffer[] = new byte[12000000]; 这样的东西,以便它可以容纳更大的缓冲区。

2 个答案:

答案 0 :(得分:1)

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

条件错误,流完全可以通过网络读取0个字节。只有-1确定流的结束。

所以这应该为你解决问题:

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

正如您可以想象的那样,已经有了库,例如commons-io带有一个名为copy的方法,它将一个流复制到另一个流。

三行简单示例:

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

答案 1 :(得分: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);
}