Hadoop基础知识——HDFS篇

HDFS

1.1 原理及组成

NameNode:管理文件系统的namespace,这些信息以镜像文件(FsImage)和日志文件(EditLog)永久保存在磁盘上。文件与block的映射信息和块所在数据节点的信息保存在内存中,它不是永久保存的,系统重启时会消失。

DataNode: 负责存储client发来的数据块block;执行数据块的读写操作
在这里插入图片描述

【注】fsimage文件不会描述datanode,数据块的位置并不是由namenode维护的,它以块列表的形式存放在datanode中,在正常操作期间nn会在内存中保留所有块的映射信息。在安全模式下,各个datanode会向nn发送最新的块位置信息。

​fsck命令检查HDFS中文件的健康状况
balancer均衡器命令:start-balancer.sh,集群中只能运行一个均衡器并且在后台运行,为了降低干扰可以设置不同节点复制数据的带宽,可以在hdfs-site.xml中的dfs.balance.bandwidthPerSec设置

1.2 文件读取过程

在这里插入图片描述
1)客户端通过DistributedFileSystem(会给客户端返回一个输入流对象)向NameNode请求下载文件,NameNode通过查询元数据,找到文件块所在的DataNode地址。

2)挑选一台DataNode(就近原则,按照集群拓扑结构得出 DataNode 与客户端的距离,然后进行排序 )服务器,通过对输入流调取read()方法请求读取数据

3)DataNode开始传输数据给客户端(从磁盘里面读取数据输入流,以packet为单位来做校验)。

4)客户端以packet为单位接收,先在本地缓存,然后写入目标文件。

5)当第一个块读取完毕后关闭输入流,寻找下一个块的最佳datanode

读容错机制:当客户端向NN寻求某个数据时,NN会发送一组存储该数据的DN,若某个DN存在问题,会标记该节点并跳过该DN读取数据的其他副本。

1.3 文件写入过程

在这里插入图片描述

  1. Clinet首先将要存储的数据切分成若干数据包,然后向NameNode发送存储请求,
  2. NameNode检查权限、存储文件是否已存在等信息,确认无误后返回允许存储的响应,这个响应还包括第一个Block要放在哪个DataNode地址的信息。
  3. Clinet得到NameNode的响应,打开文件输出流,向第一个DataNode请求打开管线,DN1接受信息后继续通知DN2,DN2接受到DN1的信息后通知DN3,DN3接受到信息后确认没有更多副本了,向DN2返回响应信息,DN2获取到DN3的响应后向DN1返回响应,DN1得到响应后向Clinet返回响应
  4. Clinet获得响应后,确认pipeline(管线,管线上每个节点都能收到相同的数据流)已开通,开始写入数据。 packet数据包在pipeline上依次传输,在pipeline反方向上,逐个发送ack(命令正确应答),最终由pipeline中第一个DataNode节点将pipelineack发送给client
  5. clinet确认block1完成传输后,向NameNode发送请求,确认block1已存入,NN更新自己的Fsimage,并返回block2的存储地址
  6. 重复,直到所有block都存入。

写容错机制:在写数据之前,NN会向所有DataNode发送数据包(64kb),DN接收到数据包会对NN作出回应表明数据已经存储完毕。若没有响应,NN会跳过该节点。????

为何HDFS的块会设置的很大?

​ 最小化寻址开销, 减少管理块的数据开销,每个块都需要在NameNode上有对应的记录。实际开发中块的大小会远大于128M。

1.4 第二名称节点

为了防止NameNode的单点失效,加入一个2NN,2NN一般部署在一台新的机器上

具体过程

​ 1. 2NN会定期和NameNode通信,请求其停止使用EditLog文件,暂时将新的写操作写到一个新的文件edit.new上来,这个操作是瞬间完成,上层写日志的函数完全感觉不到差别

​ 2. 2NN通过HTTP GET方式从NameNode上获取到FsImage和EditLog文件,并下载到本地的相应目录下

​ 3. 2NN将下载下来的FsImage载入到内存,然后一条一条地执行EditLog文件中的各项更新操作,使得内存中的FsImage保持最新;这个过程就是EditLog和FsImage文件合并
4. 2NN执行完(3)操作之后,会通过post方式将新的FsImage文件发送到NameNode节点上
5. NameNode将从2NN接收到的新的FsImage替换旧的FsImage文件,同时将edit.new替换EditLog文件,通过这个过程EditLog就变小了。
6. 执行过程中集群处于安全模式:namenode启动时,首先将fsimage载入内存并执行edits文件中的各项操作。此时namenode处于安全模式,客户端对于nn只可以只读
在这里插入图片描述

1.5 HA机制

在这里插入图片描述

出现原因

Hadoop1.0的2NN不能实现热备份 (系统处于运转状态下的备份)。所以Hadoop2.0引入HA机制。

运行机制

在HA集群中,一般设置两个NN,其中一个处于“活跃(Active)”状态,另一个处于“待命(Standby)”状态。处于Active状态的NN负责对外处理所有客户端的请求,处于Standby状态的NN作为热备份节点,保存了足够多的元数据,在Active节点发生故障时,立即切换到活跃状态对外提供服务。

通过使用ZooKeeper实现热备份:Standby NN会一直监听该系统,一旦发现有新的写入,就立即从公共存储系统中读取这些数据并加载到自己内存中,从而保证与Active NN状态一致。 需要给DN配置Active和Standby两个NN的地址实现故障快速切换。

要保证在任何时刻都只有一个NN处于Active状态,避免脑裂

1.6 Federation机制

在这里插入图片描述

出现原因

​ 单机namenode的瓶颈大约是在4000台集群,而后则需要使用联邦机制

​ HA机制无法解决NN的可扩展性、系统性能和隔离性

运行机制

Federation是指HDFS集群可使用多个独立的NameSpace(NameNode节点管理)来满足HDFS命名空间的水平扩展这些NameNode分别管理一部分数据,且共享所有DataNode的存储资源。

当DN与NN建立联系并开始会话后自动建立Block Pool。每个block都有一个唯一的表示,在HDFS集群之间都是惟一的,为以后集群归并创造了条件。

1.7常用命令

上传文件:hdfs dfs -put /本地路径 /hdfs路径

下载文件到本地:hdfs dfs -get /hdfs路径 /本地路径

创建文件夹:hdfs dfs -mkdir /hello

创建多级文件夹:hdfs dfs -mkdir -p /hello/world

移动hdfs文件:hdfs dfs -mv /hdfs路径 /hdfs路径

复制hdfs文件:hdfs dfs -cp /hdfs路径 /hdfs路径

删除hdfs文件:hdfs dfs -rm /aa.txt

删除hdfs文件夹:hdfs dfs -rm -r /hello

查看hdfs中的文件: hdfs dfs -cat /文件

查看文件夹中有多少个文件hdfs dfs -count /文件夹

查看hdfs的总空间:hdfs dfs -df /

修改副本数:hdfs dfs -setrep 1 /a.txt

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值