(三)hadoop---HDFS架构、读写过程、⾼可⽤⽅案,hdfs命令
⽂章⽬录
Hadoop架构
Hadoop如何⼯作
第⼀阶段:⼀个⽤户/应⽤程序能够提交⼀项作业给Hadoop(hadoop作业客户端),需要指定以下条⽬进⾏后续处理。
(1)分布式系统中输⼊和输出⽂件的位置。
(2)以jar⽂件形式存在的java类,包含映射(Map)和缩减(Reduce)功能的实现。
(3)通过设定不同的作业参数来进⾏作业配置。
第⼆阶段:接着,Hadoop作业客户端提交⼀个作业(jar/可执⾏⽂件等)和配置给JobTracker。然后,JobTracker负责将软件/配置分发给从属服务器、调度任务,并进⾏监控,向作业客户端提供状态和运⾏诊断信息。
第三阶段:不同节点上的TaskTracker根据每⼀个MapReduce的实现运⾏任务,减量功能的输出被存储到⽂件系统的输出⽂件中。HDFS体系结构
(1) HDFS由Client、NameNode、DataNode、SecondaryNameNode组成。
(2) Client提供了⽂件系统的调⽤接⼝。
(3)NameNode由fsimage(HDFS元数据镜像⽂件)和editlog(HDFS⽂件改动⽇志)组成,NameNode在内
存中保存着每个⽂件和数据
块的引⽤关系。
NameNode中的引⽤关系不存在硬盘中,每次都是HDFS启动时重新构造出来的。
(4) SecondaryNameNode的任务有两个:
1、定期合并fsimage和editlog,并传输给NameNode。
2、为NameNode提供热备份。
(5) ⼀般是⼀个机器上安装⼀个DataNode,⼀个DataNode上⼜分为很多数据块(block)。
(6) DataNode会通过⼼跳定时向NameNode发送所存储的⽂件块信息。
(7) HDFS的副本存放规则
默认的副本系数是3,
1、⼀个副本存在本地机架的本机器上,
2、第⼆个副本存储在本地机架的其他机器上,
3、第三个副本存在其他机架的⼀个节点上。
优势
1、这样减少了写操作的⽹络数据传输,提⾼了写操作的效率;
2、 另⼀⽅⾯,机架的错误率远⽐节点的错误率低,所以不影响数据的可靠性。
HDFS 写⽂件过程
1.客户端将⽂件写⼊本地磁盘的 HDFS Client ⽂件中
2.当临时⽂件⼤⼩达到⼀个 block ⼤⼩时,HDFS client 通知 NameNode,申请写⼊⽂件
3.NameNode 在 HDFS 的⽂件系统中创建⼀个⽂件,并把该 block id 和要写⼊的 DataNode 的列表返回给客户端
4.客户端收到这些信息后,将临时⽂件写⼊ DataNodes
4.1 客户端将⽂件内容写⼊第⼀个 DataNode(⼀般以 4kb 为单位进⾏传输)
4.2 第⼀个 DataNode 接收后,将数据写⼊本地磁盘,同时也传输给第⼆个 DataNode
4.3 依此类推到最后⼀个 DataNode,数据在 DataNode 之间是通过 pipeline 的⽅式进⾏复制的
4.4 后⾯的 DataNode 接收完数据后,都会发送⼀个确认给前⼀个 DataNode,最终第⼀个 DataNode 返回确认给客户端
4.5 当客户端接收到整个 block 的确认后,会向 NameNode 发送⼀个最终的确认信息
4.6 如果写⼊某个 DataNode 失败,数据会继续写⼊其他的 DataNode。然后 NameNode 会另外⼀个好的 DataNode 继续复制,以保证冗余性
4.7 每个 block 都会有⼀个校验码,并存放到独⽴的⽂件中,以便读的时候来验证其完整性
5.⽂件写完后(客户端关闭),NameNode 提交⽂件(这时⽂件才可见,如果提交前,NameNode 垮掉,那⽂件也就丢失了。fsync:只保证数据的信息写到 NameNode 上,但并不保证数据已经被写到DataNode 中)
HDFS 读⽂件过程
1. Client 客户端会申请⼀个 DistributedFileSystem,向 NameNode 发起下载申请,先看看有没有这 个⽂件
2. NameNode 响应是否存在
3. Client 开⼀个输⼊流,然后向 Namenode 请求下载第⼀块 Block
4. NameNode 会返回给 client 三个 DN(Client 只会从⼀个 DN 上下载,就近原则)
5. InputStream 向 DN 请求建⽴通道
6. DN 向 Client 返回应答成功
7. DN 向 Client 传输 Packet
8. NameNode 告诉 Client 数据传输完毕(流对⼝是⼀个连续的过程)
HDFS 可靠性
HDFS 的可靠性主要有以下⼏点:
冗余副本策略、机架策略、⼼跳机制、安全模式、效验和、回收站、元数据保护、快照机制
1.冗余副本策略
可以在 l 中设置复制因⼦指定副本数量
所有数据块都可副本
DataNode 启动时,遍历本地⽂件系统,产⽣⼀份 HDFS 数据块和本地⽂件的对应关系列表 (blockreport) 汇报给 Namenode
2.机架策略
HDFS 的"机架感知",通过节点之间发送⼀个数据包,来感应它们是否在同⼀个机架
⼀般在本机架放⼀个副本,在其他机架再存放⼀个副本,这样可以防⽌机架失效时丢失数据,也可以提⾼带宽利⽤率
3.⼼跳机制
NameNode 周期性从 DataNode 接受⼼跳信息和块报告
NameNode 根据块报告验证元数据
没有按时发送⼼跳的 DataNode 会被标记为宕机,不会再给他任何 I/O 请求
如果 DataNode 失效造成副本数量下降,并且低于预先设定的值,NameNode 会检测出这些数据库,并
在合适的时机重新复制
引发重新复制的原因还包括数据副本本⾝损坏,磁盘错误,复制因⼦被增⼤等
4.安全模式
NameNode 启动时会先经过⼀个 “安全模式” 阶段
安全模式阶段不会产⽣数据写
在此阶段 NameNode 收集各个 DataNode 的报告, 当数据块达到最⼩副本数以上时,会被认为是"安全"的
在⼀定⽐例(可设置) 的数据块被确定为"安全" 后 ,在过若⼲时间,安全模式结束
当检测到副本数不⾜的数据块时,该块会被复制,直到达到最⼩副本数
5.效验和
在⽂件创⽴时,每个数据块都产⽣效验和
效验和会作为单独⼀个隐藏⽂件保存在命名空间下
客户端获取数据时可以检查效验和是否相同,从⽽发现数据块是否损坏
如果正在读取的数据块损坏,则可以继续读取其他副本
6.回收站
删除⽂件时,其实是放⼊回收站 /trash
回收站⾥的⽂件是可以快速恢复的
可以设置⼀个时间值,当回收站⾥⽂件的存放时间超过了这个值,就被彻底删除,并且释放占⽤的数据块
7.元数据保护
映像⽂件和事物⽇志是 NameNode 的核⼼数据.可以配置为拥有多个副本
副本会降低 NameNode 的处理速度,但增加安全性
NameNode 依然是单点,如果发⽣故障要⼿⼯切换
HDFS⾼可⽤⽅案
在 Hadoop 1.0 时代
Hadoop 的两⼤核⼼组件 HDFS NameNode 和 JobTracker都存在着单点问题,这其中以NameNode的单点问题尤为严重。因为NameNode保存了整个HDFS的元数据信息,⼀旦NameNode挂掉,整个HDFS就⽆法访问,同时Hadoop⽣态系统中依赖于HDFS的各个组件,包括MapReduce、Hive、Pig以及HBase等也都⽆法正常⼯作,并且重新启动NameNode和进⾏数据恢复的过程也会⽐较耗时。这些问题在给Hadoop的使⽤者带来困扰的同时,也极⼤地限制了Hadoop的使⽤场景,使得Hadoop在很长的时间内仅能⽤作离线存储和离线计算,⽆法应⽤到对可⽤性和数据⼀致性要求很⾼的在线应⽤场景中。
Hadoop1.0—HDFS由⼀个NameNode和多个DataNode 组成,
MapReduce由⼀个JobTracker和多个TaskTracker 组成。
Hadoop2.0
针对Hadoop1.0中的单NameNode制约HDFS的扩展性问题,
提出了HDFSFederation(联盟),它让多个NameNode分管不同的⽬录进⽽实现访问隔离和横向扩展,同时它彻底解决了NameNode单点故障问题。
它将JobTracker中的资源管理和作业控制功能分开,分别由组件ResourceManager和ApplicationMaster实现,其中,ResourceManager负责所有应⽤程序的资源分配,ApplicationMaster仅负责管理⼀个应⽤程序,
进⽽诞⽣了全新的通⽤资源管理框架YARN。基于YARN,⽤户可以运⾏各种类型的应⽤程序(不再像1.0那样仅局限于MapReduce⼀类应⽤),从离线计算的MapReduce到在线计算(流式处理)的Storm等YARN不仅限于MapReduce⼀种框架使⽤,也可以供其他框架使⽤,⽐如Tez、Spark、Storm。
⽅法⼀:HDFS联盟
1.1 问题缘由
单个NameNode节点的局限性:
1、命名空间的限制:NameNode上存储着整个HDFS上的⽂件的元数据,NameNode是部署在⼀台机器上的,因为单个机器硬件的限制,必然会限制NameNode所能管理的⽂件个数,制约了数据量的增长。
2、数据隔离问题:整个HDFS上的⽂件都由⼀个NameNode管理,所以⼀个程序很有可能会影响到整
个HDFS上的程序,并且权限控制⽐较复杂。
3、性能瓶颈:单个NameNode时HDFS⽂件系统的吞吐量受限于单个NameNode的吞吐量。因为NameNode是个JVM进程,JVM进程所占⽤的内存很⼤时,性能会下降很多。
1.2 解决⽅法
HDFS集中只有⼀个NameNode是有很多局限性的,为了解决单个NameNode的局限,设计了HDFS联盟。
HDFS 联盟是可以在Hadoop集中设置多个NameNode,联盟中的多个NameNode是不同的,可以理解为将⼀个NameNode切分为了多个NameNode,每⼀个NameNode只负责管理⼀部分数据,HDFS Federation中的多个NameNode共⽤DataNode。
⽅法⼆:HDFS HA
单NameNode的缺陷存在单点故障的问题,如果NameNode不可⽤,则会导致整个HDFS⽂件系统不可⽤。所以需要设计⾼可⽤的
HDFS(HadoopHA)来解决NameNode单点故障的问题。解决的⽅法是在HDFS集中设置多个NameNode节点。但是⼀旦引⼊多个NameNode,就有⼀些问题需要解决。
HDFS HA需要保证的四个问题:
1、保证NameNode内存中元数据数据⼀致,并保证编辑⽇志⽂件的安全性。
解决:采⽤Zookeeper来存储编辑⽇志⽂件。
2、多个NameNode如何协作
3、客户端如何能正确地访问到可⽤的那个NameNode。
4、怎么保证任意时刻只能有⼀个NameNode处于对外服务状态。
解决⽅法
两个NameNode⼀个是Active状态的,⼀个是Standby状态的,⼀个时间点只能有⼀个Active状态的NameNode提供服务
两个NameNode上存储的元数据是实时同步的,当Active的NameNode出现问题时,通过Zookeeper实时切换到Standby的NameNode 上,并将Standby改为Active状态。
客户端通过连接⼀个Zookeeper的代理来确定当时哪个NameNode处于active服务状态
>shell创建文件并写入内容

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。