1.HDFS写数据流程
1)客户端发起请求,namenode检查请求的合法性.如果请求合法,客户端切分文件并发送第一个块文件
2)namenode查看自己的datanode池,负载均衡选出可用的datanode,并将可用的地址列表返回给客户端
3)客户端就近挑选地址,然后将文件写入缓存.缓存达到一个块的大小时,与所选地址建立连接并开始传输
4)第一个datanode以4k为单位接收数据并写入本地仓库,同时将数据传输到第二个datanode
5)第二个datanode,直至列表中的最后一个datanode,依次接收并转发数据
6)客户端发送第二个块文件,重复以上步骤,直至文件发送完成
(在流式复制时,逐级传输和响应采用响应队列来等待传输结果。队列响应完成后返回给客户端)
7)文件发送完成后,此次存储的事务完成.namenode接到通知,在目录树上记录新文件
2.副本放置策略
1)客户端 --> 第一个datanode:从namenode返回的地址列表中就近挑选
2)第一个datanode --> 第二个:从客户端转发的地址列表中,优先选择不同机架
3)第二个datanode --> 第三个:从上一个datanode转发的地址列表中,优先选择相同机架
3.namenode启动过程
1)镜像文件加载到内存
2)日志文件加载到内存
3)datanode汇报自己的存储情况
豪华版:
(1)加载镜像文件,还原了checkpoint时间节点前的元数据(包含目录结构,文件大小,块的大小,块的id等等信息),不包含块的存储位置
(2)加载edits文件,还原了checkpoint时间节点到集群停止的元数据,不包含块的存储位置。(至此namenode还原的元数据唯一缺失的就是块的存储位置)
(3)blockreport阶段,datanode启动,向namendoe汇报自己所管理的块及块的id,namenode根据块的ID还原块的存储位置
(4)在blockreport结束后,集群会判断,datanode的启动数量(可设置,默认为0),丢失的块的占比(可设置,默认0.999f)
是否满足退出安全模式的条件,如果满足,30秒后退出安全模式。在安全模式下namenode会删除多余的块
(副本数为3,结果实际存储4个。ps:这种情况发生在datanode宕机,集群把宕机的datanode管理的块进行了复制,而宕机的datanode又重新启动了)
还会复制低于副本数的块。
4.什么情况下会进入安全模式.安全模式的解决办法
1)hdfs刚启动时会有30秒的默认安全模式
2)datanode的存活数量低于阈值时(默认为0)
3)所存储文件的存活率低于阈值时(默认为0.999f)
解决:1)限时的安全模式可以等待自动退出
2)阈值异常导致的安全模式可以调低阈值
3)也可以解决异常,比如成功重启datanode或修复损坏的块文件
4)shell命令强行退出安全模式
5)重新格式化namenode
5.checkpoint过程及作用
过程:1)secondary namenode通知准备开始checkpoint
2)namenode新建一个日志继续写入,以方便secondary整理之前的日志文件
3)secondary namenode获取到这段时间产生的镜像和日志,并进行整理汇总
4)整理后的日志和镜像被回传给namenode,namenode做进一步整理,以备下次重启时加载
作用:1)分担namenode的工作
2)备份镜像和日志
6.namenode的工作职责
namenode:1)处理客户端的文件存取请求
2)管理元数据(目录树)
3)监控并管理datanode的集群状态
7.datanode的工作职责
datanode:1)负责块的存储
2)定时向namenode报告块的存储状况
8.datanode宕机后,集群能否立即将宕机的datanode下线,datanode下线后,集群将进行什么工作。
集群不能立即将宕机的datanode下线,而是:
1)心跳检测发现此datanode超时
2)默认等待10min30s确认datanode异常
3)将此datenode标记为dead
4)下一次report时,namenode检测到备份文件的缺失,负载均衡的将缺失的文件重新备份到别的datanode
9.将一个集群重新格式化namenode后,使用start-dfs.sh启动集群,datanode能启动起来么?为什么?
datandoe无法启动,或者启动后自动关闭
因为集群id(clusterid)发生改变
10.HDFS高可用原理
最关键的是消除单点故障
1)设立双namenode,一主一备
2)zookeeper集群监控namenode的工作状态
3)qjournal集群实时备份日志文件
4)正常情况下,备用的namenode定期进行checkpoint
5)主namenode宕机时,zfkc监控到状态异常,触发主备状态回调
6)zkfc利用zookeeper重新进行主备选举,根据选举结果更新主备状态
7)杀死原来的主namenode的相关进程,防止脑裂
11.zookeeper的应用场景
1)实时改变配置文件
2)分布式锁
3)动态上下线(查看在线人数)
12.阐述zookeeper分布式锁的实现原理
1)创建一个锁的永久节点
2)进程在永久节点上创建一个临时节点,并递增的生成id
3)id最小的进程可以执行,执行完成后释放执行权
4)每个进程监控自己的前一个id,等待锁的释放
13.ResourceManager的工作职责,NodeManager的工作职责
ResourceManager:计算资源的调度(cpu,内存等);
NodeManager:监控资源使用情况,控制计算的具体内容
14、说说你对分布式思想的理解
简而言之,分布式就是要分而治之
对高承载量的需求是分布式系统存在的原因,单个的计算机难以处理大型或超大型的数据
但如果使用分布式系统,廉价的、普通的机器集群就可以完成单个计算机无法完成的计算、存储任务
同时,分布式系统可以对数据进行分块和分片,以并发的执行计算任务,从而提高计算效率
但也存在一些问题,比如常见的网络故障和节点故障
15、离线分析项目的处理流程
1)数据获取并存储到hdfs
2)调用MapReduce对数据初步清洗
3)存入hive
4)ETL(Extract-Transform-Load)
5)存入sql
6)数据可视化
16、HDFS为什么不适合存储小文件?
1)HDFS的切块存储机制适于存储大文件
2)一个块的元数据大小大概在150B左右,而namenode内存是有限的
如果hdfs存储的都是小文件,那么namenode达到负载上限后,集群整体的文件承载量实际没有多少
17、分片的计算规则?
Math.max(minSize, Math.min(maxSize, blockSize));
18、如何调整maptask的并行度?
1)数据的分片决定了maptask的并行度,因此可以调整minSize, maxSize, blockSize
2)改变数据总量也可以影响maptask的并行度
19、如何调整reducetask的并行度?
Reducetask的数量可以直接手动设置:job.setNumReduceTasks(4);
20、分片信息都包含哪儿些内容
1)起始偏移量
2)分片大小
3)分片数据所在的块的信息
4)块所在的主机列表
21、简述下MR程序的执行全流程
1)MRAppMaster先启动,启动之后会计算出需要的maptask实例数量,然后向集群申请机器启动相应数量的maptask进程
2)maptask进程启动之后,根据给定的数据切片范围进行数据处理
3)MRAppMaster监控到所有maptask进程任务完成之后,会根据客户指定的参数启动相应数量的reducetask进程,并告知reducetask进程要处理的数据范围(数据分区)
4)Reducetask获取到maptask输出结果文件,在本地进行重新归并排序,然后按照相同key分组
5)依据reduce方法进行逻辑运算,最终将结果数据输出到外部存储
22、MR的shuffle流程
1)maptask收集map方法输出的kv对,放到内存缓冲区中
2)从内存缓冲区不断溢出本地磁盘文件,可能会溢出多个文件
3)多个溢出文件会被合并成大的溢出文件
4)在溢出及合并的过程中,都要调用partitoner进行分组和针对key进行排序
5)reducetask根据自己的分区号,去各个maptask机器上取相应的结果分区数据
6)reducetask会取到同一个分区的来自不同maptask的结果文件,reducetask会将这些文件再进行合并(归并排序)
7)合并成大文件后,shuffle的过程也就结束了,后面进入reducetask的逻辑运算过程(从文件中取出一个一个的键值对group,调用用户自定义的reduce()方法)
23、MR中可干预的组件
1)InputStream,输入流的选择
2)分片大小
3)分组方式(可自定义分组方法)
4)reduce的数量
5)OutputStream
24、分块和分片的区别,分块的好处。
区别:分块是在数据存储阶段,由提交存储申请的客户端完成的,对文件的物理切分
分片是MR程序运行时,MRappMaster对数据进行的逻辑切分
好处: 1)分块降低了大型文件的存储对配置的要求
2)分块可以方便的实现文件的并发读取