任务描述
本关任务:使用Hadoop命令来操作分布式文件系统。
相关知识
为了完成本关任务你需要了解的知识有:1.HDFS的设计,2.HDFS常用命令。
HDFS的设计
分布式文件系统
客户:帮我保存一下这几天的数据。
程序猿:好嘞,有多大呢?
客户:1T。
程序猿:好没问题,买个硬盘就搞定了。
一个月后...
客户:帮我保存下这几个月的数据。
程序猿:好嘞,这次有多大呢?
客户:1024T。
程序猿:哇,这么大吗?没有这么大的硬盘买呀,而且好像也没听过一台计算机可以存放1024T的数据。
程序猿:哦,对了我可以部署1024台机器,然后将他们连接起来,让他们的数据可以共享,这不就可以了吗?hh,机智如我。
当数据集的大小超过一台独立的物理计算机的存储能力时,就有必要对它进行分区并存储到若干台单独的计算机上,管理网络中跨多台计算机存储的文件系统称为分布式文件系统(Distributed FileSystem)。
Hadoop自带一个称为HDFS的分布式文件系统,即HDFS(Hadoop Distributed FileSystem)。有时也称之为DFS,他们是一回事儿。
NameNode与DataNode
HDFS的构建思路是这样的:一次写入,多次读取,不可修改,这也是最高效的访问模式。
客户:你把1024台机器都组成了分布式文件系统,我要查数据,下载数据该怎么做呢?
程序猿:我准备了一套专门管理这些数据的工具,叫做namenode,您要查数据直接访问它就可以啦。
HDFS有两类节点用来管理集群的数据,即一个namenode(管理节点)和多个datanode(工作节点)。namenode管理文件系统的命名空间,它维护着系统数及整棵树内所有的文件和目录,这些信息以两个形式永久保存在本地磁盘上:命名空间镜像文件和编辑日志文件,namenode也记录着每个文件中各个块所在的数据节点信息,但它并不永久保存块的位置信息,因为这些信息会在系统启动时根据节点信息重建。
客户端(client)代表用户通过与namenode和datanode交互来访问整个系统。客户端提供一个类似POSIX(可移植操作系统界面)的文件系统结构,因此用户编程时无需知道namenode和datanode也可以实现功能。
datanode是文件系统的工作节点,他们根据需要存储并检索数据块(blocks),并且定期向namenode发送他们所存储的数据块的列表。
客户:听不懂,说人话!
程序猿:额,我们现在将咱们的大数据机房设想成一个大仓库,仓库很大,有一本账单记录着仓库所有货架的商品,每一个货架上都放了很多货物,不过这些货物有一个特点,即大小都一致,并且货架也有一个本货架的清单,记录着本货架的商品,每当货架中的货物有变动,这个清单也会一起变,并且还会记录在主清单中。
在这里,namenode就类似仓库的主账单(保存了所有货物的记录),datanode就像是货架的清单(保存了本货架的物品记录),每个货架上的每一个货物就是数据块,数据块的大小是固定的(默认是128M)。
HDFS的常用命令
接下来我们来了解一下一些常用的文件系统操作,例如:读取文件,新建目录,移动文件,删除数据,列出目录,等等。你可以在命令行中输入hadoop fs -help 命令读取每个命令的详细帮助文件。
现在请跟着我一起,在Linux环境下对Hadoop进行文件系统操作,来体验一下Hadoop的使用。
新建目录:
在本地和hadoop中分别创建文件夹:
本地创建目录:
hadoop创建目录:
上传文件至dfs:
切换到本地input目录下,创建文件并添加数据:hello hadoop。
将该文件上传至hadoop:使用hadoop fs -put <要上传的文件> 命令。
查看上传到HDFS的文件:
移动与删除
列出HDFS中的目录和文件:
将helloworld.txt移动到根目录;
删除helloworld.txt;
hadoop fs -rm 命令只能删除文件或者空文件夹,如果要用这个命令去删除非空文件夹就会非常麻烦。
和Linux中递归删除一致,我们在-rm之后加入一个-r即可,用-rmr也可。
下表列出了Hadoop常用的shell命令,在之后使用的时候可以作为参考。
选项名称 | 使用格式 | 含义 |
-ls | -ls <路径> | 查看指定路径的当前目录结构 |
|-lsr |-lsr <路径> | 递归查看指定路径的目录结构| |-du |-du <路径> | 统计目录下个文件大小| |-dus |-dus <路径> | 汇总统计目录下文件(夹)大小| |-count| -count [-q] <路径> | 统计文件(夹)数量| |-mv |-mv <源路径> <目的路径> | 移动| |-cp |-cp <源路径> <目的路径> | 复制| |-rm |-rm [-skipTrash] <路径> | 删除文件/空白文件夹| |-rmr |-rmr [-skipTrash] <路径> | 递归删除| |-put |-put <多个 linux 上的文件> | 上传文件 |-copyFromLocal| -copyFromLocal <多个 linux 上的文件> | 从本地复制| |-moveFromLocal |-moveFromLocal <多个 linux 上的文件> | 从本地移动| |-getmerge |-getmerge <源路径> | 合并到本地| |-cat |-cat | 查看文件内容| |-text |-text | 查看文件内容| |-copyToLocal |-copyToLocal [-ignoreCrc] [-crc] [hdfs 源路径] [linux 目的路径] | 从HDFS复制到本地| |-moveToLocal |-moveToLocal [-crc] | 从HDFS移动到本地| |-mkdir |-mkdir | 创建空白文件夹| |-setrep | -setrep [-R] [-w] <副本数> <路径> | 修改副本数量| |-touchz | -touchz <文件路径> | 创建空白文件|
编程要求
在右侧命令行中启动Hadoop,进行如下操作。
在HDFS中创建/usr/output/文件夹;
在本地创建hello.txt文件并添加内容:“HDFS的块比磁盘的块大,其目的是为了最小化寻址开销。”;
将hello.txt上传至HDFS的/usr/output/目录下;
删除HDFS的/user/hadoop目录;
将Hadoop上的文件hello.txt从HDFS复制到本地/usr/local目录。
hadoop fs -mkdir /usr hadoop fs -mkdir /usr/output touch hello.txt vim hello.txt hadoop fs -put hello.txt /usr/output hadoop fs -rmr /user/hadoop hadoop fs -copyToLocal /usr/output/hello.txt /usr/local
测试说明
平台会查看你本地的文件和HDFS
的文件是否存在,如果存在,则会将其内容输出到控制台。
预期输出:
HDFS的块比磁盘的块大,其目的是为了最小化寻址开销。
HDFS的块比磁盘的块大,其目的是为了最小化寻址开销。
开始你的任务吧,祝你成功!