高可靠性:底层维护多个数据副本,即使某个计算元素或存储出现故障,也不会造成数据丢失。
高扩展性:在集群间分配任务数据,方便扩展数以千计的节点
高效性:在mapreduce的思想下,Hadoop是并行工作的,以加快任务处理速度
高容错性:能够自动将失败的任务重新分配
Hadoop1X:mapreduce、HDFS、common(辅助工具)
Hadoop2X:mapreduce、yarn、HDFS、common(辅助工具)
①1与2版本的区别:在Hadoop1版本,Hadoop中的mapreduce同时处理业务逻辑运算和资源调度,耦合性较大,在Hadoop2版本增加了yarn,yarn只负责资源的调度,mapreduce只负责运算
②2与3版本的区别:Hadoop3版本的最低运行时版本为JDK8。Hadoop2版本仅支持2个namenode,并不能提供最大级别的容错能力,而Hadoop3提供了多个namenode。Hadoop2版本靠存储多个副本保证数据的可靠性,降低了磁盘利用率。Hadoop3引入了纠删码技术,它可以提高了50%以上的磁盘利用率。以更小的数据冗余度获得更高的数据可靠性。
纠删码技术(Erasure coding)简称EC,是一种编码容错技术。最早用于通信行业,数据传输中的数据恢复。它通过对数据进行分块,然后计算出校验数据,使得各个部分的数据产生关联性。当一部分数据块丢失时,可以通过剩余的数据块和校验块计算出丢失的数据块。
点这里—>:纠删码原理介绍
namenode:存储文件的元数据,如文件名、文件目录结构、文件属性(生成时间、副本数、文件权限等),以及每个文件的块列表和块所在的datanode等
datanode:在本地文件系统存储文件块数据,以及块数据的校验和
secondaryNamenode:用来监控HDFS状态的辅助后台程序,每隔一段时间获取HDFS元数据的快照
resourcemanager:用于处理客户端请求,监控nodemanager,启动和监控applicationMaster,资源的分配与调度
nodemanager:主要作用有管理单个节点的资源,处理来自resourcemanager和applicationMaster的命令
applicationMaster:主要作用有负责数据切分,为应用程序申请资源并分配给内部的任务,并对任务进行监控和容错性的保证
container:是yarn中的资源抽象,它封装了某个节点上的多维度资源,内存、CPU、磁盘、网络等
client:用于提交job
jobTracker:负责资源监控和作业调度,监控所有TaskTracker和job的健康状态
TaskTracker:周期性的将本节点的资源使用情况和任务运行情况上传到jobTracker
task:分为mapTask和reduceTask,都由TaskTracker启动
HDFS中的文件在物理上是分块存储,块的大小通过dfs.blocksize参数设置,Hadoop1版本块默认64M,Hadoop2和3版本默认128M。块的大小根据磁盘是传输速率设置。一般寻址之间为传输时间的1%为最佳状态,根据寻址时间和磁盘传输速率计算出最佳块大小为100M左右
HDFS块的大小不能设置的太小也不能设置的太大。块设置的太小,会增加寻址时间,程序一直在寻找块开始的位置。如果设置的太大,从磁盘传输数据的时间会明显大于定位这个块位置所需的时间。导致程序在处理这块数据是会非常的慢
①客户端通过Distributed FileSystem模块向namenode请求上传文件,namenode检查目标文件是否存在,和父目录是否存在
②namenode应答客户端是否可以上传
③客户端请求第一个block可以上传到那几个datanode
④namenode向客户端返回可用的datanode列表,分别是A,B,C
⑤客户端通过FSDataOutputStream模块请求A上传数据,A收到请求后会继续调用B,B再调用C,将这个通信管道建立完成。
⑥A、B、C逐级应答客户端
⑦客户端开始往A上传第一个block(先从磁盘读取数据放到一个本地内存缓存)以packet为单位,A收到一个Packet后就会传输给B,B在传给C,A没传一个packet会放入一个应答队列等待应答
⑧当一个block传输完成之后,客户端再次请求namenode上传下一个block的服务器
①客户端通过Distributed FileSystem向namenode请求下载文件,namenode通过查询元数据,找到文件块所在的Datanode地址
②挑选一台datanode(就近原则,然后随机)服务器,请求读取数据
③datanode开始传输数据给客户端,从磁盘里面读取数据输入流,以packet为单位来做校验
④客户端以packet为单位接收,现在本地缓存,然后写入目标文件
FSimage:namenode内存中元数据序列化后形成的文件。HDFS文件系统元数据的永久性检查点,其中包含了HDFS文件系统的所有目录和文件inode的序列化信息。
edits:记录客户端更新元数据的每一步操作,可以通过edits运算出元数据。存放HDFS文件系统的所有更新操作的路径,文件系统客户端执行的所有写操作首先会被记录到edits文件中。
namenode的元数据存储在内存中,为了保证元数据的可靠性,元数据会定期备份到fsimage文件中。当内存中的元数据更新时,会先将元数据的更新或修改日志写入到edits文件中,edits文件只进行追加操作,效率很高。secondarynamenode主要负责edits与fsimage文件的合并工作,以保证元数据的安全性
–namenode工作
①第一次启动namenode格式化,创建fsimage和edits文件。如果不是第一次启动,则直接加载fsimage和edits文件到内存
②客户端发起对元数据进行增删改操作的请求
③namenode将元数据更新或修改的操作记录到edits文件中,更新滚动edits
④namenode在内存中对数据进行更新或修改操作
–secondarynamenode工作
⑤secondarynamenode询问namenode是否需要checkpoint(备份元数据),并且直接带回namenode是否checkpoint的结果
⑥secondarynamenode请求执行checkpoint
⑦namenode滚动正在写的edits
⑧namenode将滚动前的edits和fsimage文件拷贝到secondarynamenode
⑨secondarynamenode将edits和fsimage加载到内存中,进行合并生成新的镜像文件fsimage.chkpoint
⑩拷贝fsimage.chkpoint拷贝到namenode上,重命名并替换之前的fsimage文件
①一个数据块在DataNode上以文件形式存储在磁盘上,包括两个文件:一个是数据本身,一个是元数据(包括数据块长度,块数据的校验和,以及时间戳)
②datanode启动后向namenode注册,通过后周期性(1小时)的向namenode上报所有块信息
③心跳是每3秒一次,心跳返回结果带有namenode给该datanode的命令(如复制块数据到另一台机器,或删除某个数据块)。如果超过10分钟没有收到某个Datanode的心跳,则认为该节点不可用
④集群运行中可以安全加入和退出一些机器
HA:high available高可用,实现高可用的最关键的策略是消除单点故障,HA分为HDFS HA 和 yarn HA。在Hadoop2版本之间namenode存在单点故障。namenode主要在两个方面影响集群,namenode发生意外,如宕机、集群将无法使用,直到管理员重启,NameNode机器需要升级,包括软件、硬件升级,此时集群也将无法使用。HDFS HA功能通过配置Active/Standby两个NameNodes实现在集群中对NameNode的热备来解决上述问题
①元数据管理方式需要改变,两个namenode中各自保存一份元数据,edits日志只有active状态的namenode才可以做写操作,两个namenode都可以读取edits文件,共享的edits放在一个共享存储中管理(qjouornal和NFS两个主流实现)
②需要一个状态管理功能模块。实现了一个zkfailover,常驻在每一个namenode节点上,负责监控自己所在的namenode节点,利用zk进行状态标识,当需要进行状态切换时,由zkfailover实现。切换时要防止出现brain split发生