- HDFS是Hadoop主要应用的一个分布式文件系统。Hadoop中有一个综合性的文件系统抽象,它提供了文件系统实现的各类接口,HDFS是这个抽象文件系统的一个实例。
- Hadoop整合了众多文件系统,它首先提供了一个高层的文件系统抽象
org.apache.hadoop.fs.FileSystem
,这个抽象类展示了一个分布式文件系统,并有几个具体实现,如下表.
文件系统 | URI方案 | Java实现(org.apache.hadoop) | 描述 |
---|---|---|---|
Local | file | fs.LoacalFileSystem | 支持有客户端校验和的文件系统 |
HDFS | hdfs | hdfs.DistributedFileSystem | Hadoop分布式文件系统 |
HFTP | hftp | hdfs.HftpFileSystem | 支持通过HTTP方式以只读方式访问HDFS |
HSFTP | hsftp | hdfs.HsftpFileSystem | 支持通过HTTPS方式以只读方式访问HDFS |
HAR | har | fs.HarFileSystem | 构建在其他文档系统上进行归档文件的文件系统 |
KFS | kfs | fs.kfs.KosmosFileSystem | Cloudstore文件系统,类似HDFS用C++编写 |
FTP | ftp | fs.ftp.FtpFileSystem | 有FTP服务器支持的文件系统 |
S3(本地) | s3n | fs.s3native.NativeS3FileSystem | 基于Amazon S3的文件系统 |
S3(基于块) | s3 | fs.s3.NativeS3FileSystem | 基于Amazon S3的文件系统,以块格式存储,解决了S3的5GB限制 |
Hadoop提供了许多文件系统的接口,用户可使用URI方案选取适合的文件系统来实现交互。
通过文件系统命令接口进行Hadoop文件系统的操作,例如:想要列出本地文件系统的目录:
hadoop fs -ls file:///
1、HDFS常用Java API详解
Hadoop FileSystem类就饿Hadoop文件系统进行交互的API
1-1、使用Hadoop URL 读取数据
从Hadoop中读取数据,最简单的方式是说那个java.net.URL对象打开一个数据流,并从中读取数据,一般的调用格式如下:
package HDFS;
import org.apache.hadoop.io.IOUtils;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
/**
* Created by Promacanthus on 2017/6/30.
*/
public class URLClass {
public static void main(String[] args) {
InputStream inputStream = null;
try {
inputStream = new URL("hdfs://NameNodeIP/path").openStream();
IOUtils.copyBytes(inputStream,System.out,4096,false);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
IOUtils.closeStream(inputStream);
}
}
}
1-2、使用FileSystem API 读取数据
文件在Hadooop系统中被视为一个Hadoop Path 对象,可以把一个路径视为Hadoop的文件系统URI。
FileSystem API是一个高层抽象的文件系统API,首先要找到这里的文件系统实例HDFS,取得FileSystem实例有2个静态工厂方法:
public static FileSystem get(Configuration conf) throws IOException //返回默认文件系统,如果没有设置,则为默认的本地文件系统
public static FileSystem get(URI uri,Configuration conf)throws IOException //使用指定的URI方案决定文件系统的权限,如果指定的URI中没有指定方案,则退回默认的文件系统