一、HDFS的基础架构
NameNode:
- HDFS系统的主角色,是一个独立的进程
- 负责管理HDFS整个文件系统
- 负责管理DataNode
DataNode:
- HDFS系统的从角色,是一个独立的进程
- 主要负责数据的存储,即存入数据和取出数据
SecondaryNameNode:
- NameNode的辅助,是一个独立进程
- 主要帮助NameNode完成元数据整理工作
二、HDFS存储原理
1. 分布式存储,将数据放在多个服务器中,并行处理读写
2. 设定统一的管理单位,Block块,最小存储单位,每个256MB
3. 副本机制,每个块的副本放在别的服务器上,增加容错
三、 NameNode元数据
Edits文件:记录了HDFS中的每一次操作,以及本次操作影响的文件及其对应的Block
FsImage文件:对Edits文件的合并,记录了文件及其对应的Block的最终信息
NameNode基于Edits和FSImage的配合,完成整个文件系统文件的管理:
1. 每次对HDFS的操作,均被Edits文件记录
2. Edits文件达到大小上线后,开启新的Edits记录
3. 定期进行Edits的合并操作
- 如当前没有FsImage文件,将全部Edits合并为第一个FsImage
- 如当前已存在FsImage文件,将全部Edits和已存在的FsImage进行合并,形成新的FsImage
SecondaryNameNode会通过http从NameNode拉取数据(edits和fsimage),然后合并完成后提供给NameNode使用
四、HDFS数据的读写流程
数据写入流程
1. 客户端向NameNode发起请求
2. NameNode审核权限、剩余空间后,满足条件允许写入,并告知客户端写入的DataNode地址
3. 客户端向指定的DataNode发送数据包
4. 被写入数据的DataNode同时完成数据副本的复制工作,将其接受的数据分发给其他的DataNode
5. DataNode以管道的方式一个接一个将数据副本复制到所有的DataNode节点上
6. 写入完成客户端通知NameNode,NameNode做元数据记录工作
关键点:
- NameNode不负责数据写入,只负责元数据的记录和权限审批
- 客户端直接向1台DataNode写数据,这个DataNode一般是离客户端最近(网络距离)的那一个
- 数据块副本的复制工作,由DataNode之间自行完成(构建一个管道,按顺序复制分发)
数据读取流程
1. 客户端向NameNode申请读取某文件
2. NameNode判断客户端权限等细节后,允许读取,并返回此文件的Block列表
3. 客户端拿到Block列表后自行寻找DataNode读取即可
关键点:
- 数据同样不通过NameNode提供
- NameNode提供的Block列表,会基于网络距离计算尽量提供离客户端最近的
五、HDFS常用命令
--启动hdfs集群
start-dfs.sh
--关闭hdfs集群
stop-dfs.sh
--单进程启停,单独控制所在机器的进程启停
hdfs --daemon (start|status|stop) (namenode|secondarynamenode|datanode)
--创建文件夹
hdfs dfs -mkdir [-p] <path> ...
--查看指定目录下的内容
hdfs dfs -ls [-h] [-R] [<path> ...]
--上传文件到HDFS指定目录下
hdfs dfs -put [-f] [-p] <localsrc> ... <dst>
--查看HDFS文件内容
hdfs dfs -cat <src> ...
--读取大文件可以使用管道符配合more实现分页
hdfs dfs -cat <src> | more
--下载HDFS文件
hdfs dfs -get [-f] [-p] <src> ... <localdst>
--拷贝HDFS文件
hdfs dfs -cp [-f] <src> ... <dst>
--追加数据到HDFS文件中
hdfs dfs -appendTofile <localsrc> ... <dst>
--HDFS数据移动操作
hdfs dfs -mv <src> ... <dst>
--HDFS数据删除操作
hdfs dfs -rm -r [-skipTrash] URI [URI ...]
1291

被折叠的 条评论
为什么被折叠?



