【Hadoop】(二)hdfs的知识点总结

前言

Hadoop分布式文件系统(HDFS)被设计成适合运行在通用硬件(commodity hardware)上的分布式文件系统。它和现有的分布式文件系统有很多共同点。但同时,它和其他的分布式文件系统的区别也是很明显的。HDFS是一个高度容错性的系统,适合部署在廉价的机器上。HDFS能提供高吞吐量的数据访问,非常适合大规模数据集上的应用。

一、hdfs的优点

  • 高容错
    数据自动保存多个副本。某一个副本丢失以后,可以自动恢复。
  • 适合处理大数据
    hdfs专为处理大数据而生,能够处理数据规模达到GB、TB甚至PB级别的数据;能够处理百万规模以上的文件数量。
  • 应用成本低廉
    普通机器就可以支持hadoop,对配置要求不高。

二、hdfs的缺点

  • 不适合处理低延时的需求,比如毫秒级数据存储

  • 不适合处理小文件
    一个文件至少要占用namenode 150字节的空间,namenode是有限的,大量小文件会吃光namenode的内存

  • 不支持并发写入和文件修改,=
    hdfs只允许一个线程写入数据,不允许多个线程同时写入;文件可以追加,但是不能修改

三、hdfs的组成架构

在这里插入图片描述

HDFS采用master/slave架构。一个HDFS集群是由一个Namenode和一定数目的Datanodes组成。Namenode是一个中心服务器,负责管理文件系统的名字空间(namespace)以及客户端对文件的访问。集群中的Datanode一般是一个节点一个,负责管理它所在节点上的存储。HDFS暴露了文件系统的名字空间,用户能够以文件的形式在上面存储数据。从内部看,一个文件其实被分成一个或多个数据块,这些块存储在一组Datanode上。Namenode执行文件系统的名字空间操作,比如打开、关闭、重命名文件或目录。它也负责确定数据块到具体Datanode节点的映射。Datanode负责处理文件系统客户端的读写请求。在Namenode的统一调度下进行数据块的创建、删除和复制。

1)NameNode(nn)

NameNode是hdfs中一个非常重要的组件,在我看来就像部门的leader一样。一个hdfs集群只有一个活着的NameNode(Active NameNode)。主要负责:

  • 管理元数据信息(name)
  • 管理文件的副本信息(replicas)
  • 处理客户端的读写请求
  • 管理数据块的映射信息(block)

2)DataNode(nn)

DataNode在hdfs集群中可以有很多个,同时也可以自由扩展,主要负责:

  • 数据存储
  • 数据块读写
  • 数据备份

3)Client

hdfs对外暴露的客户端,主要负责:

  • 数据切分。
  • 与NameNode交互,获取文件的存储位置
  • 与DataNode交互,读取或写入文件
  • 提供命令来管理hdfs,比如NameNode的初始化
  • 提供命令来操作hdfs,比如对数据的增删改查

4)Secondary NameNode

Secondary NameNode不是NameNode的备用节点,主要负责:

  • 辅助NameNode定时整合Fsimage文件和Edits文件,并汇报给NameNode

四、hdfs的block、packet、chunk

1)block

  • block:文件上传需要切块,这个块就是block,1.x默认64M,2.x默认128M,由dfs.block.size参数控制。块太大,Map任务数太少,执行速度会很慢;块太小,会增加寻址时间。一般情况下不用更改这个配置,如果磁盘传输速度非常好,可以增大块的大小,同理,也可以减小。
  • packet:它是client端向DataNode,或DataNode的PipLine之间传数据的基本单位,默认64KB,由参数dfs.write.packet.
  • chunk:它是client向DataNode,或DataNode的PipLine之间进行数据校验的基本单位,默认512Bytes,由参数io.bytes.per.checksum控制

五、hdfs的block的大小为什么设置为128M

HDFS中平均寻址时间大概为10ms,经过前人的大量测试,发现寻址时间为传输时间的1%时,为最佳状态。 所以最佳传输时间为10ms/0.01=1000ms=1s,目前磁盘传输速度普遍为100M/s,所以hdfs的block设置为128M。
注:实际生产中,如果磁盘速率为200M/s时,block设置为256M。

六、hdfs的读流程

在这里插入图片描述

  • 客户端发送请求,调用DistributedFileSystem API的open方法发送请求到Namenode,获得block的位置信息
  • NameNode返回所有的block信息给客户端。
  • 客户端拿到block的位置信息后调用FSDataInputStream API的read方法并行的读取block信息
  • DataNode向输入流中中写数据,并以packet为单位来校验
  • 关闭输入流

七、hdfs的写流程

在这里插入图片描述

  • Client获取HDFS的文件输出流,NameNode收到请求后,会做校验,通过namenode会根据文件的具体信息来做文件切块,并将切块分配信息返回给Client
  • Client收到分配信息后,会将文件切成一个一个的packet发送给对应的DataNode
  • DataNode收到数据会发送给上游一个ack,直到最上游的DataNode收到ack发送给Client
  • 4.写入完毕,关流

八、Secondary NameNode

在NameNode运行的过程中,会产生两个文件来记录相关操作和元数据信息:

  • fsimage - 它是在NameNode启动时对整个文件系统的快照
  • edit logs - 它是在NameNode启动后,对文件系统的改动序列

Secondary NameNode的作用就是辅助NameNode定时整合Fsimage文件和Edits文件,流程图如下:
在这里插入图片描述
1.NameNode新生成一个edits.new记录合并期间的操作
2.将edits和fsimage文件通过网络拷贝到Secondarynamenode上
3.Secondary NameNode加载编辑日志和镜像文件到内存并合并生成新的fsimage.ckpt文件
4.把fsimage.ckpt拷贝回NameNode
5.重命名edits.new为edits文件,重命名fsimage.ckpt为fsimage

Secondary NameNode参数配置:
fs.checkpoint.period表示多长时间记录一次hdfs的镜像。默认是1小时。fs.checkpoint.size表示一次记录多大的size,默认64M。

八、Hadoop HA

详情参考Hadoop技术之Hadoop HA 机制详解

九、安全模式

hadoop安全模式

  • 在分布式文件系统启动的时候,开始的时候会有安全模式,当分布式文件系统处于安全模式的情况下,文件系统中的内容不允许修改也不允许删除,直到安全模式结束。安全模式主要是为了系统启动的时候检查各个DataNode上数据块的有效性,同时根据策略必要的复制或者删除部分数据块。运行期通过命令也可以进入 安全模式。在实践过程中,系统启动的时候去修改和删除文件也会有安全模式不允许修改的出错提示,只需要等待一会儿即可。
  • NameNode在启动的时候首先进入安全模式,如果datanode丢失的block达到一定的比例(1- dfs.safemode.threshold.pct),则系统会一直处于安全模式状态即只读状态。 dfs.safemode.threshold.pct(缺省值0.999f)表示HDFS启动的时候,如果DataNode上报的block个数达到了 元数据记录的block个数的0.999倍才可以离开安全模式,否则一直是这种只读模式。如果设为1则HDFS永远是处于SafeMode。
  • 修改dfs.safemode.threshold.pct为一个比较小的值,缺省是0.999。
  • hadoop dfsadmin -safemode leave命令强制离开

十、hadoop之小文件处理

详情参考Hadoop 小文件处理

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值