接下来介绍Linux操作系统中关于HDFS文件操作的常用Shell命令,利用Web界面查看和管理Hadoop文件系统,以及利用Hadoop提供的Java API进行基本的文件操作。
在学习HDFS编程实践前,我们需要启动Hadoop。执行如下命令,开启 NaneNode
和 DataNode
守护进程。
启动时可能会有 WARN 提示 “WARN util.NativeCodeLoader…” 如前面提到的,这个提示不会影响正常使用。
cd /usr/local/hadoop
./sbin/start-dfs.sh #启动hadoop
启动完成后,可以通过命令 jps
来判断是否成功启动,若成功启动则会列出如下进程: “NameNode”、”DataNode”和SecondaryNameNode(如果 SecondaryNameNode 没有启动,请运行 sbin/stop-dfs.sh 关闭进程,然后再次尝试启动尝试)。如果没有 NameNode 或 DataNode ,那就是配置不成功,请仔细检查之前步骤,或通过查看启动日志排查原因。
成功启动后,可以访问 Web 界面 http://localhost:50070 查看 NameNode 和 Datanode 信息,还可以在线查看 HDFS 中的文件。
若要关闭 Hadoop,则运行
./sbin/stop-dfs.sh
一、利用Shell命令与HDFS进行交互
Hadoop支持很多Shell命令,其中fs是HDFS最常用的命令,利用fs可以查看HDFS文件系统的目录结构、上传和下载数据、创建文件等。
注意
教材《大数据技术原理与应用》的命令是以”./bin/hadoop dfs”开头的Shell命令方式,实际上有三种shell命令方式。
- hadoop fs
- hadoop dfs
- hdfs dfs
- hadoop fs适用于任何不同的文件系统,比如本地文件系统和HDFS文件系统
- hadoop dfs只能适用于HDFS文件系统
- hdfs dfs跟hadoop dfs的命令作用一样,也只能适用于HDFS文件系统
0.帮助相关命令
我们可以在终端输入如下命令,查看fs总共支持了哪些命令,同理hdfs dfs也可以查看dfs支持的所有命令。
./bin/hadoop fs
- -help:查看命令详细帮助
例如:我们查看put命令如何使用,可以输入如下命令
./bin/hadoop fs -help put
- -usage:查看命令的用法,例查看ls的用法
hadoop fs -usage ls
1.目录操作
需要注意的是,Hadoop系统安装好以后,第一次使用HDFS时,需要首先在HDFS中创建用户目录。本教程登录Linux系统全部使用hadoop1用户登录,因此为了方便起见,需要在HDFS中为hadoop用户创建一个用户目录,命令如下:
hdfs dfs -mkdir -p /user/hadoop1
注意:为了后续实验操作方便,这里创建文件夹名必须与登录用户名相同。hadoop自动绑定登录用户名与hdfs中/user目录下的同名文件夹。事实上,hadoop的绝大多数目录的默认作用路径都是登录用户的文件夹(从我目前尝试的目录来看),这也是为什么强制的原因。
该命令中表示在HDFS中创建一个“/user/hadoop1”目录,“–mkdir”是创建目录的操作,“-p”表示如果是多级目录,则父目录和子目录一起创建,这里“/user/hadoop1”就是一个多级目录,因此必须使用参数“-p”,否则会出错。
“/user/hadoop1”目录就成为hadoop1用户对应的用户目录,可以使用如下命令显示HDFS中与当前用户hadoop对应的用户目录下的内容:
hdfs dfs -ls .
该命令中,“-ls”表示列出HDFS某个目录下的所有内容,“.”表示HDFS中的当前用户目录,也就是“/user/hadoop”目录,因此,上面的命令和下面的命令是等价的:
hdfs dfs -ls /user/hadoop1
如果要列出HDFS上的所有目录,可以使用如下命令(其中-R表示递归):
hdfs dfs -ls -R /
下面,可以使用如下命令创建一个input目录:
hdfs dfs –mkdir input
在创建个input目录时,采用了相对路径形式,实际上,这个input目录创建成功以后,它在HDFS中的完整路径是“/user/hadoop1/input”。如果要在HDFS的根目录下创建一个名称为input的目录,则需要使用如下命令:
hdfs dfs -mkdir /input
可以使用rm命令删除一个目录,比如,可以使用如下命令删除刚才在HDFS中创建的“/input”目录(不是“/user/hadoop/input”目录):
./bin/hdfs dfs –rm –r /input
上面命令中,“-r”参数表示如果删除“/input”目录及其子目录下的所有内容,如果要删除的一个目录包含了子目录,则必须使用“-r”参数,否则会执行失败。
2.文件操作
在实际应用中,经常需要从本地文件系统向HDFS中上传文件,或者把HDFS中的文件下载到本地文件系统中。
首先,使用vim编辑器,在本地Linux文件系统的“/home/hadoop1/”目录下创建一个文件myLocalFile.txt,里面可以随意输入一些单词,比如,输入如下三行:
Hello World!
This is my first day to hadoop ecosystem!
I’m so exciting!
然后,可以使用如下命令把本地文件系统的“/home/hadoop/myLocalFile.txt”上传到HDFS中的当前用户目录的input目录下,也就是上传到HDFS的“/user/hadoop1/input/”目录下:
hdfs dfs -put /home/hadoop1/myLocalFile.txt input
可以使用ls命令查看一下文件是否成功上传到HDFS中,具体如下:
hdfs dfs -ls input
Found 1 items
-rw-r–r-- 1 hadoop1 supergroup 82 2022-03-17 20:33 input/myLocalFile.txt
下面使用如下命令查看HDFS中的myLocalFile.txt这个文件的内容:
./bin/hdfs dfs –cat input/myLocalFile.txt
下面把HDFS中的myLocalFile.txt文件下载到本地文件系统中的“/home/hadoop/下载/”这个目录下,命令如下:(友情提示,具体下载到哪个文件夹下读者可以自己选择,中文版的home目录下为“下载”文件夹)
hdfs dfs -get input/myLocalFile.txt /home/hadoop1/Downloads
可以使用如下命令,到本地文件系统查看下载下来的文件myLocalFile.txt:
cd ~
cd Downloads
ls
cat myLocalFile.txt
最后,了解一下如何把文件从HDFS中的一个目录拷贝到HDFS中的另外一个目录。比如,如果要把HDFS的“/user/hadoop/input/myLocalFile.txt”文件,拷贝到HDFS的另外一个目录“/input”中(注意,这个input目录位于HDFS根目录下),可以使用如下命令:
hdfs dfs -cp input/myLocalFile.txt /input
二、利用Web界面管理HDFS
打开Linux自带的Firefox浏览器,点击此链接HDFS的Web界面(http://localhost:50070/),即可看到HDFS的web管理界面。
这里我们做一个测试。首先在hdfs的user/hadoop1目录下创建lab3文件夹,再上传任意一个文件。
cd /usr/local/hadoop-2.10.1/etc/hadoop
hdfs dfs -mkdir ./lab3
hdfs dfs -put core-site.xml ./lab3
hdfs dfs -ls -R ./
按照下图的操作,找到我们在hdfs上的lab3文件夹,进而点击core-site.xml文件名,观察分块情况。
可以看到,上传的core-site.xml文件只占用了一个block。接下来,我们上传hadoop的tar包(或者任意大于1M)的文件,用-D参数指定blocksize并观察分块情况。建议blocksize=104857600。
hdfs dfs -D dfs.blocksize=104857600 -put hadoop-2.10.1.tar.gz ./lab3
从Web页面我们可以看到,此时存储hadoop-2.10.1.tar.gz的block size已经由默认的128MB变为100MB。所以大家要牢记104857600!!!
从下图我们可以看出,事实上,这个tar包的体积较大,需要四个block来保存,最后的block3没有用完
三、利用Java API与HDFS进行交互
Hadoop不同的文件系统之间通过调用Java API进行交互,上面介绍的Shell命令,本质上就是Java API的应用。下面提供了Hadoop官方的Hadoop API文档,想要深入学习Hadoop,可以访问如下网站,查看各个API的功能。
利用Java API进行交互,需要利用软件Eclipse编写Java程序。
四、参考资料
http://dblab.xmu.edu.cn/blog/290-2/