举个例子学习什么是HDFS及相关配置
HDFS形象性描述:
本关任务:使用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
的文件:
移动与删除
列出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 上的文件> <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
目录。
测试说明
平台会查看你本地的文件和HDFS
的文件是否存在,如果存在,则会将其内容输出到控制台。
预期输出:
HDFS的块比磁盘的块大,其目的是为了最小化寻址开销。
HDFS的块比磁盘的块大,其目的是为了最小化寻址开销。