HDFS常用Shell命令
Hadoop支持很多Shell命令,其中fs是HDFS最常用的命令,利用fs可以查看HDFS文件系统的目录结构、上传和下载数据、创建文件等。
HDFS有三种shell命令方式:
- hadoop fs :适用于任何不同的文件系统,比如本地文件系统和HDFS文件系统。
- Hadoop dfs:只能适用与HDFS文件系统。
- hdfs dfs:跟hadoop dfs命令作用一样,也只能适用与HDfS文件系统。
我这里的的命令用的都是第三种,hdfs dfs。
对文件和文件夹的操作:
1 | hdfs dfs -mkdir input |
HDFS dfsadmin管理命令:
hdfs dfsadmin -report
查看文件系统的基本信息和统计信息。
hdfs dfsadmin -safemode get/enter
enter | leave | get | wait:安全模式命令。安全模式是NameNode的一种状态,在这种状态下,NameNode不接受对名字空间的更改(只读);不复制或删除块。NameNode在启动时自动进入安全模式,当配置块的最小百分数满足最小副本数的条件时,会自动离开安全模式。enter是进入,leave是离开。
hdfs dfsadmin -refreshNodes
重新读取hosts和exclude文件,使新的节点或需要退出集群的节点能够被NameNode重新识别。这个命令在新增节点或注销节点时用到。
hdfs dfsadmin -finalizeUpgrade
终结HDFS的升级操作。DataNode删除前一个版本的工作目录,之后NameNode也这样做。
hdfs dfsadmin -fupgradeProgress
status| details | force:请求当前系统的升级状态 | 升级状态的细节| 强制升级操作
hdfs dfsadmin -metasave filename
保存NameNode的主要数据结构到hadoop.log.dir属性指定的目录下的
文件中。
HDFS API详解
Hadoop中关于文件操作类基本上全部是在”org.apache.hadoop.fs”包中,这些API能够支持的操作包含:打开文件,读写文件,删除文件等。
Hadoop类库中最终面向用户提供的接口类是FileSystem,该类是个抽象类,只能通过来类的get方法得到具体类。get方法存在几个重载版本,常用的是这个:
1 | static FileSystem get(Configuration conf); |
该类封装了几乎所有的文件操作,例如mkdir,delete等。综上基本上可以得出操作文件的程序库框架:
1 | operator() |
为了编写一个能够与HDFS交互的Java应用程序,一般需要向Java工程中添加以下JAR包:
(1)”/usr/local/hadoop/share/hadoop/common”目录下的hadoop-common-2.7.1.jar和haoop-nfs-2.7.1.jar;
(2)/usr/local/hadoop/share/hadoop/common/lib”目录下的所有JAR包;
(3)“/usr/local/hadoop/share/hadoop/hdfs”目录下的haoop-hdfs-2.7.1.jar和haoop-hdfs-nfs-2.7.1.jar;
(4)“/usr/local/hadoop/share/hadoop/hdfs/lib”目录下的所有JAR包。
上传本地文件:
通过”FileSystem.copyFromLocalFile(Path src,Patch dst)
“可将本地文件上传到HDFS的制定位置上,其中src和dst均为文件的完整路径。具体代码如下:
1 | import org.apache.hadoop.conf.Configuration; |
程序运行结果:
1 | 复制文件到: file:/// |
如果遇到因为文件权限不够,程序运行失败,解决方法如下:
可能出现问题的原因有三种:
- hdfs 中的文件或文件夹 没有读取权限;
- hdfs 的配置中未允许拷出文件;
- linux 文件夹没有写入权限;
针对上述三个原因,解决方法如下:
增加hdfs文件夹权限
hdfs dfs -chmod 777 /
修改hdfs配置文件:
1
2
3
4
5
6
7
8
9 > # 在 $HADOOP_HOME/etc/hadoop/目录中,找到hdfs-site.xml,添加或更改以下属性:
>
> <property>
> <name>dfs.permissions</name>
> <value>false</value>
> </property>
>
> # 将true该为false。
>
增加Linux文件夹权限:
sudo chmod 777 /
创建HDFS文件:
通过”FileSystem.create(Path f)”可在HDFS上创建文件,其中f为文件的完整路径。具体代码如下:
1 | import org.apache.hadoop.conf.Configuration; |
写入文件和读取文件:
1 | import java.io.BufferedReader; |
程序运行结果:
1 | hello word! |
创建HDFS目录:
通过”FileSystem.mkdirs(Path f)”可在HDFS上创建文件夹,其中f为文件夹的完整路径。具体实现如下:
1 | import org.apache.hadoop.conf.Configuration; |
重命名HDFS文件:
通过”FileSystem.rename(Path src,Path dst)”可为指定的HDFS文件重命名,其中src和dst均为文件的完整路径。具体实现如下:
1 | import org.apache.hadoop.conf.Configuration; |
删除HDFS上的文件:
通过”FileSystem.delete(Path f,Boolean recursive)”可删除指定的HDFS文件,其中f为需要删除文件的完整路径,recuresive用来确定是否进行递归删除。具体实现如下:
1 | import org.apache.hadoop.conf.Configuration; |
删除目录和删除文件代码一样,换成路径就行,如果目录下有文件,递归删除。
查看某个HDFS文件是否存在:
通过”FileSystem.exists(Path f)”可查看指定HDFS文件是否存在,其中f为文件的完整路径。具体实现如下:
1 | import org.apache.hadoop.conf.Configuration; |
程序运行结果:
1 | 文件是否存在:true |
查看HDFS文件的信息状态:
通过”FileSystem.getModificationTime()”可查看指定HDFS文件的修改时间。具体实现如下:
1 | import java.text.SimpleDateFormat; |
程序运行结果:
1 | 文件的权限:rw-r--r-- |
读取HDFS某个目录下的所有文件:
通过”FileStatus.getPath()”可查看指定HDFS中某个目录下所有文件。具体实现如下:
1 | import org.apache.hadoop.conf.Configuration; |
程序运行结果如下:
1 | hdfs://localhost:9000/input/myFile.txt |
查找某个文件在HDFS集群的位置:
通过”FileSystem.getFileBlockLocation(FileStatus file,long start,long len)”可查找指定文件在HDFS集群上的位置,其中file为文件的完整路径,start和len来标识查找文件的路径。具体实现如下:
1 | import org.apache.hadoop.conf.Configuration; |
程序运行结果:
1 | block: 0 Location: ubuntu |
获取HDFS集群上所有节点名称信息:
通过”DatanodeInfo.getHostName()”可获取HDFS集群上的所有节点名称。具体实现如下:
1 | import org.apache.hadoop.conf.Configuration; |
程序运行结果:
1 | DataNode_0_Name:ubuntu |
以上内容为听华为大数据培训课程和大学MOOC上厦门大学 林子雨的《大数据技术原理与应用》课程而整理的笔记。
大数据技术原理与应用: https://www.icourse163.org/course/XMU-1002335004