- HDFS重要特性
- HDFS shell操作
- HDFS工作流程与机制
HDFS重要特性
主从架构(master/slave)
- 一个NameNode,多个DataNode
- 机架(Rack)
分块存储
- 物理上分块,默认128M
- 块大小可通过配置参数规定,参数位于
hdfs-defalut.xml
中:dfs.blocksize
副本机制
- 文件的所有block都有副本
- 由参数dfs.replication控制,默认值是3,也就是额外备份2份
元数据记录
文件自身属性信息
文件块位置映射信息
抽象统一的目录树结构(namespace)
- 层次性文件组织结构
- NameNode负责维护
- 客户端通过路径来访问文件,如:
hdfs://namenode:port/dir-a/dir-b/dir-c/file.data
数据块存储
- 各个block的具体存储管理由DataNode节点承担
HDFS架构
HDFS shell操作
1 | hadoop fs -ls file:/// #操作本地文件系统 |
ps:hdfs dfs
= hadoop fs
创建文件夹
hadoop fs -mkdir [-p] <path>
查看指定目录下内容
hadoop fs -ls [-h] [-R] [<path> ...]
-h 人性化显示size
-R 递归查看目录及其子目录
上传文件到HDFS指定目录下
hadoop fs -put [-f] [-p] <localsrc> ... <dst>
-f 覆盖目标文件(已存在下)
-p 保留访问和修改时间,所有权和权限
localsrc 本地文件系统(客户端所在机器)
dst 目标文件系统(HDFS)
hadoop fs -cat <src>
hadoop fs -tail <src>
下载文件到本地系统指定目录
hadoop fs -get [-f] [-p] <src> ... <localdst>
hadoop fs -cp [-f] <src> ... <dst>
追加数据到HDFS文件中
hadoop fs -appendToFile <localsrc> ... <dst>
将所有给定本地文件的内容追加到给定dst文件
dst如果文件不存在,则创建该文件
如果
<localSrc>
为-,则输入为从标准输入中读取hadoop fs -mv <src> ... <dst>
HDFS工作流程与机制
角色构成
主角色:NameNode
NameNode维护和管理文件系统元数据,包括namespace、文件和块的位置信息、访问权限等信息(不存储实际数据块)
NameNode是访问HDFS的唯一入口
NameNode所在机器通常会配置有大量内存(RAM)
NameNode是Hadoop集群中的单点故障
NameNode内部通过内存和磁盘文件两种方式管理元数据
其中磁盘上的元数据文件包括Fsimage内存元数据镜像文件和edits log(Journal)编辑日志
从角色:DataNode
DataNode负责具体的数据块存储,其数量决定了HDFS集群的整体数据存储能力
DataNode启动时,会将自己注册到NameNode并汇报自己负责持有的块列表
DataNode所在机器通常配置有大量的硬盘空间
主角色辅助角色:secondarynamenode
Secondary NameNode充当NameNode的辅助节点
帮助NameNode进行元数据文件的合并动作
写数据流程
HDFS客户端创建对象实例DistributedFileSystem,该对象中封装了与HDFS文件系统操作的相关方法
调用DistributedFileSystem对象的create()方法,通过RPC请求NameNode创建文件
- NameNode执行克重检查判断:目标文件是否存在、父目录是否存在、客户端是否具有创建该文件的权限。检查通过,NameNode就会为本次请求记下一条记录,返回FSDataOutputStream输出流对象给客户端用于写数据
客户端通过FSDataOutputStream输出流开始写入数据
客户端写入数据时,将数据分成一个数据包(packet 默认64k),内部组件DataStreamer请求NameNode挑选出适合存储数据副本的一组DataNode地址,默认是3副本存储
DataStreamer将数据包流式传输到pipeline的第一个DataNode,该DataNode存储数据包并将它发送到pipeline的第二个DataNode。同样,第二个DataNode存储数据包并且发送给第三个(即最后一个)时DataNode
传输的反方向上,会通过ACK机制消炎数据包传输是否成功
客户端完成数据写入后,在FSDataOutputStream输出流上调用close()方法关闭
DistributedFieSystem联系NameNode告知其文件写入完成,等待NameNode确认
因为namenode已经知道文件由哪些块组成(DataStream请求分配数据块),因此仅需等待最小复制块即可成功返回
最小复制是由参数dfs.namenode.replication.min指定,默认是1
基础支撑
Pipeline管道(HDFS数据传输方式)
ACK应答响应(确保数据传输安全)
默认三副本存储策略(不能把所有副本放在一台机器上)
由BlockPlacementPolicyDefault指定
第一块副本:优先客户端本地,否则随机
第二块副本:不同于第一块副本的不同机架
第三块副本:第二块副本相同机架不同机器