持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第15天,点击查看活动详情
前言
HDFS是Hadoop生态中的一个文件系统之一,Hadoop有一个抽象的文件系统概念,HDFS只是其中的一个实现,Hadoop在org.apache.hadoop.fs.FileSystem的类中定义了一个文件系统需要的客户端接口。今天我们的主题就是介绍Hadoop的文件系统的概念以及如果使用Java接口操作HDFS
Hadoop文件系统
FileSystem类下有许多的实现类,主要有以下几种实现类:
- Local。这是使用客户端校验和的本地磁盘文件系统。
- HDFS。Hadoop的分布式文件系统,与Hadoop生态组件进行交互,实现高性能的文件存取操作。
- WebHDFS。基于HTTP的文件系统,提供HDFS的认证读/写访问。
- Secure WebHDFS。WebHDFS的HTTPS版本。
- FTP。由FTP服务器支持的文件系统。
Hadoop一般使用URI方案选取合适的文件系统实例进行交互。每个文件系统都会有自己的文件URI协议,比如HDFS使用的就是hdfs://,FTP使用的就是ftp://。这里存在一个注意点就是Hadoop HTTP接口比原生的Java客户端接口要慢,不到万不得已,不要使用它来传输大数据量。
Java接口
在我们的大数据开发的过程中,都是使用Java的API接口来进行操作数据的。通过Hadoop的Path对象我们可以将路径视为一个Hadoop文件系统的URI。默认的Configuration获取/etc/hadoop/core-site.xml中的配置。
现在我们来通过Java接口的形式来获取文件的数据。使用URLStreamHandler实例以标准输出方式显示Hadoop文件系统的文件,具体代码如下:
public class URLCat {
static {
URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
}
public static void main(String[] args) throws Exception {
InputStream in = null;
try {
// 可以指定HDFS的文件路径
// in = new URL("hdfs://localhost/user/jackpan/sample_mnm.txt").openStream();
// 可以通过参数传递
in = new URL(args[0]).openStream();
IOUtils.copyBytes(in, System.out, 4096, false);
} finally {
IOUtils.closeStream(in);
}
}
}
总结
今天我们了解Hadoop的文件系统的多种类型,不只是只有HDFS一种,也通过一个Java API接口的案例获取文件数据并进行输出展示。