1、简述HDFS的体系结构
hdfs采用了一个master和多个slave的这种主从结构。分四个部分,
一个是namenode:
- 管理HDFS的命名空间,并以fsimage持久化保存。
- 在内存中维护数据块的映射信息
- 实施副本冗余策略
- 处理客户端的访问请求,并以edit持久化保存
多个datanode:
- 存储真正的数据(块进行存储)
- 执行数据块的读操作
- 心跳机制(3秒)
一个是secondarynamenode
- 帮助NameNode合并fsimage和edits文件
一个是客户端接口
- HDFS实际上提供了各种语言操作HDFS的接口。
- 与NameNode进行交互,获取文件的存储位置(读/写两种操作)
- 与DataNode进行交互,写入数据,或者读取数据
- 上传时分块进行存储,读取时分片进行读取
2、简述HDFS的写流程
1. 客户端获取一个分布式文件系统对象,调用此对象的create方法,向namenode请求创建文件。
2. namenode进行校验,客户端是否有权限等,如果校验通过,就在内存里维护一个记录(元数据),
并返回给客户端一个FSDataOutputStream对象
3. 客户端调用对象的write方法,从namenode获取第一个块的三个最佳节点,组成socket构成的Pipelne管道.
然后将要写出的数据封装成packet对象,存储到数据队列(dataqueue)中,由DataStreamer线程进行管理,
将队列中的每一个packet以流式的方式发送到管道的第一个节点,第一个节点写完后,会发送给第二个节点,
第二个节点写完后,会发送给第三个节点。
4. DataStreamer在将一个个的packet传输到管道中时,同时也会将packet移至另一个队列ackqueue。
5. 线程ResponseStreamer在收到管道中的所有节点成功写入的消息回执后,会相应的将packet从ackqueue队列中删除。
6. 当一个块写完后,会重复3,4,5步。直到写完整个文件,调用close方法关闭流对象,并向namenode汇报,已结束写操作。
3、简述HDFS的读流程
1. 客户端通过调?FileSystem对象的open()?法来打开希望读取的?件,对于
HDFS来说,这个对象是DistributedFileSystem,它通过使?远程过程调?(RPC)
来调?namenode,以确定?件起始块的位置
2. 对于每?个块,NameNode返回存有该块副本的DataNode地址,并根据距离客户端
的远近来排序。
3. DistributedFileSystem实例会返回?个FSDataInputStream对象(?持?
件定位功能)给客户端以便读取数据,接着客户端对这个输?流调?read()?法
4. FSDataInputStream随即连接距离最近的?件中第?个块所在的DataNode,通过
对数据流反复调?read()?法,可以将数据从DataNode传输到客户端
5. 当读取到块的末端时,FSInputStream关闭与该DataNode的连接,然后寻找下?
个块的最佳DataNode
6. 客户端从流中读取数据时,块是按照打开FSInputStream与DataNode的新建连接
的顺序读取的。它也会根据需要询问NameNode来检索下?批数据块的DataNode的位
置。?旦客户端完成读取,就对FSInputStream调?close?法
注意:在读取数据的时候,如果FSInputStream与DataNode通信时遇到错误,会尝
试从这个块的最近的DataNode读取数据,并且记住那个故障的DataNode,保证后续不
会反复读取该节点上后续的块。FInputStream也会通过校验和确认从DataNode发来
的数据是否完整。如果发现有损坏的块,FSInputStream会从其他的块读取副本,并
且将损坏的块通知给NameNode
4、简述zookeeper的数据模型
--1. 是一个类似Unix文件系统的层次化树形结构
--2. 每一个节点都被称之为znode,而不是文件或目录
--3. znode可以存储1M以内的数据,类似文件系统的文件(zookeeper是用来协调服务的,而不是用来存储数据)
--4. znode可以存储子节点的名称,类似文件系统的目录
--5. znode使用绝对路径进行唯一标识
5、简述mr的shuffle流程
1. 从map函数输出到reduce函数接受输入数据,这个过程称之为shuffle.
2. map函数的输出,存储环形缓冲区(默认大小100M,阈值80M)
3. 当达到阈值时,准备溢写到本地磁盘(因为是中间数据,因此没有必要存储在HDFS上)。在溢写前要对数据进行分区整理,然后进行排序(quick sort,字典排序)
4. 如果有必要,可以在排序后,溢写前调用combiner函数进行运算,来达到减少数据的目的
5. 溢写文件有可能产生多个,然后对这多个溢写文件进行再次归并排序(也要进行分区和排序)。当溢写个数>=3时,可以再次调用combiner函数来减少数据。如果溢写个数<3时,默认不会调用combiner函数。
6. 合并的最终溢写文件可以使用压缩技术来达到节省磁盘空间和减少向reduce阶段传输数据的目的。(最终溢写文件是一个,存储在本地磁盘中)
7. Reduce阶段通过HTTP协议抓取属于自己的分区的所有map的输出数据(默认线程数是5,因此可以并发抓取)。
8. 抓取到的数据存在内存中,如果数据量大,当达到本地内存的阈值时会进行溢写操作,在溢写前会进行合并和排序(排序阶段),然后写到磁盘中,
9. 溢写文件可能会产生多个,因此在进入reduce之前会再次合并(合并因子是10),最后一次合并要满足10这个因子,同时输入给reduce函数,而不是产生最终一个临时合并文件(减少一次磁盘IO)。reduce函数输出数据会直接存储在HDFS上。
6、简述yarn的job提交流程
1. 调用waitForCompletion方法每秒轮询作业的进度,内部封装了submit()方法,用于创建JobCommiter实例,
并且调用其的submitJobInternal方法。提交成功后,如果有状态改变,就会把进度报告到控制台。错误也会报告到
控制台
2. JobCommiter实例会向ResourceManager申请一个新应用ID,用于MapReduce作业ID。这期间JobCommiter也会进行检查输出路径的情况,以及计算输入分片。
3. 如果成功申请到ID,就会将运行作业所需要的资源(包括作业jar文件,配置文件和计算所得的输入分片元数据文件)上传到一个用ID命名的目录下的HDFS上。此时副本个数默认是10.
4. 准备工作已经做好,再通知ResourceManager调用submitApplication方法提交作业。
5. ResourceManager调用submitApplication方法后,会通知Yarn调度器(Scheduler),调度器分配一个容器,在节点管理器的管理下在容器中启动 application master进程。
6. application master的主类是MRAppMaster,其主要作用是初始化任务,并接受来自任务的进度和完成报告。
7. 然后从HDFS上下载资源,主要是split和计算程序。然后为每一个split创建MapTask以及参数指定的ReduceTask,任务ID在此时分配
8. 然后Application Master会向资源管理器请求容器,首先为MapTask申请容器,然后再为ReduceTask申请容器。(5%)
9. 一旦ResourceManager中的调度器(Scheduler),为Task分配了一个特定节点上的容器,Application Master就会与NodeManager进行通信来启动容器。
10. 运行任务是由YarnChild来执行的,运行任务前,先将资源本地化(jar文件,配置文件,缓存文件)
11. 然后开始运行MapTask或ReduceTask。
12. 当收到最后一个任务已经完成的通知后,application master会把作业状态设置为success。然后Job轮询时,知道成功完成,就会通知客户端,并把统计信息输出到控制台
7、Hbase的体系结构
有以下组件:
Client:
1. 提供了访问Hbase的接口API
2. 并且维护了一个缓存,目的是加速访问hbase的效率,存储了region的位置信息
Zookeeper
1. 监控hmaster,保证有一个活跃的master来管理集群。达到高可用的效果。
2. 监控hregionserver,感知hregionserver的在线状态,并通知hmaster
3. 可以存储hbase的元数据。比如存储meta表的位置信息
Hmaster:
1. 负责管理region的分配(比如建表产生的region,宕机后的重新分配,region的裂变)
2. 负责regionserver的负载均衡
3. 负责客户端的schema请求
4. 负责hdfs上的垃圾回收
Hregionserver:
1. 管理本机上的region,比如新建表时master分配过来的region,region的切分等
2. 真正负责客户端的读写请求
3. 负责与hdfs上交互(客户端的访问记录hlog,storefile的存储)
HLog:
1. 记录客户端的访问请求,可以在机器宕机后进行回滚。保证数据不丢失
2. hlog的存储结构是WAL格式
HRegion:
1. 是hbase的最小存储单元,是一张表,或者是一张表的一部分
2. region有自己的name,以及行范围startkey,endkey
Store:
1. store对应一个列族,在hdfs上的本质是一个目录,存储该列族下的所有单元格数据
2. 内部维护了一个memstore
memStore:
1. 用来存储客户端向该store写入的单元格,默认大小是128M。
Storefile
1. 当memStore达到阈值(1小时|128M|内存的40%)时,会flush出文件,该文件就是storefile,数量可能有很多,大小不一。
Hfile:
1. storefile在hdfs上的存储格式
|