欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

大数据云计算——hadoop的面试问题总结

程序员文章站 2024-03-22 12:17:22
...

1.讲述HDFS上传⽂件和读⽂件的流程?
HDFS 上传流程,举例说明⼀个256M的⽂件上传过程
(1)由客户端Client向NameNode节点发出请求;
(2)NameNode向Client返回可以存数据的DataNode列表,遵循机架感应原则(把副本分别放在不同的机架,甚⾄不同的数据中⼼);
(3)客户端⾸先根据返回的信息先将⽂件分块(Hadoop2.X版本每⼀个block为 128M,⽽之前的版本为 64M);
(4)通过NameNode返回的DataNode信息,将⽂件块以流失写⼊⽅式直接发送给DataNode,同时复制到其他两台机器(默认⼀份数据,有两个副本);
(5)数据块传送完成以后, dataNode向Client通信,同时向NameNode报告;
(6)依照上⾯(4)到(5)的原理将所有的数据块都上传,结束后向 NameNode 报告 表明已经传完所有的数据块
大数据云计算——hadoop的面试问题总结

2 HDFS在上传⽂件的时候,如果其中⼀个块突然损坏了怎么办?
其中⼀个块坏了,只要有其它块存在,会⾃动检测还原。

3 NameNode的作⽤?
namenode总体来说是管理和记录恢复功能。⽐如管理datanode,保持⼼跳,如果超时则排除。对于上传⽂件都有镜像images和edits,这些可以⽤来恢复。

4 NameNode在启动的时候会做哪些操作?
NameNode启动的时候,会加载fsimage
Fsimage加载过程完成的操作主要是为了:
(1)从fsimage中读取该HDFS中保存的每⼀个⽬录和每⼀个⽂件
(2)初始化每个⽬录和⽂件的元数据信息
(3)根据⽬录和⽂件的路径,构造出整个namespace在内存中的镜像
(4)如果是⽂件,则读取出该⽂件包含的所有blockid,并插⼊到BlocksMap中。
整个加载流程如下图所⽰:

大数据云计算——hadoop的面试问题总结

如上图所⽰, namenode在加载fsimage过程其实⾮常简单,就是从fsimage中不停的顺序读取⽂件和⽬录的元数据信息,并在内存中构建整个namespace,同时将每个⽂件对应的blockid保存⼊BlocksMap中,此时BlocksMap中每个block对应的datanodes列表暂时为空。当fsimage加载完毕后,整个HDFS的⽬录结构在内存中就已经初始化完毕,所缺的就是每个⽂件对应的block对应的datanode列表信息。这些信息需要从datanode的blockReport中获取,所以加载fsimage完毕后, namenode进程进⼊rpc等待状态,等待所有的datanodes发送blockReports。

5.NameNode的HA?
NameNode的HA⼀个备⽤,⼀个⼯作,且⼀个失败后,另⼀个被**。他们通过journal node来实现共享数据。

6.Hadoop的作业提交流程?
Hadoop2.x Yarn作业提交(客户端)http://www.aboutyun.com/forum.php?mod=viewthread&tid=9498
Hadoop2.x Yarn作业提交(服务端)http://www.aboutyun.com/forum.php?mod=viewthread&tid=9496

7.Hadoop怎么分⽚?
1、分块:
HDFS存储系统中,引⼊了⽂件系统的分块概念(block),块是存储的最⼩单位, HDFS定义其⼤⼩为64MB。与单磁
盘⽂件系统相似,存储在 HDFS上的⽂件均存储为多个块,不同的是,如果某⽂件⼤⼩没有到达64MB,该⽂件也不会占据
整个块空间。在分布式的HDFS集群上, Hadoop系统 保证⼀个块存储在⼀个datanode上。
HDFS的namenode只存储整个⽂件系统的元数据镜像,这个镜像由配置dfs.name.dir指定, datanode则存有⽂件的
metainfo和具体的分块,存储路径由dfs.data.dir指定。
2、分⽚片:
hadoop的作业在提交过程中,需要把具体的输⼊进⾏分⽚。具体的分⽚细节由InputSplitFormat指定。分⽚的规则为
FileInputFormat.class中的getSplits()⽅法指定:

long splitSize = computeSplitSize(goalSize, minSize, blockSize);
computeSplitSize:
Math.max(minSize, Math.min(goalSize, blockSize));

8.如何减少Hadoop Map端到Reduce端的数据传输量?
减少传输量,可以让map处理完,让同台的reduce直接处理,理想情况下,没有数据传输。

9.Hadoop的Shuffle?
1、 hadoop: map端保存分⽚数据,通过⽹络收集到reduce端
2、 Shuffle产⽣的意义是什么?
完整地从map task端拉取数据到reduce 端;在跨节点拉取数据时,尽可能地减少对带宽的不必要消耗;减少磁盘IO对task执⾏的影响;每个map task都有⼀个内存缓冲区,存储着map的输出结果,当缓冲区快满的时候需要将缓冲区的数据该如何处理?
每个map task都有⼀个内存缓冲区,存储着map的输出结果,当缓冲区快满的时候需要将缓冲区的数据以⼀个临时⽂件的⽅式存放到磁盘,当整个map task结束后再对磁盘中这个map task产⽣的所有临时⽂件做合并,⽣成最终的正式输出⽂
件,然后等待reduce task来拉数据。

10.哪些场景才能使⽤Combiner呢?
1. Combiner的输出是Reducer的输⼊, Combiner绝不能改变最终的计算结果。所以从我的想法来看, Combiner只应该⽤
于那种Reduce的输⼊key/value与输出key/value类型完全⼀致,且不影响最终结果的场景。⽐如累加,最⼤值等。 Combiner的使⽤⼀定得慎重,如果⽤好,它对job执⾏效率有帮助,反之会影响reduce的最终结果。
2. combiner最基本是实现本地key的聚合,对map输出的key排序, value进⾏迭代。
3. combiner的⽬的是减少map⽹络流量。 combiner的对象是对于map。 combiner具有和reduce相似的功能。只不过combiner合并对象,是对于⼀个map。 reduce合并对象,是对于多个map。

11.HMaster的作⽤?
1. 为region server分配region.
2. 负责region server的负载均衡。
3. 发现失效的region server并重新分配其上的region.
4. Gfs上的垃圾⽂件回收。
5. 处理schema更新请求。

12.如何实现hadoop的安全机制?
(1)共享hadoop集群:
a: 管理⼈员把开发⼈员分成了若⼲个队列,每个队列有⼀定的资源,每个⽤户及⽤户组只能使⽤某个队列中指定资源。
b: HDFS上有各种数据,公⽤的,私有的,加密的。不⽤的⽤户可以访问不同的数据。
(2) HDFS安全机制
client获取namenode的初始访问认证( 使⽤kerberos )后,会获取⼀个delegation token,这个token可以作为接下来访
问HDFS或提交作业的认证。同样,读取block也是⼀样的。
(3) mapreduce安全机制
所有关于作业的提交或者作业运⾏状态的追踪均是采⽤带有Kerberos认证的RPC实现的。授权⽤户提交作业
时, JobTracker会为之⽣成⼀个delegation token,该token将被作为job的⼀部分存储到HDFS上并通过RPC分发给各
个TaskTracker,⼀旦job运⾏结束,该token失效。
(4) DistributedCache是安全的。DistribuedCache分别两种,⼀种是shared,可以被所有作业共享,⽽private的只能被该⽤户的作业共享。
(5) RPC安全机制:在Hadoop RP中添加了权限认证授权机制。当⽤户调⽤RPC时,⽤户的login name会通过RPC头部传递给RPC,之后RPC使⽤Simple Authentication and Security Layer(SASL)确定⼀个权限协议(⽀持Kerberos和DIGEST-MD5两种),完成RPC授权。

13.hadoop的调度策略的实现,你们使⽤的是哪种策略,为什么?
(1)默认情况下hadoop使⽤的FIFO, 先进先出的调度策略。按照作业的优先级来处理。
(2)计算能⼒调度器( Capacity Scheduler ) ⽀持多个队列,每个队列可配置⼀定的资源量,每个队列采⽤FIFO, 为了防⽌同
⼀个⽤户的作业独占资源,那么调度器会对同⼀个⽤户提交的作业所占资源进⾏限定,⾸先按以下策略选择⼀个合适队
列:计算每个队列中正在运⾏的任务数与其应该分得的计算资源之间的⽐值,选择⼀个该⽐值最⼩的队列;然后按以下策
略选择该队列中⼀个作业:按照作业优先级和提交时间顺序选择,同时考虑⽤户资源量限制和内存限制。
(3)公平调度器( Fair Scheduler ) ⽀持多队列多⽤户,每个队列中的资源量可以配置,同⼀队 列中的作业公平共享队列中所
有资源。
(4)异构集群的调度器LATE
(5)实时作业的调度器Deadline Scheduler和Constraint-based Schedule

14.数据倾斜怎么处理?
数据倾斜有很多解决⽅案,本例⼦简要介绍⼀种实现⽅式,假设表A 和表B连接,表A 数据倾斜,只有⼀个key倾斜,⾸先
对A进⾏采样,统计出最倾斜的key,将A表分隔为A1 只有倾斜 key, A2 不包含倾斜key, 然后分别与 表B 连接。最后将结果
合并, union

15.评述hadoop运⾏原理?
1、有hdfs 负责数据存放,是Hadoop的分布式⽂件存储系统
2、将⼤⽂件分解为多个Block,每个Block保存多个副本。提供容错机制,副本丢失或者宕机时⾃动恢复。默认每个Block
保存3个副本, 64M为1个Block。由mapreduce负责计算, Map(映射)和Reduce(归约)
16.简单说⼀下hadoop的map-reduce编程模型
(1)map task会从本地⽂件系统读取数据,转换成key-value形式的键值对集合。使⽤的是hadoop内置的数据类型,⽐如
longwritable、 text等。
(2)将键值对集合输⼊mapper进⾏业务处理过程,将其转换成需要的key-value在输出之后会进⾏⼀个partition分区操作,
默认使⽤的是hashpartitioner,可以通过重写hashpartitioner的getpartition⽅法来⾃定义分区规则。
(3)会对key进⾏进⾏sort排序, grouping分组操作将相同key的value合并分组输出,在这⾥可以使⽤⾃定义的数据类型,重
写WritableComparator的Comparator⽅法来⾃定义排序规则,重写RawComparator的compara⽅法来⾃定义分组规则
(4)进⾏⼀个combiner归约操作,其实就是⼀个本地段的reduce预处理,以减⼩后⾯shufle和reducer的⼯作量
reduce task会通过⽹络将各个数据收集进⾏reduce处理,最后将数据保存或者显⽰,结束整个job。举例说明:将⼀副牌的分成四种花⾊。

17.hadoop的TextInputFormat作⽤是什么,如何⾃定义实现?
InputFormat会在map操作之前对数据进⾏两⽅⾯的预处理
(1)是getSplits,返回的是InputSplit数组,对数据进⾏split分⽚,每⽚交给map操作⼀次
(2)是getRecordReader,返回的是RecordReader对象,对每个split分⽚进⾏转换为key-value键值对格式传递给map
常⽤的InputFormat是TextInputFormat,使⽤的是LineRecordReader对每个分⽚进⾏键值对的转换,以⾏偏移量作为键,
⾏内容作为值。⾃定义类继承InputFormat接⼜,重写createRecordReader和isSplitable⽅法 在createRecordReader中可以⾃定义分隔符

18.map-reduce程序运⾏的时候会有什么⽐较常见的问题?
⽐如说作业中⼤部分都完成了,但是总有⼏个reduce⼀直在运⾏。这是因为这⼏个reduce中的处理的数据要远远⼤于其他
的reduce,可能是因为对键值对任务划分的不均匀造成的数据倾斜。解决的⽅法可以在分区的时候重新定义分区规则对于value
数据很多的key可以进⾏拆分、均匀打散等处理,或者是在map端的combiner中进⾏数据预处理的操作。

19.Hadoop平台集群配置、环境变量设置?
1、 zookeeper:修改zoo.cfg⽂件,配置dataDir,和各个zk节点的server地址端⼜, tickTime⼼跳时间默认是2000ms,其
他超时的时间都是以这个为基础的整数倍,之后再dataDir对应⽬录下写⼊myid⽂件和zoo.cfg中的server相对应。

2、 hadoop:修改
hadoop-env.sh配置java环境变量
core-site.xml配置zk地址,临时⽬录等
hdfs-site.xml配置nn信息, rpc和http通信地址, nn⾃动切换、 zk连接超时时间等
yarn-site.xml配置resourcemanager地址
mapred-site.xml配置使⽤yarn
slaves配置节点信息
格式化nn和zk。
3、 hbase:修改
hbase-env.sh配置java环境变量和是否使⽤⾃带的zk
hbase-site.xml配置hdfs上数据存放路径, zk地址和通讯超时时间、 master节点
regionservers配置各个region节点
zoo.cfg拷贝到conf⽬录下
4、 spark:
安装Scala
修改spark-env.sh配置环境变量和master和worker节点配置信息
5、环境变量的设置:直接在/etc/profile中配置安装的路径即可,或者在当前⽤户的宿主⽬录下,配置在.bashrc⽂件中,该
⽂件不⽤source重新打开shell窗⼜即可,配置在.bash_profile的话只对当前⽤户有效。

20.Hadoop性能调优?
1、调优可以通过系统配置、程序编写和作业调度算法来进⾏。 hdfs的block.size可以调到128/256(⽹络很好的情况下,
默认为64)
2、调优的⼤头: mapred.map.tasks、 mapred.reduce.tasks设置mr任务数(默认都是1)
1 mapred.tasktracker.map.tasks.maximum //每台机器器上的最⼤大map任务数
2 mapred.tasktracker.reduce.tasks.maximum //每台机器器上的最⼤大reduce任务数
3 mapred.reduce.slowstart.completed.maps //配置reduce任务在map任务完成到百分之⼏几的时候开始进⼊入
这个⼏个参数要看实际节点的情况进⾏配置, reduce任务是在33%的时候完成copy,要在这之前完成map任务,(map可
以提前完成)
1 mapred.compress.map.output,mapred.output.compress
2 //配置压缩项,消耗cpu提升⽹网络和磁盘io 合理理利利⽤用combiner 。注意重⽤用writable对象

21.Hadoop如何实现⾼并发?
(1)分段加锁机制+内存双缓冲机制
(2)多线程并发吞吐量量的百倍优化
(3)缓冲数据批量量刷磁盘+⽹网络优化

参考: https://www.codercto.com/a/38917.html