这一小节我们来学习: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发送他们所存储的数据块的列表。
image.png
客户:听不懂,说人话!
程序猿:额,我们现在将咱们的大数据机房设想成一个大仓库,仓库很大,有一本账单记录着仓库所有货架的商品,每一个货架上都放了很多货物,不过这些货物有一个特点,即大小都一致,并且货架也有一个本货架的清单,记录着本货架的商品,每当货架中的货物有变动,这个清单也会一起变,并且还会记录在主清单中。
在这里,namenode就类似仓库的主账单(保存了所有货物的记录),datanode就像是货架的清单(保存了本货架的物品记录),每个货架上的每一个货物就是数据块,数据块的大小是固定的(默认是128M)。
image.png
HDFS的常用命令
接下来我们来了解一下一些常用的文件系统操作,例如:读取文件,新建目录,移动文件,删除数据,列出目录,等等。你可以在命令行中输入hadoop fs -help
命令读取每个命令的详细帮助文件。
现在请跟着我一起,在Linux环境下对Hadoop进行文件系统操作,来体验一下Hadoop的使用。
新建目录:
在本地和hadoop中分别创建文件夹:
本地创建目录:
image.png
hadoop创建目录:
image.png
上传文件至dfs:
切换到本地input
目录下,创建文件并添加数据:hello hadoop
image.png
将该文件上传至hadoop:使用hadoop fs -put <要上传的文件> <hdfs目录>
命令
image.png
查看上传到HDFS的文件:
image.png
移动与删除
列出HDFS中的目录和文件:
image.png
image.png
将helloworld.txt
移动到根目录;
image.png
删除helloworld.txt
;
image.png
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 上的文件> <hdfs 路径> | 上传文件 |
-copyFromLocal | -copyFromLocal <多个 linux 上的文件><hdfs 路径> | 从本地复制 |
-moveFromLocal | -moveFromLocal <多个 linux 上的文件><hdfs 路径> | 从本地移动 |
-getmerge | -getmerge <源路径> <linux 路径> | 合并到本地 |
-cat | -cat <hdfs 路径> | 查看文件内容 |
-text | -text <hdfs 路径> | 查看文件内容 |
-copyToLocal | -copyToLocal [-ignoreCrc] [-crc] [hdfs 源路径] [linux 目的路径] | 从HDFS复制到本地 |
-moveToLocal | -moveToLocal [-crc] <hdfs 源路径> <linux目的路径> | 从HDFS移动到本地 |
-mkdir | -mkdir <hdfs 路径> | 创建空白文件夹 |
-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
目录。
未完待续...
作者:MasterXiao
链接:https://www.jianshu.com/p/7db116cd76d7
共同学习,写下你的评论
评论加载中...
作者其他优质文章