导图社区 HDFS架构和配置
干货分享!大数据HDFS介绍! 下图清晰地梳理了伪分布式搭建、完全分布式搭建、java客户端操作HDFS、写流程、读流程等内容的脉络。跟着本图一起学习,零基础也能轻松入门!
编辑于2019-12-18 14:36:36HDFS架构
Namenode
元数据
元数据非常重要,是查找文件位置的依据
包含文件名(路径) 、大小、所属组、权限、修改日期
文件block块大小、block副本数、block列表信息
元数据的持久化
1.why: 元数据存储在内存中,速度快,可以高并发,但内存很危险,容易丢失数据
2. how 持久化
fsimage(镜像文件) 根据 edits.log日志文件,保存 NameNode的最终操作后的状态,相当于虚拟机拍照
fsimage 不存储 block位置信息,在hadoop集群重启时,这些信息会由DataNode 通过心跳发送到NameNode
edits.log (日志) 用户每次访问元数据,都会追加到日志文件中 注意是追加
如何指定NN在哪个节点(服务器)上 core-site.xml fs.defaultFS hdfs://node1:9000
SecondaryNameNode
NameNode中的元数据 非常宝贵 不能丢失 但元数据在内存中 内存不可靠 因此需要持久化(在内存中要注意 一旦断电就会消失 所以要实现持久化 ) 1.fdimage文件 (镜像文件) 2. 日志文件 两个现元数据的持久化 集群停掉 重启后 日志文件会复制 生成fdimage文件 根据fdimage文件 Namenode可以重新构建元数据信息。 一旦datanode的数据发生修改后,镜像文件和日志文件会更新并合并。
周期性合并 fsimage 和 edits.log 文件, 保证fsimage 是NN的最新状态的镜像,同时 清空 log 文件,避免 log存放过多数据。 正确理解 ‘合并’的意思,是把NN的新的日志信息 也在镜像中实现。
如果edits.log文件 过大,运行时只是日志追加,并不会有什么问题,但重启集群时会花费很长时间
合并的过程
1. SNN 通知NN要进行合并了
2. NN将edits.log 文件重命名,同时生成一个空的edits.log文件用于当前使用
3. SNN 通过HTTP GET 方式下载fsimge 重命名后的日志文件
4. SNN 首先将fsimage 加载到自己的内存,然后执行日志中的记录
5. 执行结束,将新的fsimage写入磁盘中,此时的fsimage 就是原来的fsimage +日志文件
6. 新的fsimage 推送给NN (HTTP PUT)
7. NN 使用新的fsimage
如何指定SNN在哪个节点(服务器)上? hdfs-site.xml dfs.namenode.secondary.http-address node2:50090
Client 读、写、切割文件
切割文件,在上传文件存储(写数据)时,例如将1T大小的文件,按照128M大小分成若干小份,并不时物理切割,而是逻辑切割,即 每读取128M,就写出,而不是真的分成若干小份。
写数据时,客户端切割文件,创建元数据给NameNode,返回得到可存储的节点位置---》DataNode的管线信息,然后开始写入到DataNode中
读数据时,客户端请求NameNode,查找一个文件的元数据,若存在,返回block块的位置信息,若不存在则报错
datanode 储存数据块 与namenode保持心跳
每3秒发送一次心跳
心跳功能: 1.图中 颜色相同的数据 是一样的,是保存的副本。保证数据不会丢失 (丢失一块 整个数据就不能用了) 有服务器Down机的话 可以迅速根据NameNode 中的清单 复制出一份Down机上的数据 保证相同的数据有3份 2. 每3秒 DataNode 向 NameNode 汇报 发送心跳(自身的数据信息) 告诉namenode 自己处在alive状态 可能因为网络 也可能因为宕机。 发现有服务器联系不上后 10分钟后开始2中的复制操作。 3.负载均衡 不让某一个服务器负载很多block
10分钟 NN没有收到心跳,则认为该DataNode宕机;该节点的数据在其他节点中也有备份,根据备份数据复制出一份到其他节点
如何指定DataNode 在哪个节点(服务器)上运行? slaves中添加服务器IP地址/主机名字
java客户端操作HDFS
实现eclipse java命令实现大文件分割上传,多服务器储存
安装插件后可以实现HDFS本地化读取,上传下载,建删文件夹非常方便
HA
解决NameNode单点故障
主要+ 备用NN
解决内存受限的问题
联邦 水平扩展 支持多个NN。所有NN共享DN,每个NN分管部分元数据
HA集群搭建
1. hadoop配置
2. zookeeper集群
3.启动hadoop
4.zookerper操作
5.停止集群
读流程
客户端请求说:NN妹妹,请帮我查看一下A文件的信息
NN回复:这个文件分成3个block,每个有3个副本,现在我指导你按顺序找。已经发你block1的3个副本的位置,你自己选择去读吧,读完再来找我
客户端说:我找到了离我最近的block1,请求发送block2的位置
NN回复:好的,请按照上述流程,依次读取block2,block3
客户端回复:我读取A文件完毕,还是NN妹妹给力,元数据在你这太方便了。
写流程
1.客户端客户端切割文件(比如按照128M进行逻辑切割,不是真的切,而是每读128M转发出一个block),创建元数据给NN,询问在哪些data数据能够存储我的block数据块,NN根据需求回复 能够储存block的 DN列表,这些datanode 组成管线,可以认为是一个团队,取名N1
2. 每个block块,分成64K的小包,形成信息传递队列,依次向指定的DN传递,如果副本数设定为3,并不是要传递3次,而是数据从客户端上传到DN1后,链式向DN2传递,再向DN3传递,DN3接收完毕后 返回确认队列到DN2,依次返回到DN1,再向上返回。 信息传递队列:客户端->dn1->dn2->dn3 信息确认队列: dn3->dn2->dn1->上一级
3.确认队列中的数据 同本节点接收的数据是一样的,对比前一节点的发送来的数据,然后确认队列层层返回。如果存在数据不一致,存在数据丢失,那么这些不一致的数据就要放到下一次发送数据的最前面,再发送一次。发送的信息大小64KB,包含抬头报文信息,实际数据信息小于64KB; DNi会根据抬头报文判断是否要进行数据接收,如果是接收过的数据,则不执行接收数据。 如果确认队列数据同前一节点的发送数据都一致,则数据写入成功,此时确认队列中的数据会被删除。
4.如果写数据过程中,其中一个DN出现宕机,则管线传输会立即终端,此时正常工作的DN 们会组合成新的管线,名称为N2,并立即向NN汇报,更新管线信息。然后继续进行数据写入工作,各节点出现的信息丢失,会通过确认队列重新发送一次,保证数据完整性。
5.要求写入3份副本,只要写入一份block,就代表写入成功了,并不需要3份全部写入。以上操作仅仅是一个block块以64KB包写入的过程,其他block块也会以相同的方式写入的DN们。
问题:客户端包含什么内容? 虚拟机
分布式搭建
伪分布式搭建
伪分布式 pseudo 伪君子 NameNode DataNode SecondaryNameNode 三个设置在一个虚拟机上 假装实现了分布式存储的效果 作为学习完全分布式的 过渡
实现什么功能
切分大文件,上传到服务器,产生一个副本,实现分布式存储
最终输入指令:hdfs dfs -D dfs.blcksize=1048576 -D dfs.replocation=1 -put hello.txt / 上述指令是指 将 hello.txt 按照1M大小切块 拆成若干文件 生成一个副本 上传到 hadoop的 / 根目录 上述指令包含了 -D -D -put 3个指令
1. 下载jdk1.8 安装 ,解压hadoop2.6.5.gz
2. 配置环境变量
3. core-site.xml hdf-site.xml slaves
core-site.xml 指定访问HDFS的时候路径的默认前缀 指定hadoop的临时目录位置 它会给 NN SNN DN 的存储目录指定前缀 伪分布式 /var/bjsxt/hadoop/pseudo 完全分布式 /var/bjsxt/hadoop/full 会储存 切割后的block块数据信息 以及VERSION (storageID clusterID cTime datenodeUuid)
4.格式化
5.启动集群,jps查看各个节点进程是否存在
6.上传文件测试
完全分布式搭建
4台虚拟机 模拟 真实集群 block 副本3份 node1 NN node2 SNN DadaNode node3 DadaNode node4 DadaNode
1. (node1)下载jdk1.8 安装 ,解压hadoop2.6.5.gz,先设置好一个,再发送给其他节点
2. 配置环境变量
3.设置相互免密登录
设置完成后,传送数据不用输入密码
设置完成后,传送指令不用输入密码
4.远程传送指令不走 /etc/profile,无法使用环境变量。因此需要设置
5. core-site.xml hdf-site.xml slaves NN SNN DN 位置 以及block等文件存放位置不再是pseudo,而是full 设置不同于伪分布式
6.格式化
7. 启动集群,jps 查看各个节点进程是否存在
8.上传文件测试
HDFS 引入
HDFS是什么?
问题引入: 大文件 小内存 怎么快速上传到服务器实现存储并回调使用
回答:数据切块储存在各个服务器中,实际上是大数据的存储方式
HDFS基本原理是啥?
大文件拆分 ,多服务器存储
HDFS设计目标是啥 为啥用它
1 硬件错误是常态
服务器常常打不开 很多台服务器工作 要有容错率 实现错误快速检测 并恢复 HDFS 1、数据备份 每个block数据 可以保存若干份到不同的dadanode(服务器) 中,namenode中有元数据,包含文件位置,可以根据路径将宕机的服务器上的数据 拷贝一份 2.每隔很短时间 (3秒) datanode 会 汇报自身数据信息给 namenode(发一次心跳), 所以namenode 清单数据信息更新很快
2 流式数据访问
实现批处理
3 大规模数据集
支持数以千万的文件
4 简单的一致性模型
一次写入多次读取
能写 能读 能删除 不能修改
5 移动计算而不是移动数据
哪里需要计算 就把计算程序发到哪里 降低数据传输的网络阻塞
6 平台的可移植性