内容提要
- HDFS API概述
- HDFS Java API客户端编程
- HDFS云盘系统应用
一、HDFS API概述
Hadoop提供了多种访问接口API,以解决不同开发环境编程访问HDFS文件系统的问题,包括:C API、HFTP接口、REST API以及Java API等。
1.1 C APIT简介
libhdfs是Hadoop为C语言提供的一个函数库,为C语言程序提供HDFS文件操作和文件系统管理的访问接口。libhdfs位于$HADOOP_HDFS_HOME/lib/native/libhdfs.so中,该文件是一个预编译文件。libhdfs与Windows系统是兼容的。运行mvn编译器对hadoop-hdfs-project/hadoop-hdfs中的源代码重新编译即可构建Windows版的libhdfs。
libhdfs API是HDFS API的一个子集,其头文件位$HADOOP_HDFS_HOME/include/hdfs.h,该文件详细地描述了每个API函数的签名。
maven是一个项目构建和管理的工具,其主要Shell命令是mvn,它提供了代码编译、依赖管理、文档管理、项目报告等项目管理功能,它将项目过程规范化、自动化、高效化。使用maven及其插件,可以获得代码检查报告、单元测试覆盖率、实现持续集成等。
1.2 HFTP
HFTP提供从远程Hadoop HDFS集群读数据的能力,其读操作通过HTTP完成,所读数据来源于各DataNode节点。HFTP是一种只读的文件系统,因此如果你试图用它来写入数据或修改文件系统状态,那么它将抛出异常。
假如你拥有多个不同版本的HDFS集群且需要把一个集群的数据拷贝到另一个集群,则HFTP特别有用。使用HFTP,HDFS不同版本之间的兼容性问题可以得到有效解决。
例如,执行以下的操作:
hadoop distcp -i hftp://srchost:50070/src hdfs://desthost:8020/dest
其中,子命令distcp是Hadoop提供的工具命令,用于在两个HDFS集群之间中拷贝文件。上述操作是将源集群srchost中的src目录复制到目标集群desthost的dest目录中
1.3 HDFS API简介
Hadoop的REST API有两个:WebHDFS和HttpFS,二者提供几乎相同的功能,使一个集群外的客户机可以不用安装Hadoop和Java环境就可以对集群内的Hadoop进行访问,并且客户端不受程序设计语言的限制。
HDFS Java API位于org.apache.hadoop.fs包中,这些API能够支持的操作包括:打开文件、读/写文件、删除文件等。
1.4 HDFS Java API
HDFS Java API为客户端提供了针对文件系统、目录和文件的各种操作功能。在客户端应用程序中,通常按以下步骤来使用HDFS Java API。
1. 实例化Configuration
Configuration类位于org.apache.hadoop.conf包中,它封装了客户端或服务器的配置。每个配置选项是一个键/值对,通常以XML格式保存。
实例化Configuration类的代码如下:
Configuration conf = new Configuration();
2. 实例化FileSystem
FileSystem类是客户端访问文件系统的入口,是Hadoop为客户端提供的一个抽象的文件系统,可以是Hadoop的HDFS,也可以Amazon的S3。DistributedFileSystem类是FileSystem的一个具体实现,是HDFS真正的客户端API。
实例化FileSystem并返回默认的文件系统的代码如下:
FileSytem fs = FileSystem.get(conf);
3. 设置目标对象的路径
HDFS API提供Path类来封装HDFS文件路径。Path类位于org.apache.hadoop.fs包中。设置目标对象的路径的代码如下。
Path path = new Path("/test");
4. 执行文件或目录操作
得到FileSystem实例之后,就可以使用该实例提供的方法成员来执行相应的操作,例如打开文件、创建文件、重名文件、删除文件或检测文件是否存在等。
二、HDFS Java API客户端编程
HDFS Java API开放了有关HDFS文件系统的所有操作功能。通过使用该API,我们可以非常方便地开发自己的客户端管理程序,实现目标应用系统需要的分布式数据存储与管理功能,例如开发海量云存储系统。
HDFS Java API开放了有关HDFS文件系统的所有操作功能。通过使用该API,我们可以非常方便地开发自己的客户端管理程序,实现目标应用系统需要的分布式数据存储与管理功能,例如开发海量云存储系统。
2.1 目录与文件的创建
通过FileSystem.mkdir()方法可在HDFS中创建目录。该方法支持以下3种重载形式。
boolean mkdirs(Path f),创建一个具有默认访问权限的目录,其中f为子目录的完整路径。
abstract boolean mkdirs(Path f, FsPermission pms),相当于Linux系统的mkdir -p命令,能创建一个具有指定访问权限的目录,如果在f参数中指定的上级目标不存在,则先创建上级目录。
static boolean mkdirs(FileSystem fs, Path f, FsPermission pms) 在给定的文件系统中创建一个目录,使之具有指定的访问权限。
2.2 文件上传与下载
1. 上传本地文件
通过FileSystem.copyFromLocalFile()方法可以将本地文件上传到HDFS的指定位置。该方法有多种重载形式。将本地文件上传至HDFS中,首先要设置本地文件的路径,然后设置将要上传到HDFS中的目标路径中。
2. 下载HDFS文件
通过FileSystem.copyToLocalFile()方法可以把HDFS文件下载到本地磁盘。该方法有多种重载形式,要从HDFS中下载,必须要设置HDFS路径和本地路径。
2.3 数据流与文件读写操作
1. 文件读取操作
HDFS客户端(Client)通过调用FileSystem对象的open()方法来打开希望读取的文件,这个对象是分布式文件系统的一个实例。
DistributedFileSystem负责向远程的元数据节点(NameNode)发起RPC调用,得到文件的数据块信息(步骤2)。
NameNode视情况返回文件的部分或全部数据块列表,对于每一个数据块,NameNode都会返回该数据块及其副本的数据节点(DataNode)的地址。
DistributedFileSystem返回一个FSDataInputStream对象给客户端,用来读取数据。FSDataInputStream对象转而封装DFSInputStream对象(该对象负责NameNode和DataNode的通信)。
客户端调用FSDataInputStream对象的read()方法开始读取数据(步骤3)。
HDFS客户端(Client)通过调用FileSystem对象的open()方法来打开希望读取的文件,这个对象是分布式文件系统的一个实例。
DistributedFileSystem负责向远程的元数据节点(NameNode)发起RPC调用,得到文件的数据块信息(步骤2)。
NameNode视情况返回文件的部分或全部数据块列表,对于每一个数据块,NameNode都会返回该数据块及其副本的数据节点(DataNode)的地址。
DistributedFileSystem返回一个FSDataInputStream对象给客户端,用来读取数据。FSDataInputStream对象转而封装DFSInputStream对象(该对象负责NameNode和DataNode的通信)。
客户端调用FSDataInputStream对象的read()方法开始读取数据(步骤3)。
DFSInputStream对象连接保存此文件第一个数据块的最近的数据节点。
通过对数据流反复调用read()方法,把数据从数据节点传输到客户端(步骤4)。当此数据块读取完毕时,DFSInputStream关闭与此数据节点的连接,然后连接此文件下一个数据块的最近的数据节点(步骤5)。这些操作对客户端来说都是透明的,客户端只需要读取连续的流。
当客户端读取完毕数据的时候,调用FSDataInputStream的close()方法来关闭输入流。
2. 写文件的过程
2.4 目录与文件的重命名
通过FileSystem.rename()方法可以重命名指定的文件或目录。该方法的签名如下:
public abstract boolean rename(Path src, Path dst)
该方法将指定路径src重命名为目标路径dst,。该方法既可重命名本地文件系统中的文件或目录,也可以重命名远程的HDFS中的文件或目录。该方法操作成功时返回逻辑真。
2.5 目录和文件的删除
通过FileSystem.delete()方法可以删除指定的文件或目录。该方法的签名如下:
abstract boolean delete(Path f, boolean recursive)
其中,参数recursive指示是否进行递归删除。如果删除对象f是一个目录且recursive参数为true时,该目录及其内容子目录和文件将全部删除,否则将抛出异常。,当删除对象f是一个文件时,recursive参数既可设置true,也可设置为false。
2.6 文件系统的状态信息显示
1. HDFS文件的状态信息
通过FileSystem.getFileStatus()方法可以返回指定的文件或目录的状态信息。通过FileSystem.listStatus()方法可以返回指定目录的内部文件或子目录的状态信息。
getFileStatus()方法的签名如下:
public abstract FileStatus getFileStatus(Path f)
该方法返回一个FileStatus对象。在该对象中,封装了文件或目录的名称、最近修改时间、最近访问时间、拥有者、所属组、访问权限信息、数据块的大小及副本个数等信息。调用FileStatus对象提供的一系列get或set方法,即可获取或设置相应的状态信息。
2. HDFS文件的存储位置
通过FileSystem.getFileBlockLocations()方法可以返回指定的文件在HDFS集群中的存储位置。该方法有以下两种重载格式。
BlockLocation[] getFileBlockLocations(FileStatus file, long start, long len)
BlockLocation[] getFileBlockLocations(Path p, long start, long len)
以上两种重载都返回给定文件的各数据块的存储位置信息,包括主机名、块的大小和块首的字节序号(offset)等。如果不想返回整个文件的存储位置信息,而只想查找文件的部份数据(即字节序列)的存储位置,则只需要设置参数start和len来指定这个字节序列的起始字节编号和长度。调用BlockLocation对象的成员方法即可获取或设置各存储位置的信息。
3. HDFS集群的节点信息
通过调用位于org.apache.hadoop.hdfs中的DistributedFileSystem.getDataNodeStats()方法,可获得HDFS集群上所有节点状态信息。该方法返回值是一个DataNodeInfo数组,遍历该数组即可输出每一个节点的信息。其中,DistributedFileSystem是FileSystem类的派生类,是HDFS的客户端API。
三、HDFS云盘系统应用
云盘系统通过互联网为企业和个人提供信息的储存、读取、下载等服务,具有安全稳定、海量存储的特点。根据用户群定位,云盘系统可以划分为公有云盘、社区云盘、私有云盘等。
云盘系统设计:
更多精彩内容请持续关注本站!