大数据面试题(每天更新,4月2已更新完毕)

大数据面试题(每天更新,4月2已更新完毕)

 (0)  (0)
2018-03-20 16:36

面试题图片较大,加载需要时间,请耐心等待.......




1.在Hadoop中定义的主要公用InputFormat中,默认是哪一个?(A)


A、 TextInputFormat

B、 KeyValueInputFormat

C、 SequenceFileInputFormat



2. 下面哪个程序负责 HDFS 数据存储?(C) 


A.NameNode

B.JobTracker

C.DataNode

D.SecondaryNameNode

E.tasktracker


3.HDFS 中的 block 默认保存几份?(A) 


A.3 份

B.2 份

C.1 份

D.不确定



4.关于 SecondaryNameNode 哪项是正确的?(C) 


A.它是 NameNode 的热备

B.它是内存没有要求

C.他的目的使帮助 NameNode 合并编辑日志,减少 NameNode 启动时间

D. SecondaryNameNode 应与 NameNode 部署到一个节点



5.Hadoop 2.x 中HDFS 默认 BlockSize 是(C) 


A.32MB

B.64MB

C.128MB


6.下列哪项可以作为集群的管理(ABC) 


A.Puppet

B.Pdsh

C.ClouderaManager

D.Zookeeper



7.Client 端上传文件的时候下列哪项正确?(BC) 


A.数据经过 NameNode 传递 DataNode

B.Client 端将文件切分为 Block,依次上传

C.Client 只上传数据到一台 DataNode,然后由 NameNode 负责 Block 复制工作



8.下列哪个是 Hadoop 运行的模式?(ABC) 


A.单机版

B.伪分布式

C.分布式



9.列举几个hadoop生态圈的组件并做简要描述 


Zookeeper:是一个开源的分布式应用程序协调服务,基于zookeeper可以实现同步服务,配置维护,命名服务。

Flume:一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统。

Hbase:是一个分布式的、面向列的开源数据库, 利用Hadoop HDFS作为其存储系统.

Hive:基于Hadoop的一个数据仓库工具,可以将结构化的数据档映射为一张数据库表,并提供简单的sql 查询功能,可以将sql语句转换为MapReduce任务进行运行。

Sqoop:将一个关系型数据库中的数据导进到Hadoop的 HDFS中,也可以将HDFS的数据导进到关系型数据库中。



10. hadoop 节点动态上线下线怎么操作? 


节点上线操作:

当要新上线数据节点的时候,需要把数据节点的名字追加在 dfs.hosts 文件中

一,关闭新增节点的防火墙

二,在 NameNode 节点的 hosts 文件中加入新增数据节点的 hostname

三,在每个新增数据节点的 hosts 文件中加入 NameNode 的 hostname

四,在 NameNode 节点上增加新增节点的 SSH 免密码登录的操作

五,在 NameNode 节点上的 dfs.hosts 中追加上新增节点的 hostname,

六,在其他节点上执行刷新操作:hdfs dfsadmin -refreshNodes

七,在 NameNode 节点上,更改 slaves 文件,将要上线的数据节点 hostname 追加到 slaves 文件中

八,启动 DataNode 节点

九,查看 NameNode 的监控页面看是否有新增加的节点


节点下线操作:

一,修改/conf/hdfs-site.xml 文件

二,确定需要下线的机器,dfs.osts.exclude 文件中配置好需要下架的机器,这个是阻止下架的机器去连接 NameNode

三,配置完成之后进行配置的刷新操作./bin/hadoop dfsadmin -refreshNodes,这个操作的作用是在后台进行 block 块的移动

四,当执行三的命令完成之后,需要下架的机器就可以关闭了,可以查看现在集群上连接的节点,正在执行 Decommission,会显示:

Decommission Status : Decommission in progress 执行完毕后,会显示:

Decommission Status : Decommissioned

五,机器下线完毕,将他们从 excludes 文件中移除。



11.如何使用mapReduce实现两个表的join?


reduce side join : 在map 阶段,map 函数同时读取两个文件File1 和File2,为了区分

两种来源的key/value 数据对,对每条数据打一个标签(tag),比如:tag=0 表示来自文件File1,

tag=2 表示来自文件File2。

map side join : Map side join 是针对以下场景进行的优化:两个待连接表中,有一个表非常大,而另一个表非常小,以至于小表可以直接存放到内存中。这样,我们可以将小表复制多份,让每个map task 内存中存在一份(比如存放到hash table 中),然后只扫描大表:对于大表中的每一条记录key/value,在hash table 中查找是否有相同的key 的记录,如果有,


则连接后输出即可。

Semi Join : Semi Join,也叫半连接,是从分布式数据库中借鉴过来的方法。它的产生动机是:对于reduce side join,跨机器的数据传输量非常大,这成了join 操作的一个瓶颈,

如果能够在map 端过滤掉不会参加join 操作的数据,则可以大大节省网络IO。

reduce side join + BloomFilter : BloomFilter 最常见的作用是:判断某个元素是否在一个集合里面。它最重要的两个方法是:add() 和contains()。最大的特点是不会存在 falsenegative,即:如果contains()返回false,则该元素一定不在集合中,但会存在一定的 falsepositive,即:如果contains()返回true,则该元素一定可能在集合中。




12.Hadoop的sequencefile的格式,并说明下什么是java序列化,如何实现java序列化?


SequenceFile文件是Hadoop用来存储二进制形式的key-value 对而设计的一种平面文件;

Hadoop 的HDFS 和MapReduce子框架主要是针对大数据文件来设计的,在小文件的处理上不但效率低下,而且十分消耗磁盘空间(每一个小文件占用一个Block,2.X HDFS 默认block大小为128M)。

解决办法通常是选择一个容器,将这些小文件组织起来统一存储。HDFS提供了两种类型的容器,分别是SequenceFile和MapFile。

SequenceFile的每条记录是可序列化的字符数组。

序列化是指将结构化的对象转化为字节流以便在网络上传输或写入到磁盘进行永久存 储的过程,反序列化是指将字节流转回结构化对象的过程.




13. 请描述mapReduce二次排序原理


二次排序:就是首先按照第一字段排序,然后再对第一字段相同的行按照第二字段排序,注意不能破坏第一次排序的结果。

在Hadoop中,默认情况下是按照key进行排序。对于同一个key,reduce函数接收到的value list是按照value 排序的。

有两种方法进行二次排序,分别为:buffer and in memory sort和value-to-key conversion。

对于buffer and in memory sort,主要思想是:在reduce()函数中,将某个key对应的所有value保存下来,然后进行排序。 这种方法最大的缺点是:可能会造成 out of memory。

对于value-to-key conversion,主要思想是:将key和部分value拼接成一个组合key(实现WritableComparable接口或者调用setSortComparatorClass函数),这样reduce获取的结果便是先按key排序,后按value排序的结果,需要注意的是,用户需要自己实现Paritioner,以便只按照key进行数据划分。Hadoop显式的支持二次排序,在Configuration 类中有个 setGroupingComparatorClass()方法,可用于设置排序 group的 key 值。



14 请描述mapReduce中排序发生的几个阶段


一个是在map side发生在spill后partition前。

一个是在reduce side发生在copy后 reduce前。

mapReduce的四个阶段:

Splitting :在进行map 计算之前,mapreduce 会根据输入文件计算输入分片(inputsplit),每个输入分片(input split)针对一个map 任务。输入分片(input split)存储的并非数据本身,而是一个分片长度和一个记录数据位置的数组,输入分片(input split)往往和hdfs 的block(块)关系很密切,假如我们设定hdfs 的块的大小是64mb,如果我们输入有三个文件,大小分别是3mb、65mb 和127mb,那么mapreduce 会把3mb 文件分为一个输入分片(input split),65mb 则是两个输入分片(input split)而127mb 也是两个输入分片(input split),换句话说我们如果在map 计算前做输入分片调整,例如合并小文件,那么就会有5 个map 任务将执行,而且每个map 执行的数据大小不均,这个也是mapreduce 优化计算的一个关键点。

Mapping:就是程序员编写好的map 函数了,因此map 函数效率相对好控制,而且一般map 操作都是本地化操作也就是在数据存储节点上进行;

Shuffle:描述着数据从map task 输出到reduce task 输入的这段过程。

Reduce:对Map阶段多个文件的数据进行合并。



15 请描述mapReduce 中combiner 的作用是什么,一般使用情景,哪些情况不需要? 


在MR作业中的Map阶段会输出结果数据到磁盘中。

Combiner只应该适用于那种Reduce的输入(key:value与输出(key:value)类型完全一致,且不影响最终结果的场景。比如累加,最大值等,也可以用于过滤数据,在 map端将无效的数据过滤掉。

在这些需求场景下,输出的数据是可以根据key值来作合并的,合并的目的是减少输出的数据量,减少IO的读写,减少网络传输,以提高MR的作业效率。



1.combiner的作用就是在map端对输出先做一次合并,以减少传输到reducer的数据量.

2.combiner最基本是实现本地key的归并,具有类似本地reduce,那么所有的结果都是reduce完成,效率会相对降低。

3.使用combiner,先完成的map会在本地聚合,提升速度.



16. 简述Hadoop的几个默认端口及其含义 


dfs.namenode.http-address:50070

dfs.datanode.address:50010

fs.defaultFS:8020

yarn.resourcemanager.webapp.address:8088



17.两个类TextInputFormat和KeyValueInputFormat的区别是什么?


相同点:

TextInputformat和KeyValueTextInputFormat都继承了FileInputFormat类,都是每一行作为一个记录;

区别:

TextInputformat将每一行在文件中的起始偏移量作为 key,每一行的内容作为value。默认以\n或回车键作为一行记录。

KeyValueTextInputFormat 适合处理输入数据的每一行是两列,并用 tab 分离的形式。



18.在一个运行的 Hadoop 任务中,什么是 InputSplit? 


在执行 mapreduce 之前,原始数据被分割成若干个 split,每个 split 作为一个 map

任务的输入,在 map 执行过程中 split 会被分解成一个个记录(key-value 对)。


  


19.如果没有定义 partitioner,那数据在被送达 reducer 前是如何被分区的? 


如果没有自定义的 partitioning,则默认的 partition 算法,即根据每一条数据的 key

的 hashcode 值摸运算(%)reduce 的数量,得到的数字就是“分区号“。



20.Map 阶段结束后, Hadoop 框架会处理: Partitioning,Shuffle 和 Sort,在这个阶段都发生了什么? 


map task上的洗牌(shuffle)结束,此时 reducer task 上的洗牌开始,抓取 fetch 所属于自己分区的数据,

同时将这些分区的数据进行排序sort(默认的排序是根据每一条数据的键的字典排序),进而将数据进行合并merge,

即根据key相同的,将其 value 组成一个集合,最后输出结果。


 

 

21.请列出你所知道的Hadoop调度器,并简要说明其工作方法。 

(1)默认的调度器 FIFO

Hadoop中默认的调度器,它先按照作业的优先级高低,再按照到达时间的先后选择被执行的作业。

(2)计算能力调度器 Capacity Scheduler

支持多个队列,每个队列可配置一定的资源量,每个队列采用FIFO调度策略,为了防止同一个用户的作业独占队列中的资源,该调度器会对同一用户提交的作业所占资源量进行限定。调度时,首先按以下策略选择一个合适队列:计算每个队列中正在运行的任务数与其应该分得的计算资源之间的比值,选择一个该比值最小的队列;然后按以下策略选择该队列中一个作业:按照作业优先级和提交时间顺序选择,同时考虑用户资源量限制和内存限制。

(3)公平调度器 Fair Scheduler

同计算能力调度器类似,支持多队列多用户,每个队列中的资源量可以配置,同一队列中的作业公平共享队列中所有资源。实际上, Hadoop的调度器远不止以上三种,最近,出现了很多针对新型应用的Hadoop调度器。

(4)适用于异构集群的调度器LATE

现有的 Hadoop 调度器都是建立在同构集群的假设前提下,具体假设如下:

1)集群中各个节点的性能完全一样

2)对于 reduce task,它的三个阶段:copy、 sort 和 reduce,用时各占 1/3

3)同一 job 的同类型的 task 是一批一批完成的,他们用时基本一样。


现有的Hadoop调度器存在较大缺陷,主要体现在探测落后任务的算法上:如果一个task 的进度落后于同类型 task进度的20%,则把该task当做落后任务(这种任务决定了job的完成时间,需尽量缩短它的执行时间),从而为它启动一个备份任务(speculative task)。

如果集群异构的,对于同一个task,即使是在相同节点上的执行时间也会有较大差别,因而在异构集群中很容易产生大量的备份任务。

LATE调度器从某种程度上解决了现有调度器的问题,它定义三个阈值 :

SpeculativeCap,系统中最大同时执行的speculative task 数目(作者推荐值为总slot数的10%); SlowNodeThreshold(作者推荐值为25%):得分(分数计算方法见论文)低于该阈值的node(快节点)上不会启动 speculative task;SlowTaskThreshold(作者推荐值为 25%):当 task 进度低于同批同类 task 的平均进度的 SlowTaskThreshold 时,会为该 task 启动 speculative task。它的调度策略是:当一个节点出现空闲资源且系统中总的备份任务数小 于 SpeculativeCap 时, a.如果该节点是慢节点(节点得分高 于SlowNodeThreshold),则忽略这个请求。 b.对当前正在运行的 task 按估算的剩余完成时间排序 c.选择剩余完成时间最大且进度低于 SlowTaskThreshold 的 task,为该 task 启动备份任务。


(5)适用于实时作业的调度器Deadline Scheduler和Constraint-based Scheduler

这种调度器主要用于有时间限制的作业(Deadline Job),即给作业一个deadline时间,让它在该时间内完成。实际上,这类调度器分为两种,软实时(允许作业有一定的超时)作业调度器和硬实时(作业必须严格按时完成)作业调度器。

Deadline Scheduler 主要针对的是软实时作业,该调度器根据作业的运行进度和剩余时间动态调整作业获得的资源量,以便作业尽可能的在 deadline 时间内完成。

Constraint-based Scheduler 主要针对的是硬实时作业,该调度器根据作业的deadline和当前系统中的实时作业运行情况,预测新提交的实时作 业能不能在 deadline时间内完成,如果不能,则将作业反馈给用户,让他重调整作业的 deadline。


22.编程题MR作业设计: 有两种格式的海量日志文件存放于hdfs上,可以通过文件名前缀区分,其中登录日志格式:


user,ip,time,oper(枚举值:1 为上线, 2 位下线 );

访问日志格式:ip,time,url,假设登录日志中user上下线信息完整,且同一上下线时间段内使用的ip唯一,要计算访问日志中独立 user 数量最多的前 10个url,请给出MapReduce设计思路,如需要几个MapReduce,及每个 MapReduce 算法伪代码。


思路:

将 userid ,ip ,url 封装成一个对象,map 类输入数据,按照 userid 为 key 输出,value

为 1(intwritable),按照 reduce 计算写一个排序类然后按照 value 降序输出前十个



23.一个 mr 作业跑的比较慢,如何来优化。至少给出 6 个方案。 


mr跑的慢可能有很多原因,如:数据倾斜、map和reduce数设置不合理、reduce等待过久、小文件过多、spill 次数过多、 merge 次数过多等。

1、解决数据倾斜:数据倾斜可能是partition不合理,导致部分partition中的数据过多,部分过少。可通过分析数据,自定义分区器解决。

2、合理设置map和reduce数:两个都不能设置太少,也不能设置太多。太少,会导致task等待,延长处理时间;太多,会导致 map、 reduce 任务间竞争资源,造成处理超时等错误。

3、设置map、reduce共存:调整slowstart.completedmaps参数,使map运行到一定程度后,reduce也开始运行,减少 reduce 的等待时间。

4、合并小文件:在执行mr任务前将小文件进行合并,大量的小文件会产生大量的map任务,增大map任务装载次数,而任务的装载比较耗时,从而导致 mr 运行较慢。

5、减少spill次数:通过调整io.sort.mb及sort.spill.percent参数值,增大触发spill的内存上限,减少spill 次数,从而减少磁盘 IO。

6、减少merge次数:通过调整io.sort.factor参数,增大merge的文件数目,减少merge的次数,从而缩短mr处理时间。

你可能感兴趣的:(Hadoop)