我是靠谱客的博主 飞快纸鹤,最近开发中收集的这篇文章主要介绍hadoop面试题(一),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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面试题(一)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(66)

评论列表共有 0 条评论

立即
投稿
返回
顶部