文章目录
1:HDFS简介
1.1:HDFS 设计思路
1、 大文件被切割成小文件,使用分而治之的思想让很多服务器对同一个文件进行联合管理
2、 每个小文件做冗余备份,并且分散存到不同的服务器,做到高可靠不丢失
1.2:HDFS 架构
Namenode:主节点集群老大,一个集群只能有一个。
掌管文件系统目录树,文件块元数据,接受客户端读写请求并分发
SecondaryNamenode:严格说并不是 namenode 备份节点,
主要给 namenode 分担压力之用
Datanode:从节点,存储整个集群所有数据块,处理真正数据读写
- namenode:
1、负责客户端请求(读写数据请求)的响应
2、维护目录树结构(元数据的管理:查询,修改)
3、配置和应用副本存放策略
4、管理集群数据块负载均衡问题负责管理文件块元数据信息
NameNode 存储 block 数目是有限的,一个 block块元信息消耗大约 150 byte 内存,存储 1 亿个 block,大约需要 20GB 内存
如果一个文件大小为 10K,则 1 亿个文件大小仅为 1TB(但要消耗掉 NameNode 20GB内存)
namenode对于文件的管理,对文件的更新操作都会先写入EditLog 文件日志中,后将 EditLog 中的所有事务应用于 FsImage 文件管理日志中。
架构的优缺点:
- 优点:单namenode模式简化了系统设计
- 缺点:单namenode模式使得存储空间有限所以不适合存储小文件
- 整个文件系统的吞吐量受限于namenode的性能瓶颈
1.3:HDFS 优缺点和面试题
-
1:HDFS 优点:
可构建在廉价机器上:通过多副本提高可靠性,提供了容错和恢复机制
高容错性:数据自动保存多个副本,副本丢失后,自动恢复
适合批处理:移动计算而非数据,数据位置暴露给计算框架
适合大数据处理:GB、TB、甚至 PB 级数据,百万规模以上的文件数量,10K+节点规模
流式文件访问:一次性写入,多次读取,保证数据一致性 -
2:HDFS 缺点
低延迟数据访问
比如毫秒级
低延迟与高吞吐率
小文件存取
占用 NameNode 大量内存 150b* 1000W = 15E,1.5G
寻道时间超过读取时间
并发写入、文件随机修改
一个文件只能有一个写者
仅支持 append
不适合存储小文件
- 3:为什么hdfs块比磁盘块大:因为磁盘是按照扇区划分的,文件系统的最小存储单位是块,块大于磁盘块能减少寻址时间和次数提高吞吐量。
1.4:HDFS 安全模式
- 1:正常启动的时候进入安全的原因
原理:namenode 的内存元数据中,包含文件路径、副本数、blockid,及每一个 block 所在datanode 的信息,而 fsimage 中,不包含 block 所在的 datanode 信息,那么,当 namenode冷启动时,此时内存中的元数据只能从 fsimage 中加载而来,从而就没有 block 所在的datanode 信息——>就会导致 namenode 认为所有的 block 都已经丢失——>进入安全模式— —>datanode 启动后,会定期向 namenode 汇报自身所持有的 blockid 信息,——>随着datanode 陆续启动,从而陆续汇报 block 信息,namenode 就会将内存元数据中的 block 所 在 datanode 信息补全更新——>找到了所有 block 的位置,从而自动退出安全模式
- 2:安全模式常用操作命令
hdfs dfsadmin -safemode leave //强制 NameNode 退出安全模式
hdfs dfsadmin -safemode enter //进入安全模式
hdfs dfsadmin -safemode get //查看安全模式状态
hdfs dfsadmin -safemode wait //等待,一直到安全模式结束
1.5:HDFS 副本存放策略
在多数情况下,HDFS 默认的副本系数是 3
Hadoop 默认对 3 个副本的存放策略如下图:其中 Block1,Block2,Block3 分别表示 Block的三个副本:
1:第一个 block 副本放在和 client 所在的 node 里
2:第二个副本放置不与第一副本同机架上
3:第三个副本和第二个在同一个机架,随机放在不同的 node 中。
1.6:负载均衡
机器与机器之间磁盘利用率不平衡是 HDFS 集群非常容易出现的情况,尤其是在 DataNode 节点出现故障或在现有的集群上增添新的 DataNode 的时候,分析数据块分布和重新均衡 DataNode 上的数据分布的工具
命令:sbin/start-balancer.sh
sbin/start-balancer.sh -threshold 5
自动进行均衡非常慢,一天能移动的数据量在 10G-10T 的级别,很难满足超大集群的需求
原因:HDFS 集群默认不允许 balance 操作占用很大的网络带宽,这个带宽是可以调整的
hdfs dfsadmin -setBalanacerBandwidth newbandwidth
hdfs dfsadmin -setBalanacerBandwidth 10485760
该数值的单位是字节,上面的配置是 10M/s,默认是 1M/s
2:HDFS的shell操作
使用hadoop fs 或者hdfs dfs命令操作hdfs文件管理系统,操作和操作linux文件系统类似。
命令查看:hadoop fs -help
列出文件:hadoop fs -ls
创建目录:hadoop fs -mkdir -p /aa/bb -p若父目录不存在也会创建
统计文件大小:hadoop fs -du -sh /path
拉取hdfs文件到本地:Hadoop fs -get /path localpath
和复制命令一样 hadoop fs -cp /user/hadoop/file1 /user/hadoop/file2
文件校验:hadoop fs -checksum [-v] URI
修改文件权限:hadoop fs -chmod [-R] URL -r是递归
修改文件用户:hadoop fs -chown [-R] [OWNER][:[GROUP]] URI
对文件进行计数:hadoop fs -count [-h] [-v] path
显示文件大小:hadoop fs -du -sh path
查看存储空间大小:hadoop fs -df [-h] URI
3:hdfs的数据读写流程
3.1:写数据
客户端要向 HDFS 写数据,首先要跟 namenode 通信以确认可以写文件并获得接收文件 block的 datanode,然后,客户端按顺序将文件逐个 block 传递给相应 datanode,并由接收到 block的 datanode 负责向其他 datanode 复制 block 的副本
1、 client 发写数据请求
2、 namenode 相应请求,然后做一系列校验,如果能上传该数据,则返回该文件的所有切块应该被存在哪些 datanode 上的 datanodes 列表blk-001:hadoop02 hadoop03
3、 client 拿到 datanode 列表之后,将写请求给datanode开始传数据
4、 首先写第一块 blk-001,写完成后 blk-001 传到
hadoop02 hadoop02 传hadoop03 上
5、 用传第一个数据块同样的方式传其他的数据块
6、 当所有的数据块都传完之后,client 会给 namenode 返回一个状态信息,表示数据已全部写入成功,或者是失败的信息
7、 namenode 接收到 client 返回的状态信息来判断当次写入数据的请求是否成功,如果成功,就需要更新元数据信息
对于写入过程的一致性和数据可见性:
调用hflush() (一致性刷新)方法后,数据被写入 DataNode 的内存中,可保证对所有 Reader 可见。
调用 hsync() 方法后,数据就会被写到磁盘上;
3.2:读数据
客户端将要读取的文件路径发送给 namenode,namenode 获取文件的元信息(主要是 block的存放位置信息)返回给客户端,客户端根据返回的信息找到相应 datanode 逐个获取文件的 block 并在客户端本地进行数据追加合并从而获得整个文件
1、使用 HDFS 提供的客户端 Client,向远程的 namenode 发起 RPC 请求;
2、namenode 会视情况返回文件的全部 block 列表,对于每个 block,namenode 都会返回有该 block 拷贝的 datanode 地址;
3、客户端Client会选取离客户端最近的datanode来读取block;如果客户端本身就是datanode,那么将从本地直接获取数据;
4、读取完当前 block 的数据后,关闭当前的 datanode 链接,并为读取下一个 block 寻找最佳的 datanode;
5、当读完列表 block 后,且文件读取还没有结束,客户端会继续向 namenode 获取下一批的block 列表;
6、读取完一个 block 都会进行 checksum 验证,如果读取 datanode 时出现错误,客户端会通知 namenode,然后再从下一个拥有该 block 拷贝的 datanode 继续读。