我正在从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];
这样的东西,以便它可以容纳更大的缓冲区。
答案 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);
}