04 Hadoop思想与原理、HBase架构与原理

1.用图与自己的话,简要描述Hadoop起源与发展阶段
(1)与谷歌系统的关系,关键时间节点 

Hadoop最早起源于Nutch。Nutch的设计目标是构建一个大型的全网搜索引擎,包括网页抓取、索引、查询等功能,但随着抓取网页数量的增加,遇到了严重的可扩展性问题——如何解决数十亿网页的存储和索引问题。
2003年、2004年谷歌发表的两篇论文为该问题提供了可行的解决方案。一个是分布式文件系统(GFS),可用于处理海量网页的存储,另一个是分布式计算框MAPREDUCE,可用于处理海量网页的索引计算问题。
Nutch的开发人员完成了相应的开源实现HDFS和MAPREDUCE,并从Nutch中剥离成为独立项目HADOOP,到2008年1月,HADOOP成为Apache顶级项目,从此Hadoop演变成多个软件的生态圈。

2006年Google发表了论文是关于BigTable的,这促使了后来的Hbase的发展。

因此,Hadoop及其生态圈的发展离不开Google的贡献。

总而言之,狭义上来说,hadoop就是单独指代hadoop这个软件,广义上来说,hadoop指代大数据的一个生态圈,包括很多其他的软件。

 

(2)Hadoop不同版本1.x,2.x与3.x的区别

1.x版本系列:hadoop版本的第二代开源版本,主要修复0.x版本的一些bug等
2.x版本系列:架构产生重大变化,引入了yarn平台等许多新特性

3.x版本系列:对HDFS、MapReduce、YARN都有较大升级,还新增了Ozone key-value存储。

 

(3)不同公司发行版本

1.免费开源版本apache:
优点:拥有全世界的开源贡献者,代码更新迭代版本快。
缺点:版本的升级、维护、兼容性、补丁都可能考虑不太周到,学习可以用,不适合实际生产工作。

2.免费开源版本hortonWorks:
hortonworks主要是雅虎主导Hadoop开发的副总裁,带领二十几个核心成员成立Hortonworks,核心产品软件HDP(ambari),HDF免费开源,并且提供一整套的web管理界面,让使用者可以通过web界面管理自己的集群状态。

3.软件收费版本ClouderaManager:
cloudera主要是美国一家大数据公司在apache开源hadoop的版本上,通过自己公司内部的各种补丁,实现版本之间的稳定运行,大数据生态圈的各个版本的软件都提供了对应的版本,解决了版本的升级困难,版本兼容性等各种问题,最适合实际生产环境。

 

2.用图与自己的话,简要描述名称节点、数据节点的主要功能及相互关系、名称节点的工作机制

(1)描述HDFS名称节点、数据节点的主要功能

在HDFS中,节点分为两类:名称节点、数据节点;
名称节点:名称节点负责管理分布式文件系统的命名空间,它保存了两个核心的数据结构——FsImage、EditLog;
HDFS命名空间:目录、文件、块。
HDFS命名空间的管理,是指对HDFS中目录、文件、块做类似文件系统的创建、修改、删除等基本操作。
    FsImage:维护文件系统树 以及 文件树中的文件和文件夹的元数据;
    EditLog:记录针对文件的创建、删除、重命名等这样的更新操作;
   

FsImage、EditLog工作原理:
    名称节点运行期间,HDFS内的更新操作被写入到EditLog文件中,随着更新操作的不断发生,EditLog也将不断变大。
    名称节点在每次重启时,将FsImage加载到内存中,再逐条执行EditLog中的记录,使FsImage保持最新状态。

    存在问题:EditLog过大时
    名称节点在启动过程中处于“安全模式”,只能对外提供读操作,无法提供写操作。当启动过程结束之后,系统将退出安全模式,对外提供正常的读写操作。但是,若EditLog很大会使得启动过程运行很慢,名称节点长期处于安全模式下,无法对外提供写操作。

    解决问题:第二名称节点SecondaryNameNode
    SecondaryNameNode有两个主要功能,针对此问题,它的功能主要是——完成EditLog与FsImage的合并操作,减小EditLog的文件大小,以缩短名称节点启动时间。
    每隔一段时间,SecondaryNameNode会与NameNode进行通信,请求NameNode停止使用EditLog文件,让NameNode将这之后新到达的写操作写入到一个新的文件EditLog.new中;然后SecondaryNameNode将EditLog、FsImage拉回至本地,加载到内存中——即将FsImage加载到内存中,再逐条执行EditLog中的记录,使FsImage保持最新。
     以上,便是EditLog与FsImage的合并过程,合并完成之后,SecondaryNameNode将已经更新的FsImage文件发送到NameNode,NameNode收到后,就用这个最新的FsImage文件替换掉旧的FsImage,同时用EditLog.new文件去替换EditLog文件,这样一替换,同时也减小的EditLog文件的大小。

    SecondaryNameNode的第二个功能:作为名称节点的检查点
    从以上“合并过程”能看出,SecondaryNameNode会定期与NameNode通信,获取旧文件合并后得到一个FsImage的新文件。SecondaryNameNode周期性的备份NameNode中的元数据信息,当NameNode发生故障时,可用SecondaryNameNode中记录的元数据信息进行恢复。
    但是,在合并、文件替换期间的更新操作并没有被写到新的FsImage文件中去,所以如果在这回期间发生故障,系统会丢失部分元数据信息。
    总而言之,SecondaryNameNode和NameNode内存需求相同,两者是运行在不同的机器上的。

数据节点:是HDFS的工作节点,负责数据的存储和读取。
       客户端从HDFS读取数据过程:在HDFS内部,一个文件是被分片成了若干个数据块了的,这些数据块被分布的存储到若干个数据节点上。

 

 

    客户端要获取HDFS内的数据时,首先将文件名发送给名称节点;名称节点根据文件名找到对应数据块信息,再根据数据块信息,找到存储了这些块的数据节点位置信息。

    找到数据节点位置信息后将这些信息发送给客户端,客户端据此直接访问数据节点,并获取数据。
    在以上所述的访问过程中,名称节点并不参与数据的传输,它只是实现了类似索引的功能。
 

(2)描述HDFS相互关系、名称节点的工作机制

1.NameNode&Secondary NameNode工作机制

1)第一阶段:namenode启动

(1)第一次启动namenode格式化后,创建fsimage和edits文件。如果不是第一次启动,直接加载编辑日志(edits)和镜像文件(fsimage)到内存
(2)客户端对元数据进行增删改的请求
(3)namenode记录操作日志,更新滚动日志
(4)namenode在内存中对数据进行增删改查

2)第二阶段:Secondary NameNode工作

(1)Secondary NameNode询问namenode是否需要checkpoint。直接带回namenode是否检查结果。
(2)Secondary NameNode请求执行checkpoint。
(3)namenode滚动正在写的edits日志
(4)将滚动前的编辑日志和镜像文件拷贝到Secondary NameNode
(5)Secondary NameNode加载编辑日志和镜像文件到内存,并合并。
(6)生成新的镜像文件fsimage.chkpoint
(7)拷贝fsimage.chkpoint到namenode
(8)namenode将fsimage.chkpoint重新命名成fsimage

 

2.NameNode & DataNode工作机制

 

 

 

(1) 一个数据块在 DataNode 上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳;
(2) DataNode 启动后向 NameNode 注册,通过后,周期性(1小时)的向 NameNode 上报所有的块信息;
(3) 心跳是每3秒一次,心跳返回结果带有 NameNode 给该 DataNode 的命令如复制块数据到另一台机器,或删除某个数据块。如果超过10分钟没有收到某个 DataNode 的心跳,则认为该节点不可用;
(4) 集群运行中可以安全加入和退出一些机器。

 

3.分别从以下这些方面,梳理清楚HDFS的 结构与运行流程,以图的形式描述。

  • 客户端与HDFS
  • 客户端读
  • 客户端写
  • 数据结点与集群
  • 数据结点与名称结点
  • 名称结点与第二名称结点
  • 数据结点与数据结点  
  • 数据冗余
  • 数据存取策略
  • 数据错误与恢复

 客户端与HDFS的读写操作:

(1)写操作:

 

  1. 户端向namenode发起上传请求
  2. namenode检查datanode是否已经存有该文件,并且检查客户端的权限
  3. 确认可以上传后,根据文件块数返回datanode栈注:namenode触发副本放置策略,如果客户端在集群内的某一台机器,那么副本第一块放置在该服务器上,然后再另外挑两台服务器;如果在集群外,namenode会根据策略先找一个机架选出一个datanode,然后再从另外的机架选出另外两个datanode,然后namenode会将选出的三个datanode按距离组建一个顺序,然后将顺序返回给客户端
  4. 客户端pop()栈顶的第一个节点,建立socket连接,然后第一个节点与第二个节点,第二个节点与第三个节点...依次建立socket连接
  5. datanode反顺序依次应答,直到应答给客户端注:如果有datanode没有应答,客户端重新向namenode请求
  6. 客户端向datanode上传文件块
  7. 上传文件块后,各datanode会通过心跳将位置信息汇报给namenode注:如果上传文件块时,某个datanode节点挂掉了,该节点的上节点直接连接该节点的下游节点继续传输,最终在第7步汇报后,namenode会发现副本数不足,触发datanode复制更多副本
  8. 客户端重复上传操作,逐一将文件块上传,同时dataNode汇报块的位置信息,时间线重叠
  9. 所有块上传完毕后,namenode将所有信息存在元数据中,客户端关闭输出流

(2)读操作:

  1. 用户操作客户端查看文件,客户端带着文件名向namenode发起下载请求
  2. namenode在元数据中查找该文件对应各个块的大小位置信息,返回给客户端
  3. namenode向位置datanode节点发起下载请求
  4. datanode向客户端传输块数据
  5. 客户端下载完成所有块后会验证datanode中的MD5,保证块数据的完整性,最后关闭输入流

HDFS存储原理:

1 数据冗余保存:

优点:

  1. 加快数据传输速度
  2. 容易检查数据错误
  3. 保证数据的可靠性
2 数据存取策略:

2.1数据存放:
        第一副本:放置在上传文件的DataNode上
        第二副本:放置在与第一个副本不同的机架的节点上
        第三副本:与第一个副本相同机架的其他节点上
        更多副本:随机节点
2.2 数据读取:
        HDFS提供API确定一个数据节点机架ID,客户端获取自己所属的机架ID,如果属于同一个机架,则在此机架读取,否则随机读取

3 数据错误和恢复:
1 名称节点出错:

    根据备份服务器SecondaryNameNode中的FsImage和EditLog数据进行恢复
2 数据节点出错:
    2.1 数据节点定期想NameNode发送心跳信息,报告自己的状态
    2.2 长期未收到心跳,即故障,NameNode把此节点标志为"宕机",NameNode不会再给他们发送任何IO请求
    2.3 启动数据冗余复制,为它生成新的副本
3 数据出错:
    客户端在读到数据后,会采用md5和sha1对数据进行校验,以确定读取到正确的数据。
    如果发现错误,则向NameNode报告这个文件块有错误,NameNode会定期检查并重新复制这个块

4.简述HBase与传统数据库的主要区别

1、Hbase适合大量插入同时又有读的情况

2、Hbase的瓶颈是硬盘传输速度,Oracle的瓶颈是硬盘寻道时间。

Hbase本质上只有一种操作,就是插入,其更新操作是插入一个带有新的时间戳的行,而删除是插入一个带有插入标记的行。其主要操作是收集内存中一批数据,然后批量的写入硬盘,所以其写入的速度主要取决于硬盘传输的速度。Oracle则不同,因为他经常要随机读写,这样硬盘磁头需要不断的寻找数据所在,所以瓶颈在于硬盘寻道时间。

3、Hbase很适合寻找按照时间排序top n的场景

4、索引不同造成行为的差异。

5、Oracle 这样的传统数据库既可以做OLTP又可以做OLAP,但在某种极端的情况下(负荷十分之大),就不适合了。

 

5.梳理HBase的结构与运行流程,以用图与自己的话进行简要描述,图中包括以下内容:

  • Master主服务器的功能
  • Region服务器的功能
  • Zookeeper协同的功能
  • Client客户端的请求流程
  • 四者之间的相系关系

与HDFS的关联

Master
HBase Master用于协调多个Region Server,侦测各个RegionServer之间的状态,并平衡RegionServer之间的负载。HBaseMaster还有一个职责就是负责分配Region给RegionServer。HBase允许多个Master节点共存,但是这需要Zookeeper的帮助。不过当多个Master节点共存时,只有一个Master是提供服务的,其他的Master节点处于待命的状态。当正在工作的Master节点宕机时,其他的Master则会接管HBase的集群。

Region Server
对于一个RegionServer而言,其包括了多个Region。RegionServer的作用只是管理表格,以及实现读写操作。Client直接连接RegionServer,并通信获取HBase中的数据。对于Region而言,则是真实存放HBase数据的地方,也就说Region是HBase可用性和分布式的基本单位。如果当一个表格很大,并由多个CF组成时,那么表的数据将存放在多个Region之间,并且在每个Region中会关联多个存储的单元(Store)。

Zookeeper
对于 HBase 而言,Zookeeper的作用是至关重要的。首先Zookeeper是作为HBase Master的HA解决方案。也就是说,是Zookeeper保证了至少有一个HBase Master 处于运行状态。并且Zookeeper负责Region和Region Server的注册。其实Zookeeper发展到目前为止,已经成为了分布式大数据框架中容错性的标准框架。不光是HBase,几乎所有的分布式大数据相关的开源框架,都依赖于Zookeeper实现HA。

Client客户端的请求流程

四者之间的关系

1、Hbase集群有两种服务器:一个Master服务器和多个RegionServer服务器;

2、Master服务负责维护表结构信息和各种协调工作,比如建表、删表、移动region、合并等操作;

3、客户端获取数据是由客户端直连RegionServer的,所以Master服务挂掉之后依然可以查询、存储、删除数据,就是不能建新表了;

4、RegionServer非常依赖Zookeeper服务,Zookeeper管理Hbase所有的RegionServer信息,包括具体的数据段存放在那个RegionServer上;

5、客户端每次与Hbase连接,其实都是先于Zookeeper通信,查询出哪个RegionServer需要连接,然后再连接RegionServer;客户端从Zookeeper获取了RegionServer的地址后,会直接从RegionServer获取数据;

与HDFS的关联
RegionServer保存的数据直接存储在Hadoop的HDFS上;

6、完整描述Hbase表与Region的关系,三级寻址原理。

(1)Hbase表与Region的关系

 

 

 

 

 

(2)三级寻址原理

 

假设META.表的每行(一个映射条目)在内存中大约占用1KB,并且 ,通过HBase的三级寻址方式,理论上Hbase的数据表最大有多大?

一个-ROOT-表最多只能有一个Region,也就是最多只能有2GB,按照每行(一个映射条目)占用1KB内存计算,2GB空间可以容纳2GB/1KB=231行,也就是说,一个-ROOT-表可以寻址231个.META.表的Region。

同理,每个.META.表的 Region可以寻址的用户数据表的Region个数是2GB/1KB=231

最终,三层结构可以保存的Region数目是(2GB/1KB) × (2GB/1KB) = 2100个Region,即理论上Hbase表最大273G。

 

posted @ 2021-10-24 13:29  Alice12824  阅读(135)  评论(0编辑  收藏  举报