Java程序从HDFS读取文件

时间:2020-01-09 10:34:32  来源:igfitidea点击:

这篇文章展示了一个Java程序,该程序使用Hadoop FileSystem API从HDFS读取文件。

使用Java在HDFS中读取文件的步骤如下:

  • FileSystem是文件系统的抽象,其中HDFS是其中的一种实现。因此,我们将必须使用get方法获取FileSystem的实例(在本例中为HDFS)。
  • 在程序中,我们可以看到get()方法将Configuration作为参数。配置对象具有从配置文件(即从中获取文件系统的core-site.xml)读取的所有与配置相关的信息。
  • 在HDFS中,Path对象代表完整文件路径。
  • 获取文件后,将使用HDFS中的FSDataInputStream读取输入流以进行读取。
  • 对于输出流,使用System.out在控制台上打印数据。

Java程序从HDFS读取文件

import java.io.IOException;
import java.io.OutputStream;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

public class HDFSFileRead {

  public static void main(String[] args) {
    Configuration conf = new Configuration();
    try {
      FileSystem fs = FileSystem.get(conf);
      // Hadoop DFS Path - Input file
      Path inFile = new Path(args[0]);
        
      // Check if input is valid
      if (!fs.exists(inFile)) {
        System.out.println("Input file not found");
        throw new IOException("Input file not found");
      }
			
      // open and read from file
      FSDataInputStream in = fs.open(inFile);
      // system.out as output stream to display 
      //file content on terminal 
      OutputStream out = System.out;
      byte buffer[] = new byte[256];
      try {
        int bytesRead = 0;
        while ((bytesRead = in.read(buffer)) > 0) {
          out.write(buffer, 0, bytesRead);
        }
      } catch (IOException e) {
        System.out.println("Error while copying file");
      } finally {
         // Closing streams
        in.close();
        out.close();
      }      
    } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }		 
  }
}

在Hadoop环境中执行程序

要在Hadoop环境中执行上述程序,我们需要在Hadoop的类路径中添加包含Java程序的.class文件的目录。

export HADOOP_CLASSPATH='/huser/eclipse-workspace/theitroad/bin'

我的HDFSFileRead.class文件位于/ huser / eclipse-workspace / theitroad / bin位置,因此我已经导出了该路径。

然后,我们可以通过提供必须作为Java程序的参数读取的HDFS文件来运行该程序,

hadoop org.theitroad.HDFSFileRead /user/input/test/aa.txt

使用IOUtils类读取HDFS中的文件

Hadoop框架提供了一个实用程序类IOUtils,该类具有许多与I / O相关的便捷方法。我们可以使用它来读取HDFS中的文件并在控制台上显示其内容。使用IOUtils将减小程序大小。

Java程序读取HDFS文件

import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;

public class HDFSFileRead {
  public static void main(String[] args) {
    Configuration conf = new Configuration();
    try {
      FileSystem fs = FileSystem.get(conf);
      FSDataInputStream in = null;
      // Hadoop DFS Path - Input file
      Path inFile = new Path(args[0]);
      // Check if input is valid
      if (!fs.exists(inFile)) {
        System.out.println("Input file not found");
        throw new IOException("Input file not found");
      }
      try {
        // open and read from file
        in = fs.open(inFile);			
        IOUtils.copyBytes(in, System.out, 512, false);		
      }finally {
        IOUtils.closeStream(in);
      }			
    } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }	 
  }
}