浅谈HDFS

一、HDFS的设计特点

     1.大数据文件

     2.文件分块存储

     3.流式数据访问,一次写入多次读写

      4.不支持动态改变文件内容,而是要求让文件一次写入就不做变化,要变化也只能在文件末添           加内容

      5.廉价硬件

      6.硬件故障

      7.利用DMA引擎的零拷贝技术进行文件的传输和同步

          DMA:将一个内存区从一个设备复制到另一个。当中央处理器初始化这个传输动作,传输                         动作本身是由DMA控制器来实行和完成。

         零拷贝技术:磁盘文件拷贝到PageCache然后拷贝到网卡

二、HDFS的关键元素

     1.Block:将一个文件进行分块,通常是64M。

     2.NameNode:保存整个文件系统的目录信息、文件信息以及分块信息,这是由唯一一台主机专门保存,如果主NameNode失效,启动备用主机运行NameNode

     3.DataNode:分布在廉价的计算机上,用于存储Block块文件

三、HDFS的运行原理

     1.NameNode和DataNode节点初始化完成后,采用RPC进行信息交换,采用的机制是心跳机制,即DataNode节点定时向NameNode反馈状态信息,反馈信息如:是否正常、磁盘空间大小、资源消耗情况等信息,以确保NameNode知道DataNode的情况;

     2.Namen会将子节点的相关元数据信息缓存在内存汇总,对于文件与Block块的信息会通过fslmage和edits文件方式持久化在磁盘上,以确保NameNode知道文件各个块的相关信息;

     3.NameNode负责存储fslmage和edits元数据信息,但fslmage和edits元数据文件需要定期进行合并,这时则由SecondNameNode进程对fslmage和edits文件进行定期合并,合并好的文件再次交给NameNode存储。

四、HDFS数据合并原理

     1.NameNode初始化时会产生一个edits文件和一个fsimage文件,edits文件用于记录操作日志,比如文件的删除或添加等操作信息,fsImage用于存储文件与目录对应的信息以及edits合并进来的信息,即相当于fsimage文件在这里是一个总的元数据文件,记录着所有的信息;

     2.随着edits文件不断增大,当达到设定的一个阀值的时候,这时SecondaryNameNode会将edits文件和fsImage文件通过采用http的方式进行复制到SecondaryNameNode下(在这里考虑到网络传输,所以一般将NameNode和SecondaryNameNode放在相同的节点上,这样就无需走网络带宽了,以提高运行效率),同时NameNode会产生一个新的edits文件替换掉旧的edits文件,这样以保证数据不会出现冗余;

     3.SecondaryNameNode拿到这两个文件后,会在内存中进行合并成一个fsImage.ckpt的文件,合并完成后,再通过http的方式将合并后的文件fsImage.ckpt复制到NameNode下,NameNode文件拿到fsImage.ckpt文件后,会将旧的fsimage文件替换掉,并且改名成fsimage文件。

五、HDFS写原理

     1.HDFS客户端提交写操作到NameNode上,NameNode收到客户端提交的请求后,会先判断此客户端在此目录下是否有写权限,如果有,然后进行查看,看哪几个DataNode适合存放,再给客户端返回存放数据块的节点信息,即告诉客户端可以把文件存放到相关的DataNode节点下;

     2.客户端拿到数据存放节点位置信息后,会和对应的DataNode节点进行直接交互,进行数据写入,由于数据块具有副本replication,在数据写入时采用的方式是先写第一个副本,写完后再从第一个副本的节点将数据拷贝到其它节点,依次类推,直到所有副本都写完了,才算数据成功写入到HDFS上,副本写入采用的是串行,每个副本写的过程中都会逐级向上反馈写进度,以保证实时知道副本的写入情况;

     3.随着所有副本写完后,客户端会收到数据节点反馈回来的一个成功状态,成功结束后,关闭与数据节点交互的通道,并反馈状态给NameNode,告诉NameNode文件已成功写入到对应的DataNode。

六、HDFS读原理

     1.HDFS客户端提交读操作到NameNode上,NameNode收到客户端提交的请求后,会先判断此客户端在此目录下是否有读权限,如果有,则给客户端返回存放数据块的节点信息,即告诉客户端可以到相关的DataNode节点下去读取数据块;

     2.客户端拿到块位置信息后,会去和相关的DataNode直接构建读取通道,读取数据块,当所有数据块都读取完成后关闭通道,并给NameNode返回状态信息,告诉NameNode已经读取完毕。

七、分块存储

HDFS中文件在物理上是分块存储,通过dfs.blocksize配置,2.x之后的版本默认128M

  • HDFS中文件在逻辑上是连续的,提供一个文件目录树
  • block块大小计算
  1. 理想寻址时间为10ms
  2. 理想读取文件时间为寻址时间的10%
  3. 市面上磁盘的存储速率为100M/s
  4. 因此block块大小:10ms/10% *100M/s = 100M -> 128M

  八、安全模式

     安全模式是HDFS所处的一种特殊状态,在这种状态下,文件系统只接受读数据请求,而不接受创建、删除、修改等变更请求。同时会对数据块进行大量校验,导致资源的分配和申请耗时远超预期。

     在NameNode主节点启动时,HDFS首先进入安全模式,DataNode在启动的时候会向namenode汇报可用的block等状态,当整个系统达到安全标准时,HDFS自动离开安全模式。如果HDFS处于安全模式下,则文件block不能进行任何的副本复制操作,hdfs集群刚启动的时候,默认30S钟的时间是出于安全期的,只有过了30S之后,集群脱离了安全期,然后才可以对集群进行操作

九、MapReduce 核心思想

MapReduce实现分布式计算分成2个阶段

     第一个阶段MapTask并发实例,完全并行运行,互不干扰

     第二个阶段ReduceTask并发实例,完全并行运行,数据依赖上一个阶段所有MapTask并发实例输出

     MapReduce编程模型只能包含一个Map阶段一个Reduce阶段,但可以实现多个MapReduce串行运行

十、MapReduce 进程

     MrAppMaster:负责整个程序的过程调度及状态协调

     MapTask:负责Map阶段整个数据处理流程

     ReduceTask:负责Reduce阶段整个数据处理流程

十一、Namenode 故障后,如何恢复

方法一:将 SecondaryNameNode 中数据拷贝到 namenode 存储数据的目录;

     1.删除namenode存储的数据(/home/hadoop/hadoop_tmp/dfs/name/*)

rm -rf /home/hadoop/hadoop_tmp/dfs/name/*

     2.把secondarynamenode中的数据拷到原namenode存储数据目录

            scp -r  hadoop@hadoop102:/home/hadoop/hadoop_tmp/dfs/namesecondary/* /home/hadoop/hadoop_tmp/dfs/name/*                                                                                      

     3、重新启动namenode (在启动之前可以删除目录下的锁文件)

hadoop-daemon.sh start namenode

方法 二: 使用 -importCheckpoint 选项 启动 namenode 守 护 进 程 , 从 而 将SecondaryNameNode 中数据拷贝到 namenode 目录中。

1.修改hdfs-site.xml文件:

<property>
<name>dfs.namenode.checkpoint.period</name>
<value>120</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/home/hadoop/hadoop_tmp/dfs/name</value>
</property>

2.删除namenode存储的数据(/home/hadoop/hadoop_tmp/dfs/name/*)

  rm -rf /home/hadoop/hadoop_tmp/dfs/name/*

3.将secondarybamenode  存储数据的目录拷贝到 namenode 存储数据的平级目录,并删除锁文件in_use.lock文件  

scp -r hadoop@hadoop102:/home/hadoop/hadoop_tmp/dfs/namesecondary/* /home/hadoop/hadoop_tmp/dfs/name/*

rm -rf in_use.lock

4.导入检查点数据

hdfs namenode -importCheckpoint

5.启动namenode

hadoop-daemon.sh start namenode

 十二、防止namenode挂掉的办法?

   集群高可用。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值