04 Hadoop思想与原理
阅读原文时间:2023年07月09日阅读:1

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

————————————————
版权声明:本文为CSDN博主「不喜欢番茄的西红柿」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u012926411/article/details/82756100

发展阶段从2004年开始发展到现在在不断的优化

描述名称节点、第二名称节点、数据节点的主要功能及相互关系

名称节点:

在HDFS中,名称节点(NameNode)负责管理分布式文件系统的命名空间(Namespace),保存了两个核心的数据结构,即FsImage和EditLog
FsImage用于维护文件系统树以及文件树中所有的文件和文件夹的元数据
操作日志文件EditLog中记录了所有针对文件的创建、删除、重命名等操作

————————————————
版权声明:本文为CSDN博主「诠释轻音」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/q739404976/article/details/72800173

第二名称节点

因为HDFS文件会逐渐地变大,不断变大的EditLog文件通常不会对系统文件产生影响,但是当EditLog很大时,使得在HDFS重启时,将EditLog合并到FsImage中的过程十分缓慢,系统长期处于“安全模式”,用户的使用收到影响。

HDFS的第二名称节点(secondary NameNode)的作用:完成EditLog合并到FsImage的过程,缩短合并的重启时间,其次作为“检查点”保存元数据的信息。

在这里插入图片描述

如图,EditLog合并到FsImage中的过程:名称节点会生成新的EditLog.new来记录t2时刻以后的数据,EditLog和FsImage会被拉到第二名称节点中,合并成为FsImage.ckpt,在t1时刻替换名称节点中的FsImage。

这样会出现一问题,如果是t2到t1时刻之间出现了问题,FsImage中的数据会丢失,所以说第二名称节点只是起到了“检查点”的作用而绝非“热备份”。
————————————————
版权声明:本文为CSDN博主「LUK流」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_35688140/article/details/83582467

数据节点功能

数据节点最主要的就是数据存储访问功能,所有功能都是为了该目的而展开,如同机房多个数据节点共同承载该机房产生数据、同机房间数据节点的数据同步、不同机房间数据节点数据同步、等等都是为了数据能正常存储访问为目的,本节简介数据节点功能如下:

(一)数据建立。数据建立是指数据节点在接收到中控发来的数据建立指令,为接收新数据进行一系列准备工作。

(二)数据销毁。数据销毁是指数据节点在接收到中控发来的数据销毁指令,将指定数据销毁,回收各种资源工作。

(三)数据存储访问。数据存储访问是指数据节点根据系统预定义数据结构将发布数据存储起来,同时根据数据子系统提供的协议对外进行相应的数据服务。相应的数据基础操作如增、删、改、查。通用平台考虑到实际应用场景,设计数据子系统需要提供按机房为单位的多点读写能力。

(四)数据节点间相互配合和自适应。大型系统中因为大量数据或是因为数据节点的存储压力,会出现单进程无法承载数据的情况,通用平台在设计之初就考虑该情况下,数据节点间需要如何进行相互配合和自适应数据分片的情况。这种情况相对较为复杂,数据节点间在确定数据分片后,会将不属于自身的数据转移至适合的数据节点,完成数据分片,降低自身存储压力。数据节点在自身存储压力降低后,预算可以承载某类数据全部压力后,可以进行数据合并处理,数据合并能降低子系统复杂度,和更有利于系统资源回收和调度

(五)数据节点间同步。数据节点间同步是指承载修改数据的数据节点(既承载增,删,改功能),需要负责将该部分变化数据同步给所有承载该数据的数据节点。该数据同步可以利用通信子系统群发功能来完成。

(六)数据节点与数据使用方同步。数据子系统为了快速响应数据变化,降低数据延迟,提供数据订阅功能,再有满足订阅需求数据到来后,可以主动通知订阅数据,降低延迟,同样亦可利用通信子系统群发功能完成。数据节点与数据使用方同步除了数据节点主动发送以外,还提供数据使用方主动发起同步,该两种方式都是以同步为目的,只是发起方不同,不过以数据使用方发起较为妥善也较好处理,但该方法一般采用轮询方式不好掌握同步时间间隔过频对于数据节点有处理压力,间隔过大造成数据延迟高。通用平台采用结合方式来解决,既约定同步信息是单调步长递增,如有异常间隔数据使用方丢弃异常数据,改为请求缺失数据既能解决。

(七)数据持久化。目前设计数据节点暂不对外进行数据持久化,该功能被设计仅为运维子系统提供,用于服务升级和配置文件升级提供磁盘文件持久化。
————————————————
版权声明:本文为CSDN博主「wyc761024」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wyc7610/article/details/106483490

相互关系

数据节点是分布式文件系统HDFS的工作节点,负责数据的存储和读取,会根据客户端或者是名称节点的调度来进行数据的存储和检索,并且向名称节点定期发送自己所存储的块的列表

是HDFS架构中的一个组成部分,它是用来保存名称节点中对HDFS 元数据信息的备份,并减少名称节点重启的时间。SecondaryNameNode一般是单独运行在一台机器上

名称节点(NameNode)负责管理分布式文件系统的命名空间(Namespace),保存了两个核心的数据结构,即FsImage和EditLog

第二名称节点使名称节点出于最新的状态并且备份,数据节点将保存数据使得数据同步

Namenode工作流程:

主节点启动NN进程,首先装载fsimage文件,然后在应用edits文件,将最新的文件系统的文件目录树,文件目录的元信息和文件的数据块索引装载到内存中。
将最新的目录树信息更新到新的fsimage文件中,然后启用新的edits文件,记录对目录结构的增加,删除,修改等操作。
DN每隔3秒向NN发送一个心跳包,每隔10个心跳向NN发送一个blockreport,包含文件与block的关系、block和DN节点的关系,并存储在内存中,注意这两种关系是DN实时按blockreport汇报给NN的,不会存储在fsimage里面,也就不会存储在disk上。
当ND结点关闭的时候,也不会将fsimage与edits文件进行合并。

Secondary Namenode工作流程:
    SNN通知ND准备提交edits文件,此时主节点产生edits.new。
    SSN通过http get方式获取ND的fsimage与edits文件(在SSN的current同级目录下可见到temp.check-point或者previous-checkpoint目录,这些目录中存储着从NN拷贝来的镜像文件)。
    SSN开始合并获取的上述两个文件,产生一个新的fsimage文件fsimage.ckpt。
    SSN用http post方式发送fsimage.ckpt至ND。
    ND将fsimage.ckpt与edits.new文件分别重命名为fsimage与edits,然后更新fstime,整个checkpoint过程到此结束

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

1、3个副本机制

(1)2个副本放在本地机架上的不同节点,1个副本放在另外机架上的节点。

(2)1个副本放在本机机架上的节点,2个副本放在另外一个机架上的不同节点。

2、客户端写数据到HDFS的流程

3、客户端从HDFS读取数据的流程

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

HMaster在功能上主要负责Table表和HRegion的管理工作,具体包括:

1、管理用户对Table表的增、删、改、查操作;

2、管理HRegion服务器的负载均衡,调整HRegion分布;

3、在HRegion分裂后,负责新HRegion的分配;

4、在HRegion服务器停机后,负责失效HRegion服务器上的HRegion迁移。

regionServer 其实是hbase的服务,部署在一台物理服务器上,region有一点像关系型数据的分区,数据存放在region中,当然region下面还有很多结构,确切来说数据存放在memstore和hfile中。我们访问hbase的时候,先去hbase 系统表查找定位这条记录属于哪个region,然后定位到这个region属于哪个服务器,然后就到哪个服务器里面查找对应region中的数据

    Region是HBase数据存储和管理的基本单位。
    一个表中可以包含一个或多个Region。
    每个Region只能被一个RS(RegionServer)提供服务,RS可以同时服务多个Region,来自不同RS上的Region组合成表格的整体逻辑视图。

1,hbase regionserver 向zookeeper注册,提供hbase regionserver状态信息(是否在线)
2,hmaster启动时候会将hbase 系统表-ROOT- 加载到 zookeeper cluster,通过zookeeper cluster可以获取当前系统表.META.的存储所对应的regionserver信息。
HMaster主要作用在于,通过HMaster维护系统表-ROOT-,.META.,记录regionserver所对应region变化信息。此外还负责监控处理当前hbase cluster中regionserver状态变化信息。
        hbase regionserver则用于多个/单个维护region。
        region则对应为hbase数据表的表分区数据维护。

Client访问用户数据之前需要首先访问zookeeper,然后访问-ROOT-表,接着访问.META.表,最后才能找到用户数据的位置去访问,中间需要多次网络操作,不过client端会做cache缓存。

HDFS是Hadoop分布式文件系统。
HBase的数据通常存储在HDFS上。HDFS为HBase提供了高可靠性的底层存储支持。
Hbase是Hadoop database即Hadoop数据库。它是一个适合于非结构化数据存储的数据库,HBase基于列的而不是基于行的模式。
HBase是Google Bigtable的开源实现,类似Google Bigtable利用GFS作为其文件存储系统,HBase利用Hadoop HDFS作为其文件存储系统;Google运行MapReduce来处理Bigtable中的海量数据,HBase同样利用Hadoop MapReduce来处理HBase中的海量数据。
HDFS为HBase提供了高可靠性的底层存储支持,Hadoop MapReduce为HBase提供了高性能的计算能力,Zookeeper为HBase提供了稳定服务和failover机制。Pig和Hive还为HBase提供了高层语言支持,使得在HBase上进行数据统计处理变的非常简单。 Sqoop则为HBase提供了方便的RDBMS(关系型数据库)数据导入功能,使得传统数据库数据向HBase中迁移变的非常方便。

5.Hbase表与Region的关系

HBase 最核心模块,响应用户IO请求,向 HDFS 中读写数据,HRegionServer 内部管理了一系列 HRegion对象,每个 HRegion 对应 Table 中的一个Region,HRegion 由多个 HStore 组成,每个 HStore 对应 Table 中的一个 Column Familiy 的存储。

Region是 HBase集群分布数据的最小单位。

Region 是部分数据,所以是所有数据的一个自己,但Region包括完整的行,所以Region 是行为单位表的一个子集。

每个Region 有三个主要要素:

  它所属于哪张表

  它所包含的的第一行(第一个Region 没有首行)

  他所包含的最后一行(末一个Region 没有末行)

当表初写数据时,此时表只有一个Region,当随着数据的增多,Region 开始变大,等到它达到限定的阀值大小时,变化把Region 分裂为两个大小基本相同的Region,而这个阀值就是StoreFile 的设定大小(参数:hbase.hRegion.max.filesize 新版本默认10G) ,在第一次分裂Region之前,所有加载的数据都放在原始区域的那台服务器上,随着表的变大,Region 的个数也会相应的增加,而Region 是HBase集群分布数据的最小单位。

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

1. 从.META.表里面查询哪个Region包含这条数据。
2. 获取管理这个Region的RegionServer地址。
3. 连接这个RegionServer, 查到这条数据。

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

MapReduce的架构

MapReduce包含四个组成部分,分别为Client,JobTracker,TaskTracker,Task。
a)client客户端
每一个Job都会在用户端通过Client类将应用程序以及参数配置Configuration打包成Jar文件存储在HDFS,并把路径提交到JobTracker的master服务,然后由master创建每一个Task(即MapTask和ReduceTask),将它们分发到各个TaskTracker服务中去执行。

b)JobTracker
JobTracker负责资源监控和作业调度。JobTracker监控所有的TaskTracker与job的健康状况,一旦发现失败,就将相应的任务转移到其它节点;同时JobTracker会跟踪任务的执行进度,资源使用量等信息,并将这些信息告诉任务调度器,而调度器会在资源出现空闲时,选择合适的任务使用这些资源。在Hadoop中,任务调度器是一个可插拔的模块,用于可以根据自己的需要设计相应的调度器。

c)TaskTracker
TaskTracker会周期性地通过HeartBeat将本节点上资源的使用情况和任务的运行进度汇报给JobTracker,同时执行JobTracker发送过来的命令 并执行相应的操作(如启动新任务,杀死任务等)。TaskTracker使用“slot”等量划分本节点上的资源量。“slot”代表计算资源(cpu,内存等) 。一个Task获取到一个slot之后才有机会运行,而Hadoop调度器的作用就是将各个TaskTracker上的空闲slot分配给Task使用。slot分为MapSlot和ReduceSlot两种,分别提供MapTask和ReduceTask使用。TaskTracker通过slot数目(可配置参数)限定Task的并发度。

d)Task
Task分为MapTask和Reduce Task两种,均由TaskTracker启动。HDFS以固定大小的block为基本单位存储数据,而对于MapReduce而言,其处理单位是split。split是一个逻辑概念,它只包含一些元数据信息,比如数据起始位置、数据长度、数据所在节点等。它的划分方法完全由用户自己决定。但需要注意的是,split的多少决定了MapTask的数目,因为每一个split只会交给一个MapTask处理。split与block的关系如下图:

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

1、输入文本信息,由InputFormat -> FileInputFormat -> TextInputFormat,通过getSplits方法获得Split数组,然后在用getRecordReader 方法对Split做处理,每读一行交给一个map处理

  2、每个节点上的所有map,交由该节点上的Partitioner处理(Shuffling的过程),按key将map放在其他节点上去还是继续在该节点下处理

  3、排序

  4、结果交由reduce处理

  5、处理完成后由 OutputFormat ->FileOutputFormat ->TextOutputFormat 写到本地或Hadoop上