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

