HDFS是hadoop实现的一个分布式文件系统。(Hadoop Distributed File System)来源于Google的GFS论文。它的设计目标有:
- 非常巨大的分布式文件系统。
- 运行在普通廉价的硬件上,及一般的 PC机(相比于小型机,单片机而言的)。
- 易扩展,为用户提供性能不错的文件存储服务。
HDFS的架构
HDFS架构示意图
1.HDFS采用了1个 Msater(NameNode) 和N个slaves(DataNode)的架构
一个HDFS集群包含一个NameNode,主要职责是管理文件系统的元数据信息,控制客户端对文件的访问。
一个HDFS集群包含多个DataNode,通常一个节点就是一个DataNode,负责相应节点上文件的存储。
NameNode的作用
- 负责客户端请求的响应
- 维护整个文件系统的目录树(例如记录文件的增删改查操作)和负责元数据(文件名称、副本系数,文件和block的映射,DataNode和block的映射等)的管理
DataNode的作用
- 存储文件对应的数据块,存储数据是核心作用
- 定期向NameNode发送心跳信息,汇报本身及其所有block信息和健康状况
- 执行来自NameNode的指示,如block的创建,删除,复制,文件读写请求的支持等
典型的部署架构是1个NameNode + N个DataNode。
2.HDFS文件系统的命名空间和多副本机制
HDFS文件系统和现有的Linux文件系统类似,也具有目录的层级结构。同样可以进行文件和目录的创建删除移动重命名的操作。
一个文件会被拆分成多个Block,(默认的blocksize:128M)。这些Block会复制多份,存储在多个DataNode上。除了最后一个block,其他的块都是一样大小的,应用程序可以指定文件的副本系数。副本系数可以在文件创建之初指定,也可以之后再进行修改。下图是一个多副本存储的示例说明。
HDFS多副本存储机制
以part-1为例,它被分成三个block,block_id分别是2,4,5,且副本系数为3。可以看到在DataNode上,2,4,5都各存储在了三个节点上,这样当其中一个节点故障时,仍然能够保证文件的可用。
block_id存在的必要性在于,在用户需要对文件进行操作时,相应的block能够按顺序进行“组合”起来。
HDFS Shell的操作
我们来使用命令操作HDFS,常用命令的含义和Linux shell差不多,格式是hadoop fs -[linux shell]
命令行操作:有两种类型:
(1)普通操作命令: hdfs dfs ******
命令
-mkdir:在HDFS上创建目录
hdfs dfs -mkdir /aaa
hdfs dfs -mkdir /bbb/ccc
如果父目录不存在,使用-p参数先创建父目录
-ls 查看HDFS的某个目录
-ls -R 查看HDFS的某个目录,包含子目录
简写: -lsr
-put 上传数据
-copyFromLocal 上传数据
-moveFromLocal 上传数据,相当于ctrl+x
-copyToLocal 下载数据
-get 下载数据
举例: hdfs dfs -get /input/data.txt .
-rm: 删除目录
-rmr: 删除目录,包括子目录
hdfs dfs -rmr /bbb
日志:
17/12/08 20:32:10 INFO fs.TrashPolicyDefault: Namenode trash configuration: Deletion interval = 0 minutes, Emptier interval = 0 minutes.
Deleted /bbb
-getmerge:把某个目录下的文件,合并后再下载
-cp:拷贝 hdfs dfs -cp /input/data.txt /input/data2.txt
-mv:移动 hdfs dfs -cp /input/data.txt /aaa/a.txt
-count: 举例:hdfs dfs -count /students
-du: 类似-count,信息更详细
hdfs dfs -du /students
例子:
[root@bigdata11 ~]# hdfs dfs -count /students
1 2 29 /students
[root@bigdata11 ~]# hdfs dfs -ls /students
Found 2 items
-rw-r--r-- 1 root supergroup 19 2017-12-08 20:35 /students/student01.txt
-rw-r--r-- 1 root supergroup 10 2017-12-08 20:35 /students/student02.txt
[root@bigdata11 ~]# hdfs dfs -du /students
19 /students/student01.txt
10 /students/student02.txt
-text、-cat: 查看文本的内容
hdfs dfs -cat /input/data.txt
balancer:平衡操作
hdfs balancer
(2)管理命令:hdfs dfsadmin ******
-report: 打印HDFS的报告
举例:hdfs dfsadmin -report
-safemode:安全模式
hdfs dfsadmin -safemode
Usage: hdfs dfsadmin [-safemode enter | leave | get | wait]
[root@bigdata11 ~]# hdfs dfsadmin -safemode get
Safe mode is OFF
[root@bigdata11 ~]# hdfs dfsadmin -safemode enter
Safe mode is ON
[root@bigdata11 ~]# hdfs dfs -mkdir /dddd
mkdir: Cannot create directory /dddd. Name node is in safe mode.
[root@bigdata11 ~]# hdfs dfsadmin -safemode leave
Safe mode is OFF
1.ls
用法:
hadoop fs -ls directory
,表示查看HDFS上directory目录下的文件信息
实战:
hadoop fs -ls / #表示查看HDFS上根目录下的文件信息,如果没有上传过文件到HDFS,则不会输出任何文件信息
HDFS的ls命令
2.put
用法:
hadoop fs -put file directory
,表示将本地的file文件上传到HDFS的directory目录中
实战:
#将本次的hello.txt上传到hdfs中根目录下并查看是否上传成功hadoop fs -put hello.txt /#hello.txt是在当前本地目录下的一个已经创建好的文件hadoop fs -ls /
HDFS的put命令
3.cat
用法:
hadoop fs -cat filepath/file
,表示查看hdfs上filepath下的file文件的内容。hadoop fs -text filepath/file
也可以达到相同的效果。
实战:
hadoop fs -cat /hello.txt#查看HDFS上根目录下hello.txt的文件内容
HDFS的cat命令
4.mkdir
用法:
hadoop fs -mkdir directory
,表示在hdfs上创建directory目录。
hadoop fs -mkdir -p directory1/directory2
,表示在hdfs上递归创建directory1/directory2目录。
实战:
hadoop fs -mkdir /test #表示在hdfs上根目录下创建test目录hadoop fs -ls /
HDFS的mkdir命令
hadoop fs -ls /testhadoop fs -mkdir -p /test/a/b #在hdfs上test目录下递归创建a目录/b目录。-p表示递归创建hadoop fs -ls /testhadoop fs -ls /test/a
HDFS的mkdir -p 命令
hadoop fs -ls -R /#递归展示hdfs根目录下的内容
HDFS的ls -R命令
5.copyFromLocal
用法:
hadoop fs -copyFromLocal file1 filepath/file2
表示将本地的file文件copy到HDFS的filepath中并命名为file2
实战:
hadoop fs -copyFromLocal hello.txt /test/a/b/h.txt#将本地hello.txt copy为HDFS上目录/test/a/b/下的h.txt文件hadoop fs -ls -R
HDFS的copyFromLocal命令
hadoop fs -text /test/a/b/h.txt#也可以用-cat代替
HDFS的text命令
6.get
用法:
hadoop fs -get filepath/file1
表示将HDFS上filepath下的file1复制到本地并命名为file2
实战:
hadoop fs -get /test/a/b/h.txt
HDFS的get命令
7.rm
用法:
hadoop fs -rm filepath/file
表示将HDFS上filepath下的file文件删除
hadoop fs -rm -R directory
表示将HDFS上directory目录删除
实战:
hadoop fs -rm /hello.txt#删除hdfs根目录下的hello.txthadoop fs -ls -R /hadoop fs -rm -R /test#删除hdfs根目录下的test目录hadoop fs -ls -R /
HDFS的rm命令
tips:使用hadoop fs 回车
可以查看命令的帮助信息,遇到不会的可以随时查询。
通过浏览器直观查看HDFS文件
在环境搭建那一节中,我们通过浏览器验证了HDFS搭建成功。其实在浏览器中我们也可以看到HDFS中有哪些具体的文件。上一部分我们把HDFS上的内容删光了,因此我们先在HDFS上创建几个目录和文件。
hadoop fs -put hello.txt /hadoop fs -mkdir /dir1hadoop fs -put ../software/hadoop-2.6.0-cdh5.7.0.tar.gz /hadoop fs -ls /
使用命令查看HDFS的文件
通过浏览器查看HDFS的文件
访问http://localhost:50070可以验证HDFS是否启动成功,点击Browse the file system
可以看到我们上传的两个文件和一个文件夹。
点击文件名称可以看到Block信息,可以看到,block size是128M,因此一个297M的文件被分割成了3个block。
总结
本文我们学习了HDFS的架构和HDFS的命令操作。
架构方面,HDFS采用的是1个NameNode+N个DataNode的方式,各司其职,共同实现了分布式的文件系统,具有容易扩展的优点。通过对文件拆分成多Block并进行多副本存储的形式,保证了负载均衡和可靠性,同时便于进行并行处理,提高了计算效率。
HDFS操作方面,hadoop fs 后面跟常用的linux命令即可实现对HDFS的操作,很容易理解。如果遇到困难,可以直接敲hadoop fs 回车查看帮助信息。
参考文档
https://blog.csdn.net/nihaoa50/article/details/88419432
https://www.cnblogs.com/mayundalao/p/11799787.html