HDFS编程实践

接下来介绍Linux操作系统中关于HDFS文件操作的常用Shell命令,利用Web界面查看和管理Hadoop文件系统,以及利用Hadoop提供的Java API进行基本的文件操作。

在学习HDFS编程实践前,我们需要启动Hadoop。执行如下命令,开启 NaneNodeDataNode 守护进程。

启动时可能会有 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命令方式。

  1. hadoop fs
  2. hadoop dfs
  3. 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的功能。

Hadoop API文档

利用Java API进行交互,需要利用软件Eclipse编写Java程序。

四、参考资料

http://dblab.xmu.edu.cn/blog/290-2/

  • 3
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值