概述
hadoop组成?
MapReduce 计算
Yarn 资源调度
hdfs 数据存储
Common 辅助工具
如何安装hadoop?
1.安装jdk 安装hadoop
2.格式化 hadoop namenode-format
3.启动节点 start-all.sh
hadoop中需要哪些配置文件?
1)core-site.xml 全局配置
2)hdfs-site.xml hdfs的局部配置
3)mapred-site.xml mapred的局部配置
4)yarn-site.xml yarn的局部配置
hadoop启动那些进程?他们的作用分别是什么?
1)NameNode 管理文件系统元数据
2)SecondaryNameNode 帮助NameNode合并镜像文件和编辑日志
3)DataNode 每个存储数据的节点都会运行一个dataNode守护进程
4)ResourceManager 负责调度DataNode上的工作
5)NodeManager 执行任务
hadoop几个默认端口及含义?
1)dfs.namenode.http-address:50070 web端查看HDFS文件系统
2)yarn.resourcemanager.webapp.address:8088 web端查看yarn
HDFS写入流程?
1)客户端向namenode请求上传文件,namenode检查目标文件是否已存在返回是否可以上传
2)客户端请求一个block上传到那几个datanode服务器上,namenode返回可上传的datanode节点
3)客户端请求datanode上传数据,datanode应答客户端是否可以上传数据
4)客户端开始往datanode上传第一个block,当一个block传输完成后,客户端再次请求上传第二个block
HDFS读取流程?
1)客户端向namenode请求下载文件,namenode通过查询元数据找到文件块所在的datanode地址
2)挑选一台datanode(就近原则)服务器,请求读取数据
3)datanode开始传输数据给客户端
4)客户端接收
NameNode与SecondaryNameNode区别?
1)NameNode 负责管理文件系统的元数据,以及每一个路径所对应的数据块信息
2)SecondaryNameNode 辅助NameNode工作,帮助NameNode合并镜像文件和编辑日志
3)NameNode 发生故障时,假如没有及时备份数据可以从SecondaryNameNode恢复数据,不是无损恢复
服役新节点和退役旧节点步骤?
1)服役新节点
(1)将新节点添加到白名单
(2)直接启动DataNode,即可关联到集群
2)退役旧节点
(1)将退役节点添加到黑名单
(2)刷新NameNode、刷新ResourceManager
namenode挂了怎么办?
使用-importCheckpoint选项启动namenode守护进程,将SecondaryNameNode中数据拷贝到namenode存储数据的目录
序列化反序列化以及自定义bean对象实现序列化?
hadoop自己开发了一套序列化机制,hadoop序列化特点:高效的使用了存储空间,读写数据快,可升级可扩展,支持多语言交互
自定义bean对象实现序列化接口:
1)实现Writable 接口
2)重写序列化 反序列化方法
3)反序列化必须有空参构造
4)注意反序列化的顺序和序列化的顺序完全一致
如何决定一个job的map和reduce的数量?
1)map数量是由切片数量决定的
2)reduce数量由job.setNumReduceTasks(x)设置,不设置默认1
MapReduce有几种排序?以及排序阶段?
部分排序,全排序,辅助排序,二次排序,自定义排序。
自定义排序实现WritableComparable接口,重写compareTo方法。
除了辅助排序其他都发生在map阶段,辅助排序发生在Reduce阶段。
如果没有定义partitioner,那么数据在被送达reducer前是如何被分区的?
如果没有自定义的partitioning,则默认的partition算法,即根据每一条数据的key的hashcode值模运算(%)reduce的数量,得到的数字就是分区号。
MapReduce怎么实现TopN?
可以自定义groupingcomparator,或者在map端对数据进行排序,然后在reduce输出时,控制只输出前n个数就达到了topn输出的目的。
有可能使Hadoop任务输出到多个目录中么?如果可以怎么做?
1)可以输出到多个目录中,采用自定义outputformat
2)实现步骤 自定义outputformat 然后 改写recordwriter,具体改写输出数据的方法write()
简述hadoop实现join的几种方法及每种方法的实现?
1)reduce join
将来源不同的文件在map阶段打标记区分开,在reduce端进行合并
2)map join
在map端缓存多张表,提前处理业务逻辑,减少reduce端数据压力,
具体办法
//缓存普通文件
job.addCacheFile(new URI("file:/e/mapjoincache/pd.txt"));
hadoop怎么实现二级排序?
对map端输出的key进行排序,实现compareTo方法
shuffle工作机制?
如何优化shuffle?
分区,排序,溢写,拷贝到对应reduce机器上,增加combiner,压缩溢写文件
MapReduce工作流程?
MapTask工作机制?
Reduce工作机制?
自定义InputFormat流程?
1)自定义一个类继承FileInputFormat
2)改写RecordReader
SecondaryNameNode工作机制?
1)第一阶段:namenode启动
第一次启动namenode格式化后,创建fsimage和edits文件
客户端对元数据进行增删改的请求
namenode记录操作日志,更新滚动日志
namenode在内存中对数据进行增删改查
2)第二阶段:Secondary NameNode工作
Secondary NameNode询问namenode是否需要checkpoint
Secondary NameNode请求执行checkpoint
namenode滚动正在写的edits日志
将滚动前的编辑日志和镜像文件拷贝到Secondary NameNode
Secondary NameNode加载编辑日志和镜像文件到内存,并合并
生成新的镜像文件fsimage.chkpoint
拷贝fsimage.chkpoint到namenode
namenode将fsimage.chkpoint重新命名成fsimage
简述hadoop1和hadoop2的架构异同?
加入了yarn解决资源调度的问题
加入了对zookeeper的支持实现比较可靠的高可用
为什么要有yarn解决了什么问题?有什么优势?
yarn上可以运行各种类型的分布式运算程序,比如mapreducer,spark程序等
MR作业提交全过程
1)yarn作业提交过程
2)MapReduce作业提交过程
3)作业提交过程之读数据
4)作业提交过程之写数据
HDFS的数据压缩算法?及每种算法的应用场景?
1)gzip压缩
优点:压缩率比较高,而且压缩/解压速度也比较快;hadoop本身支持,大部分linux系统都自带gzip命令
缺点:不支持split
应用场景:当每个文件压缩之后在130m以内的(1个块大小内),都可以考虑使用gzip压缩格式
2)Bzip2压缩
优点:支持split,具有很高的压缩率比gzip压缩率都高,hadoop本身支持,但不支持native,在linux系统下自带bzip2命令
缺点:压缩/解压速度慢,不支持native
应用场景:适合对速度要求不高,但需要较高压缩率的时候,可作为mapreduce作业的输出格式,或者数据比较大压缩以后数据用的比较少
3)Lzo压缩
优点:压缩/解压速度也比较快,合理的压缩率;支持split,是hadoop中最流行的压缩格式,可以在linux系统下安装lzop命令
缺点:压缩率比gzip要低一些;hadoop本身不支持,需要安装,在应用中对lzo格式的文件需要做一些特殊处理
应用场景:一个很大的文本文件,压缩之后还大于200m以上的可以考虑,而且单个文件越大lzo优点越明显
4)Snappy压缩
优点:高速压缩速度和合理的压缩率
缺点:不支持split,压缩率比gzip低,hadoop本身不支持,需要安装
应用场景:当mapreduce作业的map输出的数据比较大的时候,作为map到reduce的中间数据压缩格式;或者作为一个mapreduce作业的输出和另外一个mapreduce作业的输入
Hadoop调度器?
目前Hadoop调度器主要有三种:FIFO(先进先出调度器),Capacity Scheduler(容量调度器) 和 Fair Scheduler(公平调度器)。默认调度器是Capacity Scheduler
MapReducer跑的慢的原因?
mapreduce程序效率的瓶颈在于两点:
1)计算机性能
CPU,内存,磁盘健康,网络
2)I/O操作优化
数据倾斜,map和reduce数设置不合理,reduce等待过久,小文件过多,大量不可分块的超大文件,spill次数过多,merge次数过多等
MapReduce优化方法?
1)数据输入
1.合并小文件:在执行mr任务前将小文件进行合并,大量的小文件会产生大量的map任务,增大map任务装载次数,而任务的装载比较耗时,从而导致mr运行较慢
2.采用ConbinFileInputFormat来作为输入,解决输入端大量小文件场景
2)map阶段
1.减少spill次数,通过调整io.sort.mb及sort.spill.percent参数值,增大触发spill的内存上限,减少spill次数,从而减少磁盘IO
2.减少merge次数,通过调整io.sort.factor参数,增大merge的文件数目,减少merge的次数,从而缩短mr处理时间
3.在map之后先进行combine处理,减少IO
3)reduce阶段
1.合理设置map和reduce数,两个都不能设置太少,也不能设置太多。太少会导致task等待,延长处理时间。太多会导致map,reduce任务间竞争资源,造成处理超时等错误
2.设置map,reduce共存,调整slowstart.completedmaps参数,使map运行到一定程度后,reduce也开始运行,减少reduce的等待时间
3.规避使用reduce,因为reduce在用于连接数据集的时候将会产生大量的网络消耗
4.合理设置reduce端的buffer,默认情况下,数据达到一个阈值的时候buffer中的数据就会写入磁盘,然后reduce会从磁盘中获得所有的数据。也就是说buffer和reduce是没有直接关联的,中间多个一个写磁盘->读磁盘的过程,既然有这个弊端,那么就可以通过参数来配置,使得buffer中的一部分数据可以直接输送到reduce,从而减少IO开销:mapred.job.reduce.input.buffer.percent,默认为0.0,当值大于0的时候会保留指定比例的内存读buffer中的数据直接拿给reduce使用。这样一来,设置buffer需要内存,读取数据需要内存,reduce计算也要内存,所以要根据作业的运行情况进行调整
4)IO传输
1.采用数据压缩的方式,减少网络IO的时间。安装Snappy和LZOP压缩编码器
2.使用SequenceFile二进制文件
5)数据倾斜问题
1.数据倾斜现象
数据频率倾斜——某一个区域的数据量要远远大于其他区域
数据大小倾斜——部分记录的大小远远大于平均值
2.减少数倾斜的方法
抽样和范围分区
自定义分区
Combine
HDFS小文件优化方法?
1)Hadoop Archive
是一个高效的将小文件放入HDFS块中的文件存档工具,它能够将多个小文件打包成一个HAR文件
2)Sequence file
由一系列的二进制key/value组成,如果key为文件名,value为文件内容,则可以将大批小文件合并成一个大文件
3)CombineFileInputFormat
是一种新的inputformat,用于将多个文件合并成一个单独的split,另外,他会考虑数据的存储位置
4)开启JVM重用
对于大量小文件job,可以开启JVM重用会减少45%的运行时间
具体设置:mapreduce.job.jvm.numtasks值在10-20之间
最后
以上就是飞快纸鹤为你收集整理的hadoop面试题(一)的全部内容,希望文章能够帮你解决hadoop面试题(一)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复