HDFS两种操作方式命令行和Java API.docx
《HDFS两种操作方式命令行和Java API.docx》由会员分享,可在线阅读,更多相关《HDFS两种操作方式命令行和Java API.docx(11页珍藏版)》请在冰豆网上搜索。
HDFS两种操作方式命令行和JavaAPI
HDFS两种操作方式:
命令行和JavaAPI
HDFS文件操作有两种方式:
一种是命令行方式,Hadoop提供了一套与 Linux 文件命令类似的命令行工具;另一种是 Java API,即利用Hadoop的Java库,采用编程的方式操作HDFS的文件。
本节将介绍Linux操作系统中关于HDFS文件操作的常用命令行,并将介绍利用Hadoop提供的JavaAPI进行基本的文件操作,以及利用Web界面查看和管理HDFS的方法。
HDFS常用命令
在Linux命令行终端,可以使用命令行工具对HDFS进行操作。
使用这些命令行可以完成HDFS文件的上传、下载和复制,还可以查看文件信息、格式化NameNode等。
HDFS命令行的统一格式如下。
hadoopfs-cmd
其中,cmd是具体的文件操作命令,是一组数目可变的参数。
1.添加文件和目录
HDFS有一个默认工作目录/usr/$USER,其中,$USER是登录用户名,如root。
该目录不能自动创建,需要执行mkdir命令创建。
hadoopfs-mkdir/usr/root
使用Hadoop的命令put将本地文件README.txt上传到HDFS。
hadoopfs-putREADME.txt
注意,上面这个命令的最后一个参数是:
“.”,这意味着把本地文件上传到默认的工作目录下,该命令等价于以下代码。
hadoopfs-putREADME.txt/user/root
2.下载文件
下载文件是指从HDFS中获取文件,可以使用Hadoop的get命令。
例如,若本地文件没有README.txt文件,则需要从HDFS中取回,可以执行以下命令。
hadoopfs-getREADME.txt
或者执行以下命令。
hadoopfs-getREADME.txt/usr/root/README.txt
3.删除文件
Hadoop删除文件的命令为rm。
例如,要删除从本地文件上传到HDFS的README.txt,可以执行以下命令。
hadoopfs-rmREADME.txt
4.检索文件
检索文件即查阅HDFS中的文件内容,可以使用Hadoop中的cat命令。
例如,要查阅README.txt的内容,可以执行以下命令。
hadoopfs-catREADME.txt
另外,Hadoop的cat命令的输出也可以使用管道传递给UNIX命令的head,可以只显示文件的前一千个字节。
hadoopfs-catREADME.txt|head
Hadoop也支持使用tail命令查看最后一千字节。
例如,要查阅README.txt最后一千个字节,可以执行如下命令。
hadoopfs-tailREADME.txt
5.查阅帮助
查阅HDFS命令帮助,可以更好地了解和使用Hadoop的命令。
用户可以执行hadoopfs来获取所用版本HDFS的一个完整命令类别,也可以使用help来显示某个具体命令的用法及简短描述。
例如,要了解ls命令,可执行以下命令。
hadoopfs-helpls
HDFS的Web界面
在配置好Hadoop集群之后,用户可以通过Web界面查看HDFS集群的状态,以及访问HDFS,访问地址如下。
http:
//[NameNodeIP]:
50070
其中,[NameNodeIP]为HDFS集群的NameNode的IP地址。
登录后,用户可以查看HDFS的信息。
如图1所示,通过HDFSNameNode的Web界面,用户可以查看HDFS中各个结点的分布信息,浏览NameNode上的存储、登录等日志,以及下载某个DataNode上某个文件的内容。
通过HDFS的Web界面,还可以查看整个集群的磁盘总容量,HDFS已经使用的存储空间量,非HDFS已经使用的存储空间量,HDFS剩余的存储空间量等信息,以及查看集群中的活动结点数和宕机结点数。
图2显示了一个DataNode的信息,如磁盘的数量,每块磁盘的使用情况等。
通过Web界面中的“Utilities”→“Browsethefilesystem”可以查看当前HDFS的目录列表,以及每个目录的相关信息,包括访问权限、最后修改日期、文件拥有者、目录大小等。
进一步,用户还可以通过Web界面查看文件的信息,如图3所示。
用户不仅可以查看文件的权限、大小等信息,还可以查看该文件的每个数据块所在的数据结点。
因为每一个文件都是分成好多数据块的,每个数据块又有3个副本,这些数据块的副本全部分布存放在多个DataNode中,所以用户不可能像传统文件系统那样来访问文件。
HDFSWeb界面给用户提供了一个方便、直观地查看HDFS文件信息的方法。
通过Web界面完成的所有操作,都可以通过Hadoop提供的命令来实现。
图1 HDFSNameNode的WEB界面
图2 HDFSNameNode的WEB界面
图3 HDFS文件界面
HDFS的JavaAPI
HDFS设计的主要目的是对海量数据进行存储,也就是说在其上能够存储很大量的文件。
HDFS将这些文件分割之后,存储在不同的DataNode上,HDFS提供了通过JavaAPI对HDFS里面的文件进行操作的功能,数据块在DataNode上的存放位置,对于开发者来说是透明的。
使用JavaAPI可以完成对HDFS的各种操作,如新建文件、删除文件、读取文件内容等。
下面将介绍HDFS常用的JavaAPI及其编程实例。
对HDFS中的文件操作主要涉及以下几个类。
名称
作用
org.apache.hadoop.con.Configuration
该类的对象封装了客户端或者服务器的配置。
org.apache.hadoop.fs.FileSystem
该类的对象是一个文件系统对象,可以用该对象的一些方法来对文件进行操作。
org.apache.hadoop.fs.FileStatus
该类用于向客户端展示系统中文件和目录的元数据,具体包括文件大小、块大小、副本信息、所有者、修改时间等。
org.apache.hadoop.fs.FSDatalnputStream
该类是HDFS中的输入流,用于读取Hadoop文件。
org.apache.hadoop.fs.FSDataOutputStream
该类是HDFS中的输出流,用于写Hadoop文件;
org.apache.hadoop.fs.Path
该类用于表示Hadoop文件系统中的文件或者目录的路径。
下面通过一个实例来说明如何对文件进行具体操作。
1.获取文件系统
1./**
2.*获取文件系统
3.*@returnFileSystem
4.*/
5.publicstaticFileSystemgetFileSystem(){
6.//读取配置文件
7.Configurationconf=newConfiguration();
8.//文件系统
9.FileSystemfs=null;
10.StringhdfsUri=HDFSUri;
11.if(StringUtils.isBlank(hdfsUri)){
12.//返回默认文件系统,如果在Hadoop集群下运行,使用此方法可直接获取默认文件系统
13.try{
14.fs=FileSystem.get(conf);
15.}catch(IOExceptione){
16.logger.error("",e);
17.}
18.}else{
19.//根据指定的文件系统,如果在本地测试,需要使用此方法获取文件系统
20.try{
21.URIuri=newURI(hdfsUri.trim());
22.fs=FileSystem.get(uri,conf);
23.}catch(URISyntaxException|IOExeptione){
24.logger.error("",e);
25.}
26.}
27.returnfs;
28.}
2.创建文件目录
1./**
2.*创建文件目录
3.*@parampath
4.*/
5.publicstaticvoidmkdir(Stringpath){
6.try{
7.//获取文件系统
8.FileSystemfs=getFileSystem();
9.StringhdfsUri=HDFSUri;
10.if(StringUtils.isNotBlank(hdfsUri)){
11.path=hdfsUri+path;
12.}
13.//创建目录
14.fs.mkdirs(newPath(path));
15.//释放资源
16.fs.close();
17.}catch(IllegalArgumentException|IOExceptione){
18.logger.error("",e);
19.}
20.}
3.删除文件或者文件目录
1./**
2.*删除文件或者文件目录
3.*@parampath
4.*/
5.publicstaticvoidrmdir(Stringpath){
6.try{
7.//返回FileSystem对象
8.FileSystemfs=getFileSystem();
9.StringhdfsUri=HDFSUri;
10.if(StringUtils.isNotBlank(hdfsUri)){
11.path=hdfsUri+path;
12.}
13.//删除文件或者文件目录
14.fs.delete(newPath(path),true);
15.//释放资源
16.fs.close();
17.}catch(IllegalArgumentException|IOExceptione){
18.logger.error("",e);
19.}
20.}
4.将文件上传至HDFS
1./**
2.*将文件上传至HDFS
3.*@paramdelSrc
4.*@paramoverwrite
5.*@paramsrcFile
6.*@paramdestPath
7.*/
8.publicstaticvoidcopyFileToHDFS(booleandelSrc,booleanoverwrite,StringsrcFile,StringdestPath){
9.//源文件路径是Linux下的路径
10.PathsrcPath=newPath(srcFile);
11.//目的路径
12.StringhdfsUri=HDFSUri;
13.if(StringUtils.isNotBlank(hdfsUri)){
14.destPath=hdfsUri+destPath;
15.}
16.PathdstPath=newPath(destPath);
17.//实现文件上传
18.try{
19.//获取FileSystem对象
20.FileSystemfs=getFileSystem();
21.fs.copyFromLocalFile(srcPath,dstPath);
22.fs.copyFromLocalFile(delSrc,overwrite,srcPath,dstPath);
23.//释放资源
24.fs.close();
25.}catch(IOExceptione){
26.logger.error("",e);
27.}
28.}
5.从HDFS下载文件
纯文本复制
1./**
2.*从HDFS下载文件
3.*@paramsrcFile
4.*@paramdestPath
5.*/
6.publicstaticvoidgetFile(StringsrcFile,StringdestPath){
7.//源文件路径
8.StringhdfsUri=HDFSUri;
9.if(StringUtils.isNotBlank(hdfsUri)){
10.srcFile=hdfsUri+srcFile;
11.}
12.PathsrcPath=newPath(srcFile);
13.//目的路径是Linux下的路径
14.PathdstPath=newPath(destPath);
15.try{
16.//获取FileSystem对象
17.FileSystemfs=getFileSystem();
18.//下载HDFS上的文件
19.fs.close();
20.}catch(IOExceptione){
21.logger.error("",e);
22.}
23.}