Hadoop面试题
Hadoop种常问的就三块:
第一:分布式存储(HDFS)
第二:分布式计算框架(MapReduce)
第三:资源调度框架(YARN)
1.hadoop1和hadoop2的架构异同
**hadoop1组成:**MapReduce(计算+资源调度),HDFS(数据存储),Common(辅助工具)
**hadoop2组成:**MapReduce(计算),Yarm(资源调度),HDFS(数据存储),Common(辅助工具)
在hadoop1时代,hadoop中的MapReduce同时处理业务逻辑运算和资源的调度,耦合度较大
在hadoop2时代,增加了Yarm。Yarm只负责资源的调度,MapRedecue只负责运算。另外,hadoopHA加入了对zookeeper的支持实现比较可靠的高可用
hadoop3可以理解为hadoop的生态圈
2.介绍hadoop中的HDFS
HDFS是一个文件系统,用于存储文件,通过目录树来定位文件;其次,它是分布式的,由多个服务器联合起来实现其功能,集群中的服务器有各自的角色。
HDFS的使用场景:适合一次写入,多次读出的场景。一个文件经过创建,写入和关闭之后就不需要改变。
**HDFS优点 **
1)高容错性
1.数据自动保存多个副本,通过增加副本的形式,提高容错性
2.某一个副本丢失后,它可以自动恢复
2)适合处理大数据
1.能够处理的数据规模达到GB,TB,PB
2.能够处理百万规模以上的文件数量
3)可构建在廉价服务器上,通过多副本机制,提高可靠性
HDFS缺点
1)不适合低延时数据访问。理解为即时数据访问
2)无法高效的对大量小文件进行存储
1.存储大量小文件的话,会占用NameNode大量的内存来存储文件目录和块信息。但其内存式有限的
2.小文件存储的寻址时间会超过读取时间,违反了HDFS的设计目标
3.HDFS的block大小可以设置,默认为126M.
3)不支持并发写入、文件随机修改
1.一个文件只能由一个写,不允许多个线程同时写
2.仅支持数据append(追加),不支持文件的随机修改
3.Hadoop的运行模式
共有3中运行模式:
本地模式:单机运行,用来演示,生产环境不可用
伪分布式模式:也是单机模式,但是具备hadoop集群的所有功能。生产环境不可用
完全分布式:多台服务器组成分布式环境,生产环境使用
4.Hadoop生态圈的组件
1)zookeeper:一个开源的分布式协调服务框架,为分布式系统提高一致性服务,基于zookeeper可以实现数据同步,统计配置,命名服务。
2)Flume:一个分布式的海量日志采用,聚合和传输的系统
3)Hbase:一个分布式的,面向列的开源数据库,利用HDFS作为其存储系统
4)Hive:基于Hadoop的一个数据仓库工具,可以将结构化的数据映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行
5)Sqoop:将一个关系型数据库中的数据导入到Hadoop的HDFS中,也可以将HDFS的数据导入到关系型数据库中
5.hadoop和hadoop生态系统
Hadoop是指Hadoop框架
Hadoop生态系统:不仅包含hadoop,还包括保证hadoop正常高效运行的其他框架
6.Hadoop的组成框架
(一)NameNode(nn):就是Master。负责管理整个文件系统的元数据,所有的文件路径和数据块的存储信息都保存在nn中。NN处理客户端读写请求,分发给DN去执行
(二)DataNode(DN):就是Slave,存储实际的数据块,执行真正的读写操作
(三)Client:就是客户端
1.文件切分。文件上传HDFS的时候,Client将文件切分为一个一个的Block,进行上传
2.与NN交互,获取文件的位置信息。与DN交互,读取或者写入数据
3.Client提供一些命令来管理HDFS,也可以通过一些命令访问HDFS
(四)SecondaryNameNode:并非NN的热备。其定期触发CheckPoint(服务),代替NN合并编辑日志EditLog和镜像文件Fsimage,从而减小EditLog的大小,减少NN的启动时间,
7.HDFS的文件块大小影响
HDFS中的文件在物理上是分块存储的,块大小可以通过配置参数规定
如果一个文件小于规定大小,其只能占文件本身大小的空间
在寻址流程中: 寻址时间为传输时间的1%时,为最佳状态
为什么块的设置不能太大,不能太小?
HDFS块设置太小,会增加寻址时间。块小,文件大,则存储的块多,寻址时间多
HDFS块设置太大,从磁盘传输数据的时间明显大于寻址的时间
**总结:**HDFS块的大小设置主要取决于磁盘传输速率。一般设置为128M.固态硬盘传输速率块,设置为256M.
8.HDFS的写数据流程
1.client向NN请求上传文件,NN检查其权限,判断文件是否已经存在
2.如果权限许可,目标文件也存在,NN进行响应,返回是否可以上传文件
3.客户端请求第一个Block上传到哪几个DN上
4.NN返回3个DN节点(默认为3)
5.客户端创建数据流对象,通过该对象请求dn1上传数据,dn1收到请求会继续调用dn2,然后dn2调用dn3。这样dn1~dn3通信通道建立完成
6.传输通道建立完成后,dn1,dn2,dn3逐级应答客户端
7.客户端开始往dn1上传第一个Block,以Packet为单位,dn1收到Packet传给dn2,dn2传给dn3
8.当一个block传输完成之后,客户端请求NN来上传第二个Block到服务器
9.当所有的Block传输完毕后并确认后,客户端关闭数据流对象。然后联系NN,确认数据写完成。NN在内存中对元数据进行增删改。
9.机架感知(副本存储节点选择策略)
默认情况下,HDFS中的数据块有3个副本。副本存储策略如下(看源码):
第一个副本在Client所处的节点上。如果客户端在集群外,随机选一个。
第二个副本在另一个机架的随机一个节点
第三个副本在第二个副本所在机架的随机节点
第四个及以上,随机选择副本存放位置。
这么选择的好处:
第一个副本在本地,考虑到结点距离最近,上传速度最快
第二个副本在另一个机架的节点上,考虑到数据的可靠性
第三个副本在第二个副本所在机架的节点,又要兼顾对应的效率
10.HDFS读数据流程
1.client向NN请求下载文件
2.挑选一台DN服务器,请求读取数据
3.DN开始传输数据给客户端,串行读取,即先读取第一个块,在读取第二个块拼接到上一个块后面
4.客户端以Packet为单位接收,现在本地缓存,然后写入目标文件
11.NN和2NN工作机制(元数据持久化机制)
(一)第一阶段:NameNode 启动
(1)第一次启动 NameNode 格式化后,创建 镜像文件fsimage 和 编辑日志edits_inprogress_001 文件。如果不是第一次启动,直接加载编辑日志和镜像文件到内存。
(2)客户端对元数据进行增删改的请求。
(3)NameNode 记录更新操作到edits_inprogress_001(编辑日志) 中
(4)NameNode 在内存中对元数据进行增删改(然后再通过SecondaryNameNode对元数据进行修改)。
(二)第二阶段:Secondary NameNode 工作
(1)Secondary NameNode 询问 NameNode 是否需要 CheckPoint(即是否需要服务),带回 NameNode是否可服务的条件。CheckPoint触发条件:定时时间到;Edits中的数据满了。
(2)Secondary NameNode 请求执行 CheckPoint(即请求服务)。
(3)NameNode 滚动正在写的 edits_inprogress_001 日志,将其命名为edits_001,并生产新的日志文件edits_inprogress_002,以后再有客户端操作,日志将记录到edits_inprogress_002中。
(4)将编辑日志edits_001和镜像文件fsimage拷贝到 SecondaryNameNode。
(5)Secondary NameNode 加载编辑日志和镜像文件到内存,并合并。
(6