hadoop 面试

Hadoop面试宝典


写在前面:

本面试题收集于网络,有顾晓卿,蔡志勇,王新天 共同整理。

###

1. 简述Mapreduce构架组成

MapReduce包含四个组成部分,分别为Client,JobTracker,TaskTracker,Task。

  • 一个主节点JobTracker和多个TaskTracker
  • Client: 每一个Job都会在用户端通过Client类将应用程序以及参数配置Configuration打包成Jar文件存储在HDFS,并把路径提交到JobTracker的master服务,然后由master创建每一个Task(即MapTask和ReduceTask),将它们分发到各个TaskTracker服务中去执行
  • JobTracker : JobTracker负责资源监控和作业调度。
  • TaskTracker : TaskTracker会周期性地通过HeartBeat将本节点上资源的使用情况和任务的运行进度汇报给JobTracker,同时执行JobTracker发送过来的命令 并执行相应的操作(如启动新任务,杀死任务等)
  • Task : Task分为MapTask和Reduce Task两种,均由TaskTracker启动。
  • 更多答案参照这里

    2. 什么是分布式缓存

    • 分布式缓存系统是为了解决数据库服务器和web服务器之间的瓶颈。分布式缓存由一个服务端实现管理和控制,有多个客户端节点存储数据,可以进一步提高数据的读取速率。
    • 分布式缓存能够高性能地读取数据、能够动态地扩展缓存节点、能够自动发现和切换故障节点、能够自动均衡数据分区,而且能够为使用者提供图形化的管理界面,部署和维护都十分方便。

3. mapreduce数据清洗的具体过程

  • 主函数: 通过ToolRunner.run()启动MR程序
    • 在主函数中,通过ToolRunner.run()调用实现了Tool接口的DataCleaner类
    • 在ToolRunner.run()中,可以传递由用户在命令行中输入的参数
    • 等待MR的运行结果
  • 重写的run函数
    • 实例化Job对象,在实例化的过程中添加Configuration对象conf作为配置
    • 通过Job类的setter()方法设置提交的Job名称,还有用户自己编写的Mapper类和Reducer类
    • 通过Job类的setter()方法设置相应的值,包括Map和Reduce各自的输入输出类型
    • 设置数据的输入路径和输出路径,这里的数据存放在HDFS上
  • Map & Reduce
    • Map和Reduce的具体处理逻辑由用户自己实现,分别继承Mapper类和Reducer类
    • 需要指定Map和Reduce各自的输入输出的key/value的类型,Map的输出和Reduce的输入的key/value类型一致
  • 更多答案参考这里

4. 简要描述如何配置Hadoop集群

  • (1)使用root账户登录
  • (2)修改IP
  • (3)修改host主机名
  • (4)配置SSH免密码登录
  • (5)关闭防火墙
  • (6)安装JDK
  • (7)解压hadoop安装包
  • (8)配置hadoop核心文件 hadoop-env.sh,core-site.xml,mapred-site.xml,hdfs-site.xml
  • (9)配置hadoop环境变量
  • (10)格式化namenode
  • (11)启动节点

5. 请列出正常工作的 Hadoop 集群中,Hadoop 分别需要启动哪些进程,它们的作用分别是什么

  • (1)NameNode:HDFS的守护进程,负责记录文件是如何分割成数据块,以及这些数据块分别被存储到那些数据节点上,它的主要功能是对内存及IO进行集中管理
  • (2)SecondaryNameNode:辅助后台程序,与NameNode进行通信,以便定期保存HDFS元数据的快照。
  • (3)DataNode:负责把HDFS数据块读写到本地的文件系统
  • (4)JobTracker:负责分配task,并监听所有运行的task
  • (5)TaskTracker:负责执行具体的task,并与JobTracker进行交互

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

比较流行的三种调度器有:默认调度器FIFO,计算能力调度器Capacity Scheduler ,公平调度器Fair Scheduler

  • 默认调度器FIFO

    • hadoop中默认的调度器,采用先进先出的原则
  • 计算能力调度器Capacity Scheduler

    • 选择占用资源小,优先级高的先执行
  • 公平调度器Fair Scheduler

    • 同一队列中的作业公平共享队列中所有资源

7. 请列出在你以前工作中所使用过的开发map /reduce的语言

  • java:
  • scala:
  • python:
  • shell:

8. 你认为 Java ,Streaming,pipe 方式开发 map/reduce 各有哪些优缺点

  • 1、Java写MapReduce可以实现复杂的逻辑,如果需求简单,则显得繁琐
  • 2、HiveQL基本都是针对hive中的表数据进行编写,但对复杂的逻辑很难进行实现。写起来简单。

9. 简述 Hadoop 如何实现二次排序

在Hadoop中,默认情况下是按照key进行排序,有两种方法实现二次排序

  • (1)buffer and in memory sort:在reduce()函数中,将某个key对应的所有value保存下来,然后进行排序
  • (2)value-to-key conversion:将key和部分value拼接成一个组合key,这样reduce获取的结果便是先按key排序,后按value排序的结果

10. 简述MapReduce中combiner,partition的作用

  • combiner:实现combine函数,该类的主要功能是合并相同的key建
  • partition:主要在Shuffle过程中按照key值将中间结果分成R份,其中每份都有一个Reduce去负责

11. Hadoop 框架中怎么来优化

  • Storm用于处理高速、大型数据流的分布式实时计算系统。为Hadoop添加了可靠的实时数据处理功能
  • Spark采用了内存计算。从多迭代批处理出发,允许将数据载入内存作反复查询。Spark构建在HDFS上,能与Hadoop很好的结合。它的RDD是一个很大的特点。

12. 在开发分布式计算job的时候,是否可以去掉reduce阶段

  • 可以,如果集群就是为了存储文件而设计的,不涉及到数据的计算,就可以将mapreduce都省略

13. hadoop中哪些地方使用了缓存机制,作用分别是什么

  • 缓存机制就是DistributedCash,就是在job任务执行前,将需要的文件拷贝到Task机器上进行缓存,提到mapreduce的执行效率

14. 数据倾斜是怎么产生的,并给出优化方法

  • (1)关键字:join,group by,count distinct
  • (2)key分布不均匀,业务数据本身的特性,建表时考虑不周,某些SQL语句本身就有数据倾斜
  • (3)空值产生的数据倾斜
  • (4)不同数据类型关联产生数据倾斜
  • 优化方法:
    • 参数调节,选用join
    • key分布最均匀的表作为驱动表,值为空的不参与关联,
    • 把数字类型转换成字符串类型让各分区的数据分布均匀,
    • 可以根据业务特点,设置合适的partition策略,如果事先根本不知道数据的分布规律,利用随机抽样 器抽样后生成partition策略再处理

15. MapReduce 基本执行过程

  • 1.读取文件,解析成key,value对
  • 2.自定义map函数
  • 3.对map输出的数据进行分区
  • 4.对分区后的数据进行排序分组
  • 5.对分组后的数据进行规约
  • 6.通过网络拷贝,将map输出的数据拷贝到reduce节点
  • 7.自定义reduce函数,对map输入的key,value对进一步的处理
  • 8.对处理后的数据进行输出

16. MapReduce 出现单点负载多大,怎么负载平衡

  • 可以用partioner进行分区操作,将大数据分成多个小数据进行逐一处理

17. HDFS存储数据的replication如何定位

  • 每一个文件的每一个切块,在hdfs集群中都可以保存多个备份(默认3份),在hdfs-site.xml中,dfs.replication的value的数量就是备份的数量。

18. datanode 首次加入 cluster 的时候,如果 log 报告不兼容文件版本,那需要namenode 执行格式化操作,这样处理的原因是?

  • 这样处理是不合理的,因为那么 namenode 格式化操作,是对文件系统进行格式
    化,namenode 格式化时清空 dfs/name 下空两个目录下的所有文件,之后,会在目
    录 dfs.name.dir 下创建文件。文本不兼容,有可能时 namenode 与 datanode 的 数据里的 namespaceID、clusterID 不一致,找到两个 ID 位置,修改为一个即可解决。

19. hdfs 的体系结构

HDFS有 namenode、secondraynamenode、datanode 组成。

  • namenode 负责管理 datanode 和记录元数据
  • secondraynamenode 负责合并日志
  • datanode 负责存储数据

20. 简单概述hdfs原理,以及各个模块的职责

  • 1、客户端向 nameNode 发送要上传文件的请求
  • 2、nameNode 返回给用户是否能上传数据的状态
  • 3、假如用户端需要上传一个 1024M 的文件,客户端会通过 Rpc 请求 NameNode,并返回需要上传给那些 DataNode(分配机器的距离以及空间的大小等),namonode会选择就近原则分配机器
  • 4、客户端请求建立 block 传输管道 chnnel 上传数据
  • 5、在上传是 datanode 会与其他的机器建立连接并把数据块传送到其他的机器上
  • 6、dataNode 向 namenode 汇报自己的储存情况以及自己的信息
  • 7、当第一个快上传完后再去执行其他的复制的传送

21. 三个 datanode,当有一个 datanode 出现错误会怎样

  • 第一不会给储存带来影响,因为有其他的副本保存着,不过建议尽快修复,
  • 第二会影响运算的效率,机器少了,reduce在保存数据时选择就少了,一个数据的块就大了所以就会慢。

22. datanode 在什么情况下不会备份?

  • Hadoop保存的三个副本如果不算备份的话,那就是在正常运行的情况下不会备份,也是就是在设置副本为1的时候不会备份,说白了就是单台机器呗!!
  • 还有datanode 在强制关闭或者非正常断电不会备份。

23. 请写出以下执行命令

  • 杀死一个Job

    • hadoop job -list ## 拿到jobid,
    • ./hadoop job -kill job_201212111628_11166
  • 删除hdfs上的/tmp/xxx 目录

    • hadoop fs -rmr /spark/output
  • 加入一个新的存储节点和删除一个计算节点需要刷新集群状态命令

    • bin/Hadoop-daemon.sh start DataNode
    • bin/yarn-daemon.sh start nodemanager

24. hdfs的client端,复制到第三个副本时宕机,hdfs怎么恢复保证下次写第三副本?block块信息是先写datanode还是先写namenode?

Datanode会定时上报block块的信息给namenode ,namenode就会得知副本缺失,然后namenode就会启动副本复制流程以保证数据块的备份!
Client 向NameNode 发起文件写入的请求。NameNode根据文件大小和文件块配置情况,返回给 Client 它所管理部分 DataNode 的信息。Client将文件划分为多个Block,根据DataNode的地址信息,按顺序写入到每一个DataNode块中。

25. hadoop推测执行时如何实现的

这是以空间换时间的,同时启动多个相同task,哪个完成的早,则采用哪个task的结果,这样明显可以提高任务计算速度,但是,这样却会占用更多的资源,在集群资源紧缺的情况下,合理的控制Speculative Task,可在多用少量资源情况下,减少大作业的计算时间。

26.列举几个配置文件优化

  • Core-site.xml 文件的优化

    fs.trash.interval

默认值: 0

说明: 这个是开启hdfs文件删除自动转移到垃圾箱的选项,值为垃圾箱文件清除时间。一般开启这个会比较好,以防错误删除重要文件。单位是分钟。

dfs.namenode.handler.count
默认值:10

说明:Hadoop系统里启动的任务线程数,这里改为40,同样可以尝试该值大小对效率的影响变化进行最合适的值的设定。

mapreduce.tasktracker.http.threads

默认值:40

说明:map和reduce是通过http进行数据传输的,这个是设置传输的并行线程数。

27. MapReduce的join方法有哪些

reduce side join、map side join、Semi Join、reduce side join + BloomFilter

28. 假设hadoop一个job产生了100个task,并且其中一个task失败了,hadoop会如何处理?

任何失败的task都不会引起整个job的失败,因为所有失败的任务都会被重新执行,
只有当重新执行的次数超过4次,才会把这个任务标记为失败,导致整个job的失败。

29. Mapreduce中的排序发生在哪个阶段,这些排序是否可以避免,为什么

在Maptask中,会对数据进行排序,由于这些排序时Mapreduce自动完成的,用户无法控制,因此在hadoop1.x中无法避免,也不可以关闭,但hadoop2.x中可以关闭

30. Mapreduce的调度模式

  • Appmaster作为调度主管,管理Maptask和Reducetask
  • Appmaster负责启动,监控Maptask和Reducetask
  • Maptask处理完成之后,Appmaster会监控到,然后将其输出结果通知给 Reducetask,然后Reducetask从Map端拉去文件,然后处理.
  • 当Reduce阶段全部完成之后,Appmaster还要向ResourceManager注销自己

31. combine出现在哪个过程中

shuffle过程中,Maptask输出的数据从内存溢出到磁盘,可能会调多次

32. MapReduce的优化

  • (1)设置合理的map和reduce的个数
  • (2)避免出现数据倾斜
  • (3)combine函数
  • (4)对数据进行压缩
  • (5)小文件处理优化:事先合并成大文件
  • (6)参数优化

33. 如何使用MapReduce事先两个表的join,可以考虑以下几种情况

  • 一个表大,一个表小:将小表放到DistributedCache中
  • 两个都是大表:map-side join(要求输入数据有序) reduce-side join,semijoin(半连接)

34. HDFS存储机制

HDFS主要是一个分布式的文件储存系统,有namenode来接收用户的操作请求,然后根据文件的大小,以及定义的block块的大小,将大的文件切分成多个block块来进行保存

35. hadoop中combiner的作用

实现本地key的聚合,对map输出的key排序、value进行迭代

36 hadoop中常用的数据压缩算法

Lzo,Gzip,Default,Snappy

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

  • dfs.namenode.http-address:50070
  • dfs.datanode.address:50010
  • fs.defaultFS:8020
  • yarn.resourcemanager.webapp.address:8088

38. 运行一个 hadoop 任务的流程是什么样的。

  • 1、 导入数据对需分析的数据进行分片,片的大小默认与 datanode 块大小相同。
  • 2、 每个数据片由一个 mapper 进行分析,mapper 按照需求将数据拆分为一个个 keyvalue 格式的数据。
  • 3、 每个 key-value 数据调用一次 map 方法,对数据进行相应的处理后输出。
  • 4、 将输出的数据复制到对应的分区,默认一个键一个区,相同键放在同一个区中。
  • 5、 将输出的数据进行合并为 key-Iterable 格式。
  • 6、 每个分区有一个 reduce,每个 reduce 将同一个分区的数据进行合并处理为自己所需的数据格式。
  • 7、 将数据输出至 hdfs。

39.什么样的计算不能用 mr 来提速,举 5 个例子。

  • 1、 数据量很小。
  • 2、 繁杂的小文件。
  • 3、 索引是更好的存取机制的时候。
  • 4、 事务处理。
  • 5、 只有一台机器的时候。

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

  • hadoop有一个默认的分区类,HashPartioer类,通过对输入的k2去hash值来确认map输出的k2,v2送到哪一个reduce中去执行。
坚持原创技术分享,您的支持将鼓励我继续创作!