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(); } } }