04 Hadoop思想与原理 第四次作业

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

答:Hadoop起源:Hadoop是一个对海量数据存储和海量数据分析计算的分布式系统。从hadoop最初的原型来看,hadoop已经远远超过了本身的批处理。从广义上来说,hadoop现在可以是指更广泛的一个hadoop生态了,而不仅仅是HDFS,MapReduce和Yarn。例如Hive,Hbase,Flume,Sqoop等等项目都属于这个生态。
Hadoop发展:Hadoop是道格·卡丁(Doug Cutting)创建的,Hadoop起源于开源网络搜索引擎Apache Nutch,后者本身也是Lucene项目的一部分。Nutch项目面世后,面对数据量巨大的网页显示出了架构的灵活性不够。当时正好借鉴了谷歌分布式文件系统,做出了自己的开源系统NDFS分布式文件系统。第二年谷歌又发表了论文介绍了MapReduce系统,Nutch开发人员也开发出了MapReduce系统。随后NDFS和MapReduce命名为Hadoop,成为了Apache顶级项目。

 

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

答:名称节点:负责管理分布式文件系统的命名空间,里面包含了两个核心的数据结构,即FsImage和EditLog。FsImage用户文件树以及所有的文件和文件夹的元数据。EfitLog记录的是文件的增删改查。
首次安装format格式化就是在本地生成FsImage。首次安装format格式化就是在本地生成FsImage。
HDFS的更新都会被写入到FsImage中而不是EditLog,因为对于分布式而言,FsImage非常庞大,直接对FsImage速度非常慢。HDFS的更新都会被写入到FsImage中而不是EditLog,因为对于分布式而言,FsImage非常庞大,直接对FsImage速度非常慢。
数据节点(DataNode):定期向名称节点发送自己的存储块的列表。数据节点(DataNode):定期向名称节点发送自己的存储块的列表。

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

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

 

 

 

 

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与HDFS的关系。

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

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

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

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

hbase的寻址机制

hbase 的一个表最终拆分成 一个个region,每一个region可能会存储在不同的regionserver上,会有独立编号。
无论是 读|写 操作,首先要快速定位到 写|读 是在哪一个region中进行,然后到对应的存储的regionserver上找对应的region,直接读取数据。
快速定位哪一个region存在哪一个regionServer上的过程,就叫寻址,要想知道寻址机制,需要先了解hbase的存储机制。

 

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

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

·同理,每个.META.表的Region可以寻址的用户数据表的Region个数2GB/1KB= 2^33·最终,三层结构可以保存的Region数目是(2GB/1KB)×(2GB/1KB)= 2^66Region

 

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

JobClient
每一个job 都会在客户端通过JobClient类将应用程序以及作业的配置参数打包成jar文件存储在HDFS,并把作业提交给 JobTracker。

JobClient.runJob()创建一个新的 JobClient实例,调用其submitJob()函数。
JobClient将作业提交给JobTracker之前,需要进行一些初始化工作,由JobClient.subnitJobInternal(job)完成,包括:(1)向JobTracker请求一个新的 job ID;(2)检测 job的output 配置;(3)计算 job的input splits;(4)将Job运行所需的资源上传到JobTracker的文件系统(HDFS)中的文件夹中,包括 job jar文件,job.xml 配置文件。这些 MapReduce文件的上传以及下载是有 Hadoop的数据分发工具DistributedCache完成。

JobTracker
JobTracker是一个master服务,主要完成作业的控制和资源的管理。作业的控制主要包括作业的分解和状态的监控,作业的监控是由三层树状结构表示,自顶向下为JobInProgress、TaskInProgress和Task Attempt。资源的管理主要包括资源的表示和分配,MRv1基于slot表示资源,MRv2基于Linux Container表示资源,资源的分配是由TaskScheduler完成,即JobClient通过RPC调用的方法submitJob,会为该作业创建JobInProgress对象,用于追踪正在运行作业的状态和进度,并通知TaskScheduler初始化作业,默认为JobQueueTaskScheduler,也即按照 FIFO的方式调度任务,然后TaskScheduler将任务列表分配给TaskTracker。

TaskTracker
TaskTracker是运行于多个节点上的slave服务,主要完成向JobTracker汇报心跳和执行JobTracker的命令。汇报心跳的信息包括结点状态、资源使用情况、任务的执行进度、任务的运行状态以及Counter值。JobTracker收到TaskTracker汇报的心跳信息后,根据这些信息以及作业的运行状况给TaskTracker下达命令,包括LaunchTaskAction、CommitTaskAction、KillTaskAction、KillJobAction和TaskTrackerReinitAction。
TaskTracker主动与JobTracker通信,接收作业并负责直接执行每一个任务。TaskTracker作为一个单独的JVM来运行,TaskTracker周期性的向JobTracker发送heartbeat。在heartbeat中,TaskTracker告知JobTracker其已经准备运行一个新的task,JobTracker 将分配给其一个task。
TaskTracker被分配了一个task,下面便要运行此task。首先,TaskTracker将此job的jar从共享文件系统中拷贝到TaskTracker的文件系统HDFS中。TaskTracker从DistributedCache 中将job运行所需要的文件拷贝到本地磁盘。其次,其为每个task创建一个本地的工作目录,将jar解压缩到文件目录中。其三,TaskRunner创建一个新的JVM来运行task 。


Map过程

Map Task从input split 中读取一个个的 record,然后依次调用Mapper的 map函数,将结果写入缓存memory buffer。当 buffer中数据的到达一定的大小,一个后台线程 SpillThread将数据开始写入硬盘。在写入硬盘之前,将 buffer中的数据通过Partitioner分成多个 partition。Partitioner接口根据key或value及reduce的数量来决定当前的key/value对最终应该交由哪个reduce task处理。在同一个 partition中,SpillThread 线程会将数据按照 key在内存中排序。每次从内存向硬盘 flush数据,都生成一个新的spill文件。当此 task结束之前,所有的spill文件被合并为一个整的被 partition的而且排好序的文件。reducer可以通过 http协议请求map 的输出文件, tracker.http.threads可以设置http 服务线程数。

Reduce过程
Reduce Task同时启动多个MapOutputCopier线程,从 schedulerCopies列表中获取Map Task 的输出位置,通过 Http Get从各个Map Task 上远程拷贝数据,先写入内存,其大小超过一定阈值,这时写入磁盘。与此同时, Reduce Task启动LocalFSMerger 和InMemFSMergerThread两个线程分别对磁盘和内存中的数据进行合并。当所有的 map输出都拷贝到Reduce Task后,进入sort过程,将所有的map输出合并为大的排好序的文件。最后进入reduce过程,调用reducer 的reduce函数,处理排好序的输出的每个 key,最后的结果写入HDFS。

 


Shuffle过程
shuffle位于Map过程和Reduce过程之间,下面从map端和reduce端分别介绍。
map端:
1、在map task执行时,读取split,经过mapper的运行后,输出key/value对,将key/value对写入内存缓冲区中,减少磁盘IO的影响。key/value对以及Partition的结果都会被写入缓冲区。写入之前,key与value值都会被序列化成字节数组;
2、内存缓冲区是有大小限制的,默认是100MB,在一定条件下将缓冲区中的数据临时Spill(溢写)到磁盘,然后重新利用这块缓冲区。溢写是由单独线程来完成,不影响往缓冲区写map结果的线程。整个缓冲区溢写的比例spill.percent,默认0.8,溢写线程启动,锁定这80MB的内存,执行溢写过程。Map task的输出结果还可以往剩下的20MB内存中写。 溢写线程启动后,需要对这80MB空间内的key做排序(Sort)。写到磁盘中的溢写文件是对不同的reduce端的数值做过合并(combine)。
3、每次溢写会在磁盘上生成一个溢写文件,当map task完成时,内存缓冲区中的数据也全部溢写到磁盘中形成一个溢写文件,最后将所有溢写文件归并到一起(Merge)。

reduce端:
map端的所有工作都已结束,每个reduce task不断地通过RPC从JobTracker那里获取map task是否完成的信息,如果reduce task得到通知,获知某台TaskTracker上的map task执行完成,Shuffle的后半段过程开始启动。
1、Copy过程。Reduce进程启动一些数据copy线程、,通过HTTP方式请求map task所在的TaskTracker获取map task的输出文件。
2、Merge阶段。Copy过来的数据会先放入内存缓冲区中,这里的缓冲区大小要比map端的更为灵活,它基于JVM的heap size设置,因为Shuffle阶段Reducer不运行,所以应该把绝大部分的内存都给Shuffle用。当内存中的数据量到达一定阈值,就启动内存到磁盘的merge。与map端类似,进行溢写和合并(执行Combiner),然后在磁盘中生成了多个的溢写文件。内存到磁盘的merge一直在运行,直到没有map端的数据时才结束,然后启动磁盘到磁盘的merge方式生成最终的Reducer的输入文件。
3、Reducer的输入文件。当Reducer的输入文件已定,整个Shuffle才最终结束。然后就是Reducer执行,把结果放到HDFS上。

9.MapReduce的工作过程,用自己词频统计的例子,将split, map, partition,sort,spill,fetch,merge reduce整个过程梳理并用图形表达出来。

 

 

 

 

posted @ 2021-10-26 14:42  LBxl  阅读(70)  评论(0编辑  收藏  举报