(5、1)hadoop之HDFS:文件管理系统

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 继续读。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值