
3.5 HDFS应用实践
本节介绍关于HDFS文件操作的常用Shell命令,利用Web界面查看和管理Hadoop文件系统,以及利用Hadoop提供的Java API进行基本的文件操作。
3.5.1 HDFS常用命令
HDFS文件的相关操作主要使用hadoop fs、hadoop dfs、hdfs dfs命令,以下对最常用的相关命令进行简要说明。
(1)ls命令

列出HDFS根目录下的目录和文件。

列出HDFS所有的目录和文件。
(2)put命令

hdfs file的父目录一定要存在,否则命令不会执行。

hdfs dir一定要存在,否则命令不会执行。

从键盘读取输入到hdfs file中,按〈Ctrl+D〉键结束输入,hdfs file不能存在,否则命令不会执行。
(3)moveFromLocal命令

与put相类似,命令执行后源文件local src被删除,也可以从键盘读取输入到hdfs file中。
(4)copyFromLocal命令

与put相类似,也可以从键盘读取输入到hdfs file中。
(5)get命令

local file和hdfs file名字不能相同,否则会提示文件已存在,没有重名的文件会复制到本地。

复制多个文件或目录到本地时,本地为文件夹路径,如果用户不是root,local路径为用户文件夹下的路径,否则会出现权限问题。
(6)copyToLocal命令

与get相类似。
(7)rm命令

每次可以删除多个文件或目录。
(8)mkdir命令

只能一级一级地创建目录,父目录不存在的话使用这个命令会报错。

所创建的目录中,如果父目录不存在就创建该父目录。
(9)getmerge命令

将hdfs指定目录下所有文件排序后合并到local指定的文件中,文件不存在时会自动创建,文件存在时会覆盖里面的内容。

加上nl后,合并到local file中的hdfs文件之间会空出一行。
(10)cp命令

目标文件不能存在,否则命令不能执行,相当于给文件重命名并保存,源文件还存在。

目标文件夹要存在,否则命令不能执行。
(11)mv命令

目标文件不能存在,否则命令不能执行,相当于给文件重命名并保存,源文件不存在。

源路径有多个时,目标路径必须为目录,且必须存在,跨文件系统的移动(local到hdfs,或者反过来)都是不允许的。
(12)count命令

统计hdfs对应路径下的目录个数、文件个数、文件总计大小,显示为目录个数、文件个数、文件总计大小,输入路径。
(13)du命令

显示hdfs对应路径下每个文件夹和文件的大小。

显示hdfs对应路径下所有文件的大小。

显示hdfs对应路径下每个文件夹和文件的大小,文件的大小用方便阅读的形式表示,例如用64M代替67108864。
(14)text命令

将文本文件或某些格式的非文本文件通过文本格式输出。
(15)setrep命令

改变一个文件在hdfs中的副本个数,上述命令中数字3为所设置的副本个数,-R选项可以对一个目录下的所有目录和文件递归执行改变副本个数的操作。
(16)stat命令

返回对应路径的状态信息。[format]可选参数有:%b(文件大小),%o(block大小),%n(文件名),%r(副本个数),%y(最后一次修改日期和时间)。
注意:可以这样书写hadoop fs-stat%b%o%n<hdfs path>,不过不建议,这样每个字符输出的结果不太容易分清楚。
(17)tail命令

在标准输出中显示文件末尾的1KB数据。
(18)archive命令

命令中参数name:压缩文件名,自己任意取;< hdfs parent dir >:压缩文件所在的父目录;< src >:要压缩的文件名;< hdfs dst >:压缩文件存放路径。
示例:hadoop archive-archiveName hadoop.har-p/user 1.txt 2.txt/des。示例中将hdfs中/user目录下的文件1.txt,2.txt压缩成一个名叫hadoop.har的文件存放在hdfs中/des目录下,如果1.txt,2.txt不写就是将/user目录下所有的目录和文件压缩成一个名叫hadoop.har的文件存放在hdfs中/des目录下。
显示jar的内容可以用如下命令:

显示har压缩的是哪些文件可以用如下命令:

注意:har文件不能进行二次压缩。如果想给.har加文件,只能找到原来的文件,重新创建一个。har文件中原来文件的数据并没有变化,har文件真正的作用是减少NameNode和DataNode过多的空间浪费。
(19)balancer命令

如果管理员发现某些DataNode保存数据过多,某些DataNode保存数据相对较少,可以使用上述命令手动启动内部的均衡过程。
(20)dfsadmin命令

管理员可以通过dfsadmin管理HDFS,通过上述命令可以查看。

显示文件系统的基本数据。

enter:进入安全模式;leave:离开安全模式;get:获知是否开启安全模式;wait:等待离开安全模式。
3.5.2 HDFS的Web界面
1.启动顺序
(1)启动Hadoop
执行bin/start-dfs.sh(注意:第一次启动Hadoop之前必须namenode-format),启动完成后,使用jps命令查看。
master上有两个进程:namenode和secondarynamenode。
slave上有一个进程:datanode。如图3-25所示。

图3-25 DatoNode进程
(2)启动yarn
执行bin/start-yarn.sh,启动完成后,使用jps命令查看。
master上又启动了一个新进程:resourcemanager。
slave上又启动了一个新进程:nodemanager。如图3-26所示。

图3-26 nodemanager进程
(3)启动ZooKeeper
执行bin/zkServer.sh start(master和slave上都要启动,第一步和第二步只在master上启动即可),启动完成后,使用jps命令查看。
master和slave上又多了一个新进程:quorunpeermain。
(4)启动HBase
bin/start-hbase.sh,启动完成后,使用jps命令查看。
master上多了一个进程:HMaster。
slave上多了一个进程:HRegionserver。
至此,启动完成,可以进入Hbase shell,进行建表、添加数据等操作。
2.使用Web查看Hadoop的运行状态
(1)查看HDFS集群状态
访问如下地址:http://198.199.89.85:50070,界面如图3-27所示。

图3-27 查看HDFS集群状态
(2)查看Web控制台状态
访向如下地址:http://master:8088(yarn.resourcemanager.webapp.address)。
(3)查看HBase的状态
访向如下地址:http://localhost:60010。对于Hadoop2.2.0,只发现了上述两个Web地址,可能还有其他的,Hadoop1.x和Hadoop0.20.x的Web地址对应的端口可能不太一样,也可能和配置文件有关,了解完Hadoop,下面从视觉上看看Hadoop如何使用,如图3-28所示。

图3-28 实际运行
可以在Windows 7系统上,通过Web界面在浏览器地址栏输入地址198.199.89.85:50070,直接查看Hadoop的运行情况。由此可以看到Map/Reduce的管理情况,如图3-29~图3-31所示。

图3-29 Node of the cluster界面

图3-30 Accepted Applications界面

图3-31 Scheduler界面
3.5.3 HDFS常用Java API及应用实例
打开Eclipse,开始创建项目,选择顶部菜单File→New→Java Project,创建名为HadoopTest的项目,如图3-32所示。

图3-32 创建Hadoop Test项目
为项目加载所需要的jar包。首先获取jar包,Java API所在的jar包都在已经安装好的Hadoop文件夹中,路径为:<hadoop_home>/share/hadoop。本项目所需的Hadoop jar包主要有hadoop-common-2.9.0.jar和hadoop-hdfs-2.9.0.jar。
加载jar包的具体操作为:右击所选的Eclipse项目→在弹出菜单中选择Properties→Java Build Path→Libraries→Add Externall JARS。另外,为了避免报“ClassNotFound”异常,还需要向项目中加入Hadoop API所依赖的第三方包,这些包在<hadoop_home>/share/hadoop/common/lib/文件夹下,将该lib文件整个复制到项目根目录下,并在Eclipse中刷新项目,选中lib下的所有jar包,右击选择Build Path→Add to Build Path,如图3-33所示。

图3-33 路径选择
编写一个简单的程序来测试伪分布文件系统HDFS上是否存在test.txt文件。

直接运行会报以下错误。

该错误的解决方法是将<hadoop_home>/etc/hadoop/文件夹下的core-site.xml文件和hdfs-site.xml文件复制到项目的src/目录下。
再运行还会报以下错误。

需要添加hadoop-hdfs-client-2.9.0.jar包到Build Path下。
运行成功后结果如图3-34所示。

图3-34 添加hadoop-hdfs-client-2.9.0.jar包
【实例一】:使用java.net.URL访问HDFS。
操作:显示HDFS文件夹中的文件内容。
● 使用java.net.URL对象打开数据流。
● 使用静态代码块使得Java程序识别Hadoop的HDFS url。
操作代码如下:

1)在指定文件夹下创建示例文件demo,如图3-35所示。


图3-35 创建demo文件
2)上传文件至HDFS的data目录,需要首先创建data目录,如图3-36所示。


图3-36 创建data目录
3)查看是否上传成功,如图3-37所示。


图3-37 查看上传结果
4)将已经打包好的jar文件上传至Linux并切换到相应文件夹运行Hadoop命令执行,从结果可以看出demo文件的内容,如图3-38所示。


图3-38 demo文件内容
【实例二】:使用FileSystem访问HDFS。
操作:将本地文件系统的文件通过java-API写入到HDFS文件。
1)本地文件系统和HDFS中应该首先创建指定的目录。
Linux中创建文件命令:mkdir test。
HDFS中创建文件夹命令:hadoop dfs-mkdir /data/。

2)程序源代码如下。


3)程序打包并传至Linux文件系统中,请参考实例一的打包过程。
4)程序运行及结果分析。
①查看指定jar包是否成功上传,在Linux中使用ls或ll命令。
②执行jar命令,运行结果如图3-39所示。


图3-39 程序运行结果
③结果显示“welcome to....”说明操作正确回到导航。
【实例三】:创建HDFS目录。
操作:HDFS创建test2目录。
1)明确在HDFS中创建目录的具体地址,在程序中通过args[0]参数提供用户输入,例如:

2)程序源代码如下。


3)将jar包上传到Linux,请参考第一个程序的导出jar包的过程。
4)程序运行及结果分析如图3-40所示。


图3-40 test 2目录创建
【实例四】:删除HDFS目录。
源代码如下:


将jar包上传到Linux(请参考第一个程序的导出jar包的过程)。
程序运行及结果分析:执行程序之后,通过hadoop dfs-ls/查看是否成功删除HDFS上面的文件。
【实例五】:查看文件或目录是否存在。
源代码如下:

将jar包上传到Linux(请参考第一个程序的导出jar包的过程)。
程序运行及结果分析:如果在Linux中存在该文件的话,则显示“指定文件或目录Exists”。
【实例六】:列出目录下的文件或目录名称。
源代码如下:

将jar包上传到Linux(请参考第一个程序的导出jar包的过程)。程序运行及结果分析如图3-41所示。

图3-41 运行结果
【实例七】:查看文件存储位置。
源代码如下:


将jar包上传到Linux(请参考第一个程序的导出jar包的过程)。
程序运行及结果分析:由于采用伪分布的环境block块存储均为1,因此这里仅显示1个block块的host主机名,显示“block_0_Location:neusoft-master”。
【实例八】:将本地文件写入到HDFS中。
源代码如下:


将jar包上传到Linux(请参考第一个程序的导出jar包的过程)。
程序运行及结果分析:将本地的demo文件写入HDFS的data目录下的test文件。