04 Hadoop思想与原理

1.用图与自己的话,简要描述Hadoop起源与发展阶段。

Hadoop之父
Doug Cutting在这里插入图片描述

  1. Hadoop最早起源于lucene下的Nutch。Nutch的设计目标是构建一个大型的全网搜索引擎,包括网页抓取、索引、查询等功能,但随着抓取网页数量的增加,遇到了严重的可扩展性问题——如何解决数十亿网页的存储和索引问题。
  2. 2003年、2004年谷歌发表的三篇论文为该问题提供了可行的解决方案。
    ——分布式文件系统(GFS),可用于处理海量网页的存储
    ——分布式计算框架MAPREDUCE,可用于处理海量网页的索引计算问题。
    ——分布式的结构化数据存储系统Bigtable,用来处理海量结构化数据。
  3. Doug Cutting基于这三篇论文完成了相应的开源实现HDFS和MAPREDUCE,并从Nutch中剥离成为独立项目HADOOP,到2008年1月,HADOOP成为Apache顶级项目(同年,cloudera公司成立),迎来了它的快速发展期。

为什么叫Hadoop? Logo为什么是黄色的大象?

狭义上来说,Hadoop就是单独指代Hadoop这个软件(HDFS+MAPREDUCE)
广义上来说,Hadoop指代大数据的一个生态圈(Hadoop生态圈),包括很多其他的软件。
在这里插入图片描述

Hadoop的历史版本介绍

0.x系列版本:Hadoop当中最早的一个开源版本,在此基础上演变而来的1.x以及2.x的版本
1.x版本系列:Hadoop版本当中的第二代开源版本,主要修复0.x版本的一些bug等
2.x版本系列:架构产生重大变化,引入了yarn平台等许多新特性
在这里插入图片描述

Hadoop的模块组成

1、HDFS:一个高可靠、高吞吐量的分布式文件系统。
(海量数据的存储)
HDFS集群包括,NameNode和DataNode以及Secondary Namenode。

2.对比操作三个文件系统:分别用命令行与窗口方式查看windows,Linux和Hadoop的文件系统的用户主目录。

 

 

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

主要功能

 

1. NameNode

NameNode管理HDFS文件系统的命名空间,它维护文件系统树及树中的所有文件和目录。同时NameNode也负责这些文件和目录的打开、关闭、移动和重命名等操作。而实际文件数据的操作是由DataNode负责。

当Client端发起请求,该请求首先会到达NameNode,NameNode分析请求,然后告诉Client该去哪个DataNode上找什么位置的数据块。得到消息后的Client会直接和DataNode进行交互。

NameNode中元数据种类有:

(1)文件名目录及它们的层级关系;(2)文件目录的所有者及其权限;(3)每个文件块的名称及文件有哪些块组成。

需要注意的是,NameNode保存的元数据信息并不包含每个数据块的位置信息,只包含块的名称及文件由哪些块组成。块的位置信息会在NameNode每次重启时从DataNode获取,并且NameNode通过心跳机制和DataNode保持通信,实时监控文件系统是否在正常运行。

2. DataNode

DataNode运行在slave节点上,也称为工作节点。它负责存储数据块,也负责为Client端提供读写服务,同时还接收NameNode指令,进行创建、删除和复制等操作。DataNode还通过心跳机制定期向NameNode发送所存储文件块列表信息。并且DataNode还和其他DataNode节点通信,复制数据块已达到冗余的目的。

3. SecondaryNameNode

NameNode元数据信息存储在FsImage中,NameNode每次重启后会把FsImage读取到内存中,在运行过程中为了防止数据丢失,NameNode的操作会被不断的写入本地EditLog文件中。

当检查点被触发,FsImage会把EditLog文件中的操作应用一遍,然后把新版的FsImage写回磁盘中,删除EditLog文件中旧的事务信息。检查点有两种触发机制:(1)按秒为单位的时间间隔触发(dfs.namenode.checkpoint.period);(2)达到文件系统累加的事务值触发(dfs.namenode.checkpoint.txns)。

FsImage和EditLog文件的合并就用到了SecondaryNameNode组件,它的工作过程如下:

(1)合并之前通知NameNode把所有操作写入新的EditLog文件中,并将其命名为edits.new;

(2)SecondaryNameNode从NameNode处请求合并FsImage和EditLog;

(3)SecondaryNameNode把FsImage和EditLog合并为新的FsImage文件;

(4)NameNode从SecondaryNameNode获取合并好的新的FsImage并将旧的替换掉,并把EditLog用(1)中创建的edits.new替换。

(5)更新Fstime中的检查点。

 

相互关系

1)SencodaryNameNode也是在一定条件下才会触发checkpoint(合并)操作,将文件的元数据加载合并,重新传递到namenode节点

2)SecondaryNameNode询问NameNode是否需要CheckPoint。直接带回NameNode是否检查结果。

2)DataNode启动后向NameNode注册,通过后,周期性(1小时)的向NameNode上报所有的块信息。

3)心跳是每3秒一次,心跳返回结果带有NameNode给该DataNode的命令如复制块数据到另一台机器,或删除某个数据块。如果超过10分钟没有收到某个DataNode的心跳,则认为该节点不可用。

 

 

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

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

 

 

 

 

 

 

4.梳理HBase的结构与运行流程,以用图与自己的话进行简要描述。

  • Master主服务器的功能
  • Region服务器的功能
  • Zookeeper协同的功能
  • Client客户端的请求流程
  • 与HDFS的关联

1).架构图

2).HMaster
监控RegionServer
处理RegionServer故障转移、处理源数据变更
处理region的分配与移除
空闲时进行数据的负载均衡
通过ZK发布自己的位置给客户端连接
3).RegionServer
负责与hdfs交互,存储数据到hdfs中
处理hmaster分配的region
刷新缓存到hdfs
维护hlog
执行压缩
处理region分片
处理来自客户端的读写请求
4).Client
Client包含了访问Hbase的接口
维护对应的cache来加速Hbase的访问,比如MATE表的元数据信息
5).Zookeeper
Zookeeper主要负责master的高可用
RegionServer的监控
元数据的入口以及集群配置的维护工作。
6).HDFS
HDFS为Hbase提供最终的底层数据存储服务,同时为HBase提供高可用(Hlog存储在HDFS)的支持,具体功能概括如下:

 

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

在Hbase中存在一张特殊的meta表,其中存放着HBase的元数据信息,包括,有哪些表,表有哪些HRegion,每个HRegion分布在哪个HRegionServer中。meta表很特殊,永远有且仅有一个HRegion存储meta表,这个HRegion存放在某一个HRegionServer中,并且会将这个持有meta表的Region的HRegionServer的地址存放在Zookeeper中meta-region-server下。

 

6.理解并描述Hbase的三级寻址。

所以当在进行HBase表的读写操作时,需要先根据表名 和 行键确 定位到HRegion,这个过程就是HRegion的寻址过程。
HRgion的寻址过程首先由客户端开始,访问zookeeper 得到其中meta-region-server的值,根据该值找到唯一持有meta表的HRegion所在的HRegionServer,得到meta表,从中读取真正要查询的表和行键 对应的HRgion的地址,再根据该地址,找到真正的操作的HRegionServer和HRegion,完成HRgion的定位,继续读写操作.

客户端会缓存之前已经查找过的HRegion的地址信息,之后的HRgion定位中,如果能在本地缓存中的找到地址,就直接使用该地址提升性能。

图解:

 

 

7.通过HBase的三级寻址方式,理论上Hbase的数据表最大有多少个Region?

如果一台RegionServer存储12T数据,那按照单Region为10G计算,就会分裂出400个Region,很显然不合理。此时就需要调整参数hbase.hregion.max.filesize,将此值适度调大,调整为20G或者30G。而实际上当下单台物理机所能配置的硬盘越来越大,比如36T已经很普遍,如果想把所有容量都用来存储数据,依然假设一台RegionServer上分布100个Region,那么每个Region的 大小将会达到可怕的120G,一旦执行Compaction将会是一个灾难。
然而随着硬件成本的不断下降,单台RegionServer可以轻松配置40T+的硬盘容量,如果按照上述说法,越来越多的硬盘其实只是’镜中月,水中花’。社区也意识到了这样的问题,在当前Region的概念下提出了Sub-Region的概念,可以简单理解为将当前的Region切分为很多逻辑上小的Sub-Region。Region还是以前的Region,只是所有之前以Region为单位进行的Compaction将会以更小的Sub-Region粒度执行。这样,单Region就可以配置的很大,比如50G、100G,此时单台RegionServer上也就可以存储更多的数据

 

 

8.MapReduce的架构,各部分的功能,以及和集群其他组件的关系。

同HDFS一样,Hadoop MapReduce也采用了Master/Slave(M/S)架构,主要有以下几个组件构成:Client、JobTracker、TaskTracker和Task。

1)Client:
用户编写的Mapreduce程序通过Client提交到JobTracker端;同时,用户可通过Client提供的一些接口查看作业运行状态。在Hadoop内部用“作业”(Job)表示Mapreduce程序。一个Mapreduce程序可对应若干个作业,而每个作业会被分解成若干个Mapreduce任务(Task)。
2)JobTracker:
JobTracker主要负责资源监控和作业调度。JobTracker监控所有TaskTracker与作业的健康状况,一旦发现失败情况后,会将 相应的任务转移到其他节点;同时,JobTracker会跟踪任务的执行进度、资源使用量等信息,并将这些信息告诉任务调度器,而调度器会在资源出现空闲时,选择合适的任务使用这些资源。在hadoop中,任务调度器是一个可插拔的模块,用户可以根据自己的需要设计相应的调度器。
3)TaskTracker:
TaskTracker会周期性的通过Heartbeat将本节点上资源的使用情况和任务的运行进度汇报给JobTracker,同时接收JobTracker发送过来的命令并执行相应的操作(如启动新任务、杀死任务等)。TaskTracker使用“slot”等量划分本节点上的资源量。“slot”代表计算资源(CPU、内存等)。一个Task获取到一个slot后才有机会运行,而Hadoop调度器的作用就是将各个TaskTracker上空闲slot分配给Task使用。slot分为Map slot和Reduce slot两种,分别供Map Task和Reduce Task使用。TaskTracker通过slot数目(可配置参数)限定Task的并发度。
4)Task:
Task分为Map Task和Reduce Task两种,均由TaskTracker启动。从上篇HDFS文档中知道,HDFS以固定大小的block为基本单位存储数据,而对于Mapreduce而言,其处理单位是split。split是一个逻辑概念,它只包含一些元数据信息,比如数据起始位置、数据长度、数据所在节点等。它的划分方法完全由用户自己决定。但需要注意的是,split的多少决定了Map Task的数目,因为每个split会交由一个Map Task处理。
Map Task执行过程:先将对应的split迭代解析成一个个key/value对,依次调用用户自定义的map()函数进行处理,最终将临时结果存放到本地磁盘上,其中临时数据被分成若干个partition,每个partition 将被一个Reduce Task处理。
Reduce Task执行过程:该过程分为三个阶段①从远程节点上读取Map Task中间结果(称为“Shuffle阶段”);②按照key对key/value对进行排序(称为“Sort阶段”);③依次读取,调用用户自定义的reduce()函数处理,并将最终结果存到HDFS上(称为“Reduce阶段”)。

 

 

 

 

9.MapReduce的工作过程,用自己的例子,将整个过程梳理并用图形表达出来。

 

posted @ 2021-10-22 09:55  少郎  阅读(121)  评论(0)    收藏  举报