01_Hadoop企业面试题
2020-08-05 14:27:55 0 举报
AI智能生成
Hadoop企业面试题
作者其他创作
大纲/内容
你说你深刻理解MR的工作流程,你给我讲一下吧
1.在客户端执行submit()方法之前,会先去获取一下待读取文件的信息
2.将job提交给yarn,这时候会带着三个信息过去(job.split(文件的切片信息),jar.job.xml)
3.yarn会根据文件的切片信息去计算将要启动的maptask的数量,然后去启动maptask
4.maptask会调用InPutFormat()方法区HDFS上面读取文件,InPutFormat()方法会再去调用RecordRead()方法,将数据以行首字母的偏移量为key,一行数据为value传给mapper()方法
5.mapper方法做一些逻辑处理后,将数据传到分区方法中,对数据进行一个分区标注后,发送到环形缓冲区中
6.环形缓冲区默认的大小是100M,达到80%的阈值将会溢写
7.在溢写之前会做一个排序的动作,排序的规则是按照key进行字典序排序,排序的手段是快排
8.溢写会产生出大量的溢写文件,会再次调用merge()方法,使用归并排序,默认10个溢写文件合并成一个大文件,
9.也可以对溢写文件做一次localReduce也就是combiner的操作,但前提是combiner的结果不能对最终的结果有影响
10.等待所有的maptask结束之后,会启动一定数量的reducetask
11.reducetask会发取拉取线程到map端拉取数据,拉取到的数据会先加载到内存中,内存不够会写到磁盘里,等待所有的数据拉取完毕,会将这些输出在进行一次归并排序
12.归并后的文件会再次进行一次分组的操作,然后将数据以组为单位发送到reduce()方法
13.reduce方法做一些逻辑判断后,最终调用OutputFormat()方法,Outputformat()会再去调用RecordWrite()方法将数据以KV的形式写出到HDFS上
2.将job提交给yarn,这时候会带着三个信息过去(job.split(文件的切片信息),jar.job.xml)
3.yarn会根据文件的切片信息去计算将要启动的maptask的数量,然后去启动maptask
4.maptask会调用InPutFormat()方法区HDFS上面读取文件,InPutFormat()方法会再去调用RecordRead()方法,将数据以行首字母的偏移量为key,一行数据为value传给mapper()方法
5.mapper方法做一些逻辑处理后,将数据传到分区方法中,对数据进行一个分区标注后,发送到环形缓冲区中
6.环形缓冲区默认的大小是100M,达到80%的阈值将会溢写
7.在溢写之前会做一个排序的动作,排序的规则是按照key进行字典序排序,排序的手段是快排
8.溢写会产生出大量的溢写文件,会再次调用merge()方法,使用归并排序,默认10个溢写文件合并成一个大文件,
9.也可以对溢写文件做一次localReduce也就是combiner的操作,但前提是combiner的结果不能对最终的结果有影响
10.等待所有的maptask结束之后,会启动一定数量的reducetask
11.reducetask会发取拉取线程到map端拉取数据,拉取到的数据会先加载到内存中,内存不够会写到磁盘里,等待所有的数据拉取完毕,会将这些输出在进行一次归并排序
12.归并后的文件会再次进行一次分组的操作,然后将数据以组为单位发送到reduce()方法
13.reduce方法做一些逻辑判断后,最终调用OutputFormat()方法,Outputformat()会再去调用RecordWrite()方法将数据以KV的形式写出到HDFS上
HDFS分布式存储工作机制
HDFS是一个文件存存储系统,他的meta信息以及目录结构是存储在NameNode中的,文件是以block的形式存储在DataNode中,通过与NameNode交互,可以实现读写的操作
读操作
1.客户端会先带着读取路径向NameNode发送读取请求
2.NameNode接收到请求后,会先判断是否有权限,读取文件是否存在等等,如果都无误则将文件所在的DataNode的节点位置,发送给客户端部分或者全部的DataNode的节点位置
3.客户端得到文件块存储的位置后,会调用read()方法,去读取数据
4.在读取之前会先进行一个checksum的操作,去判断一下校验和是否正确,正确则读,不正确则去下一个存放该block块的DataNode节点上读取
5.读取完NameNode这次发送过来的所有的block块后,会再去询问是否还有block块,如果有则接着读取,如果没有则调用close方法,将读取到的文件合并成一个大文件
1.客户端会先带着读取路径向NameNode发送读取请求
2.NameNode接收到请求后,会先判断是否有权限,读取文件是否存在等等,如果都无误则将文件所在的DataNode的节点位置,发送给客户端部分或者全部的DataNode的节点位置
3.客户端得到文件块存储的位置后,会调用read()方法,去读取数据
4.在读取之前会先进行一个checksum的操作,去判断一下校验和是否正确,正确则读,不正确则去下一个存放该block块的DataNode节点上读取
5.读取完NameNode这次发送过来的所有的block块后,会再去询问是否还有block块,如果有则接着读取,如果没有则调用close方法,将读取到的文件合并成一个大文件
写操作
1.客户端会带着文件路径向NameNode发送写入请求
2.NameNode会去判断是否有权限,写入路径的父级目录是否存在,如都无误则发送可以写入的请求返回给客户端
3.客户端会将文件进行切分,然后上传block
4.NameNode会根据DataNode的存储空间还有机架感知原理等返回该block块将要存储的DataNode的位置 ABC
5.客户端会去ABC三个DataNode节点上建立pipeline A-B B-C然后C建立完成后会将结果返回给B B返回给A A返回给客户端
6.开始往A写入 依次进行流水线的复制
7.写入完后再去依次写入其他block块
8.都写入完成后会将写入完成的信息返回给NameNode
9.NameNode存储该文件的各个block块的元数据信息
1.客户端会带着文件路径向NameNode发送写入请求
2.NameNode会去判断是否有权限,写入路径的父级目录是否存在,如都无误则发送可以写入的请求返回给客户端
3.客户端会将文件进行切分,然后上传block
4.NameNode会根据DataNode的存储空间还有机架感知原理等返回该block块将要存储的DataNode的位置 ABC
5.客户端会去ABC三个DataNode节点上建立pipeline A-B B-C然后C建立完成后会将结果返回给B B返回给A A返回给客户端
6.开始往A写入 依次进行流水线的复制
7.写入完后再去依次写入其他block块
8.都写入完成后会将写入完成的信息返回给NameNode
9.NameNode存储该文件的各个block块的元数据信息
hadoopHA的架构原理
1.在两个节点上都安装一个NameNode
2.每个NameNode所在的节点中都有一个监控器
3.监控器会监控NameNode的状态,并在zk中注册节点
4.两个NameNode谁先在zk中注册成功则谁就是active状态,剩下的那个则是standby
5.如果active节点挂掉了,监控器则将zk中注册的节点注销掉
6.standby中的监控器一旦检测到zk中的节点消失,则立即注册并通知standby状态的NameNode开始工作,standby会先去远程执行kill -9 activeNameNode节点的端口 杀死他后 开始切换到active状态开始工作
7.activeNameNode和standbyNameNode是使用JN进行做主从复制的
2.每个NameNode所在的节点中都有一个监控器
3.监控器会监控NameNode的状态,并在zk中注册节点
4.两个NameNode谁先在zk中注册成功则谁就是active状态,剩下的那个则是standby
5.如果active节点挂掉了,监控器则将zk中注册的节点注销掉
6.standby中的监控器一旦检测到zk中的节点消失,则立即注册并通知standby状态的NameNode开始工作,standby会先去远程执行kill -9 activeNameNode节点的端口 杀死他后 开始切换到active状态开始工作
7.activeNameNode和standbyNameNode是使用JN进行做主从复制的
YARN的资源调度工作机制
1.客户端向RM提交作业
2.RM会去NM中开启一个container容器用来运行AM
3.AM会向RM注册自己
4.AM向RM申请响应数量的Container用来运行task任务
5.Container会先进行一个初始化的工作,初始化完成AM会通知对应的NM开启container
6.NM开启container
7.container在运行期间会向AM汇报自己的进度,状态等信息,并与AM保持心跳
8.等待应用执行完毕,AM向RM注销自己,并允许RM收回资源
2.RM会去NM中开启一个container容器用来运行AM
3.AM会向RM注册自己
4.AM向RM申请响应数量的Container用来运行task任务
5.Container会先进行一个初始化的工作,初始化完成AM会通知对应的NM开启container
6.NM开启container
7.container在运行期间会向AM汇报自己的进度,状态等信息,并与AM保持心跳
8.等待应用执行完毕,AM向RM注销自己,并允许RM收回资源
说一下hadoop的组成结构
1.HDFS
管理者:namenode
工作者:DataNode
辅助管理者:secondaryNameNode
2.MapReduce
3.YARN
管理者:ResourceManage
工作者:NodeManage
管理者:namenode
工作者:DataNode
辅助管理者:secondaryNameNode
2.MapReduce
3.YARN
管理者:ResourceManage
工作者:NodeManage
MR的shuffle过程
mapper()方法做业务逻辑处理,然后将数据传到分区方法中,给数据标记好分区,将数据发送到环形缓冲区
环形缓冲区默认100M,达到80%的阈值进行溢写操作
溢写之前会进行排序,排序的规则是字典序排序,排序的手段呢是快排
溢写会产生很多溢写文件,溢写文件默认达到10个会进行合并,合并时采用的算法是归并排序
也可以进行combiner局部聚合的操作,前提是局部聚合的结果不会对最终的结果有影响
等到所有的maptask运行完毕,会启动一定数量的reducetask,并告知reducetask读取数据的范围(也就是分区)
reduceTask发取拉取线程,去map端拉取数据,拉过来的数据会先存储到内存中,内存放不下了就放到磁盘中,等到数据拉取完毕之后会再进行一个归并排序
然后再对数据进行分组,以组为单位将数据发送到reduce()方法中
Hadoop的垃圾回收机制
HDFS的回收站必须是开启的,一般设置为7天
hadoop nn配置G1垃圾回收器
Hadoop怎么离线查看小文件
1.使用hdfs命令获取FsImage数据文件 -- hdfs dfsadmin -fetchImage ./tmp_meta
2.使用hdfs oiv命令解析FsImage文件 -- hdfs oiv -i ./tmp_meta/fsimage_0000000000008236656 -o ./tmp_meta/fsimage.csv -p Delimited
3.将解析的csv文件加载到Hive的HDFS_META_TEMP表中
4.使用Sqoop脚本将Hive元数据中关于Hive库和表的信息抽取的Hive中
5.执行base.sql文件创建分析的Impala表
6.执行analyse_sql/all_hdfs.sql语句通过各个维度查找小文件
mapreduce为什么分两部分,为什么不直接map或直接reduce
是为了实现分布式计算,提高计算效率。
很多情况下都是需要对整个数据集进行计算操作,单单的分成每个单独的小部分虽然能提高计算效率,但是导致无法完成实际需求,是没有任何意义的,
所以添加一个reduce阶段,负责将分成多个部分计算的结果汇总进行处理,使得更加能满足一般需求。
HDFS小文件怎么处理的
小文件的危害
每个文件在NameNode中存储大约占150个字节
小文件过多会影响namenode的寿命
影响MR的执行任务的数量,因为MR会对一个小文件开启一个Maptask,maptask任务过多则会导致频繁的开启关闭,降低了执行效率
在Flume阶段配置参数解决这个问题
配置参数
先生成临时文件,达到128M或者是1个小时滚成一个新的文件
使用Hadoop自带的HAR
将多个小文件打包成一个正式文件,NameNode中的元数据也就存储一份
CombineFileInputFormat
MR读取数据时将对个小文件当做一个文件,只起一个MapTask,提高了任务的执行效率
map任务和reduce在哪儿运行的
我们将MR程序提交到了YARN上
Maptask和reducetask运行在container上
Hadoop文件大小怎么切分
Hadoop的切片原则是按照块大小(默认128M)进行切分
yarn的三个核心组件
ResourceManage 负责整个集群资源的分配
NodeManage 每个节点上的资源管理器
ApplicationMaster 单个应用程序的管理者
怎么进行集群监控,例如哪些节点down掉,失效?
1、看主机情况是否正常,是否有主机失效;
2、看hdfs哪些节点失效,去所在主机看日志。
Namenode 线程数过少会报什么错误?
如设置太小,DataNode在传输数据的时候日志中会报告“connecton refused"信息
0 条评论
下一页
为你推荐
查看更多