hdfs是hadoop的分布式文件系统,它是一个高容错性的系统,适合部署在廉价的机器上,hdfs能够提供高吞吐量的数据访问,非常适合大规模数据集的应用.
优点:
- 高容错性
数据自动保存为多个副本,它是通过增加副本的形式提高容错性的.
某一副本丢失以后,它可以自动恢复(即重新再创建副本). - 适合处理大数据
数据规模:能够处理数据规模达到GB,TB,甚至PB级别的数据
文件规模:能够处理百万规模以上的文件数量,数量相当之大. - 可以构建在廉价机器上.
缺点:
- 不适合低延迟数据访问,比如毫秒级的存储数据
- 无法高效的对大量小文件进行存储.
存储小文件的话,它会占用NameNode大量的内存来存储目录和块信息.
小文件存储的寻址时间会超过读取时间.
hdfs的架构
概念介绍:
- NameNode 就是master ,它是一个主管,管理者.
(1) 管理HDFS的名称空间;
(2) 配置副本策略;
(3) 管理数据块的映射信息;
(4)处理客户端读写请求; - DataNode 就是slave NameNode 下达命令,DataNode执行实际的操作
- Client 就是客户端
(1) 文件切分.文件上传HDFS的时候,client将文件切分成一个一个的Block,然后进行上传;
(2) 与NameNode交互,获取文件的位置信息;
(3)与DataNode交互,读取或者写入数据;
(4) Client提供一个命令来访问HDFS 比如对HDFS增删改查 - Secondary NameNode 并非NameNode的热备,当NameNode挂掉的时候,它并不能马上替换NameNode并提供服务.
(1) 辅助NameNode 分担其工作量,比如定期合并Fsimage和Edits,并推送给NameNode
fsimage和edits的作用见此链接fsimage和edits
将faimage转化为xml的语法
hdfs oiv -p XML fsimage_000000000000 -i fsimage_000000000000 -o f.xml
将edits转化为xml
hdfs oev -p XML -i edits_inprogress_0000000000001 -o edit.xml
HDFS块大小.
HDFS中的文件在物理上是分块存储,块的大小可以通过配置参数(dfs.blocksize)来规定.默认大小为128M
HDFS的常用命令格式
hadoop fs -(shell命令)
大致格式就是上面这样
设置文件副本数
hadoop fs -setrep 文件路径/文件
HDFS的写流程
场景: 客户端要将200M的文件上传到集群.
- 首先向NameNode请求上传文件/usr/local/a.avi
- NameNode向客户端响应可以上传文件
- 请求上传一个个Block,(0-128M) 请返回datanode
- namenode 返回可以存储的dn1,dn2,dn3节点,表示这三个节点可以存储数据
- 客户端与dn1,dn2,dn3 建立block传输通道,然后等待各个节点应答
- 节点应答成功
- 开始向节点按照链式的形式进行传输并在每个节点上存储相同的block数据.(即副本)
- 存储成功后客户端向namenode 通知传输完成.
HDFS读数据流程
场景: 客户端要在集群中下载/usr/local/a.avi
- 创建分布式文件系统并向namenode请求下载/usr/local/a.avi
- namenode 返回目标文件的元数据
- 客户端创建输入流并根据传递来的元数据向节点请求去读block1,和block2,
- 节点开始传输数据(注:在读取不同节点获取块的时候,是现在一个节点上读取数据完毕之后,关闭流之后再读取节点2)
网络拓扑 节点距离的计算
同一节点上的进程为0
同一机架上的不同节点
同一数据中心上的不同机架上的节点
不同数据中心上的节点
副本的存储策略
第一个副本在client所处的节点上,如果客户端在集群外,随机选一个
第二个副本和第一个副本位于相同机架上,随机节点
第三个副本位于不同机架,随机节点.
NameNode 和SecondaryNameNode
NameNode中的元数据存储在哪里
元数据存储在内存中,但是如果只存储在内存中,一旦断电,元数据丢失,整个集群就无法工作了,因此需要在磁盘中备份元数据FsImage.每当有元数据有更新或者添加元数据时,修改内存中的元数据并追加到Edits(只进行追加操作)中.
长时间添加数据到edits中,回导致文件数据越来越大,效率降低而且一旦断电回复元数据需要的时间过长.
NameNode工作机制
- 客户端要对集群上的/usr/local/a.avi进行操作
- NameNode首先将操作记录在编辑日志中,然后在内存中进行操作.
- secondary Namenode 首先请求是否需要checkpoint,(checkpoint操作的意义就是将编辑日志和镜像文件合并并序列化到镜像文件中)
checkpoint触发的条件: 定时时间到 edits中的数据满了. - secondary namenode 请求执行checkpoint
- 滚动正在写的编辑日志,并创建新的文件编辑日志2,之后的操作就记录在编辑日志2中,
- 将滚动好的编辑日志和镜像文件复制到secondary namenode 中,并在secondary namenode中加载到内存中进行合并 并生成最新的fsimage.checkout
- 将fsimage.checkout拷贝回namenode中,并将名字改为fsimage,
checkpoint时间设置
参数 dfs.namenode.checkpoint.period 时间限制
参数 dfs.namenode.checkpoint.txns 操作次数限制 如何检测次数到了操作次数限制 即要定时的检查次数 设置属性dfs.namenode.checkpoint.check.period 设置 一般设置为一分钟
设置的文件是hdfs-site.xml
NameNode故障处理
方法1:将secondaryNameNode中数据拷贝到NameNode存储数据的目录中
- kill -9 namenode进程
- 删除掉namenode 存储的数据 文件位置 hadoop目录下/data/tmp/dfs/name/*
- 拷贝SecondaryNamenode的数据到原namenode存储目录中
scp -r root@hadoop2.sofency.top:/opt/soft/hadoop-2.7.7/data/tmp/dfs/namesecondary/* /opt/soft/hadoop-2.7.7/data/tmp/dfs/name/*
- 重新启动namenode
hadoop-daemon.sh start namenode
方法2:使用-importCheckpoint 选项启动NameNode 守护进程,从而将secondaryNameNode中的数据拷贝到NameNode目录中
- 先修改checkpoint的时间尽量缩短
dfs.namenode.checkpoint.period设置值为120 - kill -9 namenode进程
- 删除namenode存储的数据
- 如果SecondaryNameNode不和NameNode在一个主机节点上,需要将SecondaryNameNode存储的数据拷贝到namenode存储的数据的评级目录,并同时删除secondarynamenode 中的in_use.lock文件
- 执行命令导入检查点数据
bin/hdfs namenode -importCheckpoint
- 启动namenode
sbin/hadoop-daemon.sh start namenode
集群安全模式
- NameNode 启动
NameNode 启动时,首先将镜像文件(FsImage) 载入内存,并执行编辑日志(Edits)中各项操作,一旦在内存中成功建立文件系统元数据的映像,则创建一个新的FsImage文件和一个空的编辑日志.此时NameNode开始监听DataNode请求.这个过程期间,NameNode一直运行在安全模式即NameNode的文件系统对于客户端来说是只读的 - DataNode启动
系统中的数据块的位置并不是由NameNode维护的,而是以块列表的形式存储在DataNode中,在系统正常操作期间,NameNode会在内存中保留所有块位置的映射信息,在安全模式下,各个DataNode会向NameNode发送最新的块列表信息,NameNode了解到足够多的块位置信息之后,即可高效运行文件系统. - 安全模式退出判断
如果满足最小副本条件,NameNode会在30秒之后就退出安全模式,所谓的最小副本条件指的是在整个文件系统中99.9%的块满足最小副本级别(默认值 dfs.namenode.min=1) 在启动一个刚刚格式化的HDFS集群时,因为系统中还没有任何块,所以NameNode不会进入安全模式
安全模式的基本命令
bin/hdfs dfsadmin -safemode get 查看安全模式状态
bin/hdfs dfsadmin -safemode enter 进入安全模式
bin/hdfs dfsadmin -safemode leave 离开安全模式
bin/hdfs dfsadmin -safemode wait 等待安全模式
NAMENODE多目录配置
操作文件: hdfs-site.xml
<!--设置多目录-->
<property>
<name>dfs.namenode.dir</name>
<value>file:///${hadoop.tmp.dir}/dfs/name1,file:///${hadoop.tmp.dir}/dfs/name2</value>
</property>
重新格式化namenode
hadoop fs namnode -format
DataNode工作机制
- DataNode 启动后向NameNode 注册
- NameNode返回注册成功的信息
- 以后每周期(1小时)上报所有块的信息
- 心跳每3s一次,心跳返回结果带有Namenode给DataNode的命令
- 超过10分钟没有收到DataNode的心跳则认为该节点不可用
掉线时限参数设置
namnode和datanode之间要进行通讯,如果突然datanode进程死亡或者网络通信故障无法与namnode通信,namnode不会把datanode判定为死亡,要经过一段时间,这段时间暂称作超时时长.
HDFS 默认的超时时长为10分钟+30秒
超时时间的计算公式为
TimeOut=2*dfs.namenode.heartbeat.recheck-interval + 10 * dfs.heartbeat.interval.
默认值
dfs.namenode.heartbeat.recheck-interval 大小为5分钟, 检测过期时间
dfs.heartbeat.interval默认为3秒 检测数据节点是否可以进行计算
可以在hdfs-site.xml中设置
添加白名单
添加到白名单的主机节点,都允许访问NameNode,不在白名单的主机节点,都会被退出
配置白名单的具体步骤:
- 在NameNodede 中的hadoop文件下 etc/hadoop/下创建dfs.hosts文件
添加主机的节点名字
hadoop101
hadoop102
- 在hdfs-site.xml配置文件中添加dfs.hosts属性
<property>
<name>dfs.hosts</name>
<value>dfs.hosts文件的路径</value>
</property>
- 在集群中的每个节点上都配置下
- 刷新节点 hdfs dfsadmin -refreshNodes
添加黑名单
- 在NameNode的hadoop目录下的etc/hadoop目录下创建dfs.hosts.exclude文件
- 同上添加集群的节点信息
- 同样在hdfs-site.xml中添加配置文件
<property>
<name>dfs.hosts.exclude</name>
<value>dfs.hosts.exclude文件的路径</value>
</property>
- 刷新ResourceManager
hdfs dfsadmin -refreshNodes
yarn rmadmin -refreshNodes
HDFS新特性
-
集群件数据拷贝
scp -r 文件 目标用户@目标ip:/目录/文件
如果两台主机没有进行ssh的配置的话
使用distcp命令实现集群间拷贝
bin/hadoop dsitcp hdfs://hadoop1:9000/usr/local/hello.txt hdfs://hadoop2:9000/usr/local/hello.txt
-
小文件归档
hdfs存储小文件的弊端,每个块的元数据存储在namenode的内存中,因此hdfs存储小文件会非常的低效,因为大量的小文加你会耗尽namnode中大部分内存,但注意,存储小文件磁盘容量和数据块的的大小无关,例如一个1M的文件设置为128M的块存储,实际使用的是1MB的磁盘控件,而不是128M实操:
- 启动yarn
- 归档文件 把/usr/local/input目录下的所有文件归档到一个input.har的归档文件中,并把归档后的文件存放到/usr/local/output/路径下
bin/hadoop archive -archiveName input.har -p /usr/local/input /usr/local/output
- 查看归档命令
hadoop fs -ls -R har:///usr/local/output/input.har
显示归档的小文件 - 解归档文件
hadoop fs -cp har:///usr/local/output/input.har/* /usr/local
-
快照管理
快照相当于对目录做一个备份,并不会立即复制所有的文件,而是指向同一个文件,当写入发生时,才会产生新文件,类似于虚拟机的快照设置,新版本的快照信息基于原信息,但是新的数据加入时会记录在当前的快照上.
快照的常用命令
hdfs dfsadmin -allowSnapshot /路径 开启快照
hdfs dfsadmin -disableSnapshot 路径 禁用快照
hdfs dfs -createSnapshot 路径 对目录创建快照
hdfs dfs -createSnapshot 路径 名字 对创建的快照起名字
hdfs dfs -renameSnapshot 路径 旧名称 新名称 重命名快照
hdfs dfs lsSnapshottableDir 列出当前用户所有可快照的目录
hdfs snapshotDiff 路径1 路径2 比较两个快照目录的不同之处
hdfs dfs -deleteSnapshot删除快照