Hadoop面试题总结

Hadoop面试题总结

1. hadoop的TextInputFormat作用是什么?如何自定义实现?

InputFormat会在map操作之前对数据进行两方面的预处理:

  1. gitSplits,返回的是InputSplit数组,对数据进行split切片,每一个切片都需要一个map任务去处理。
  2. getRecordReader,返回的是RecordReader对象,将每个切片中的数据转换为对的格式传递给map。

常用的InputFormat是TextInputFormat,使用的是LineRecordReader对每个分片进行键值对的转换,以偏移量作为键,以内容作为值。自定义类实现InputFormat接口,重写createRecordReader和isSplitable方法,在createRecordReader中可以自定义分隔符。


2.ETL是什么?

ETL,是英文Extract-Transform-Load的缩写,用来描述将数据从来源经过萃取(extract)、转置(transform)、加载(load)至目的端的过程。ETL一词常用在数据仓库,但其对象不限于数据仓库。


3. Flume工作机制是什么?

核心概念是agent,里面包括source、channel和sink三个组件。
source运行在日志收集节点进行日志采集,之后临时存储在channel,sink负责将channel中的数据发送到目的地。只有成功发送之后,channel中的数据才会被删除。
首先书写flume配置文件,定义agent、source、channel和sink然后将其组装,执行flume-ng命令。


4. Sqoop工作原理是什么?

sqoop是hadoop生态圈的数据传输工具,可以将关系型数据库中的数据导入到非结构化的hdfs、hive或者hbase中,也可以将hdfs中的数据导出到关系型数据库或文本文件中。使用的是MapReduce程序来执行任务,使用jdbc与关系型数据库进行交互。

import原理:通过指定的分隔符进行数据切分,将分片传入各个map中,在map任务中对每行数据进行写入处理,没有reduce。

export原理:根据要操作的表名生成一个java类,并读取其元数据信息和分隔符对非结构化数据进行匹配,多个map作业同时执行写入关系型数据库。


5. Hadoop平台集群配置、环境变量设置
1. zookeeper

修改zoo.cfg文件,配置dataDir和各个zk节点的server地址端口,tickTime心跳时间默认是2000ms,其他超时的时间都是以这个为基础的整数倍,之后在dataDir对应的目录下写入myid文件和zoo.cfg中的server相对应

2. hadoop

hadop-env.sh配置java环境变量
core-site.xml配置zk地址,临时目录等
hdfs-site.xml配置namenode信息,rpc和http通信地址,namenode自动转换、zk连接超时时间等
yarn-site.xml配置resourcemanager地址
mapred-site.xml配置使用yarn
slaves配置节点信息
格式化namenode和zk

3. hbase:

hbase-env.sh配置java环境变量和是否使用自带zk
hbase-site.xml配置hdfs上数据存放路径,zk地址和通讯超时时间、master节点
regionservers配置各个region节点
zoo.cfg拷贝到conf目录下


6. Hadoop性能调优

调优可以通过系统配置、程序编写和作业调度算法来进行。

调优的大头:

  1. mapred.map.tasks、mapred.reduce.tasks设置mapreduce任务数(默认都是1)
  2. mapred.tasktracker.map.tasks.maximum每台机器上的最大map任务数
  3. mapred.tasktracker.reduce.tasks.maximum每台机器上最大的reduce任务数
  4. mapred.reduce.slowstart.completed.maps配置reduce任务在map任务达到百分之几的时候开始进入。
  5. mapred.compress.map.output,mapred.output.compress配置压缩项,消耗cpu提升网络和磁盘io
  6. 合理利用combiner

这几个参数要看实际节点的情况进行配置,reduce任务是在33%的时候完成copy,要在这之前完成map任务,(map可提前完成)。


7. Hadoop的sequencefile的格式

Sequencefile文件是Hadoop用来存储二进制形式库对而设计的一种平面文件;Hadoop的HDFS和MapReduce子框架主要是针对大数据文件儿设计的,在小文件的处理上不但效率低下,而且十分消耗磁盘空间。
解决办法通常是选择一个容器,将这些小文件组织起来统一存储。HDFS提供了两种类型的容器,分别是SequenceFile和MapFile。


8. 描述MapReduce的优化方法
  1. mapper优化

mapper调优主要就一个目标:减少输出量
我们可以通过增加combine阶段以及对输出进行压缩设置进行mapper优化

1>combine合并:
实现自定义combine要求继承reduce类。比较适合map的输出是数值型的,方便进行统计。

2>压缩设置:
在提交job的时候分别设置启动压缩和指定压缩方式。

  1. reduce优化

reduce调优主要是通过参数调优和设置reduce的个数来完成。
reduce个数调优
要求: 一个reduce和多个reduce的执行结果一致,不能因为多个reduce导致执行结果异常。
规则: 一般要求在Hadoop集群中执行MapReduce程序,map执行完100%后,尽量早的看到reduce执行到33%,可以通过命令hadoop job -status job_id或者web页面来查看。
原因: map的执行process数是通过inputformat返回recordread来定义的;而reduce是由三部分构成的,分别为读取mapper输出数据、合并所有输出数据以及reduce处理。其中第一步要依赖map的执行,所以在数据量较大的情况下,一个reduce无法满足性能要求的情况下,我们可以通过调高reduce的个数来解决该问题。
优点: 充分利用集群的优势。
缺点: 有些MapReduce的程序无法利用多reduce的优点。


9. 两个类TextInputFormat和FileInputFormat的区别是什么?

相同点:

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

区别:

TextInputFormat将每一行在文件中的起始偏移量作为key,每一行的内容作为value。默认以\n或回车键作为一行记录。
KeyValueTextInputFotmat适合处理输入数据的每一行是两列,并用tab分离的形式。


10. 有可能使 Hadoop 任务输出到多个目录中么?如果可以,怎么做?

Hadoop 内置的输出文件格式有:
MultipleOutputs 可以把输出数据输送到不同的目录;
在自定义的reduce的函数中首先使用setup函数(注:该函数在task启动后数据处理前就调用一次)new出MultipleOutputs 对象,利用该对象调用 write 方法定义输出的目录。


11. Hadoop API 中的什么特性可以使 map reducer 任务以不同语言(如 Perl,ruby,awk 等)实现灵活性?

Hadoop序列化机制,支持多语言的交互。


12. 列举你了解的海量数据的处理方法及适用范围,如果有相关使用经验,可简要说明。

mapreduce 分布式计算 mapreduce 的思想就是分而治之。
倒排索引 :一种索引方法,用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射,在倒排索引中单词指向了包含单词的文档。
消息队列 :大量的数据写入首先存入消息队列进行缓冲,再把消息队列作为数据来源进行数据读取。
数据库读写分离 :向一台数据库写入数据,另外的多台数据库从这台数据库中进行读取。


13. 一个 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次数(mapreduce两端的合并文件的数目):通过调整io.sort.factor参数,增大merge的文件数目,减少merge的次数,从而缩短mr处理时间。

14. Hadoop会有哪些重大故障,如何应对?至少给出 5个。
  1. namenode 单点故障:通过 zookeeper 搭建 HA 高可用,可自动切换 namenode。
  2. ResourceManager单点故障:可通过配置YARN的HA,并在配置的namenode上手动启动ResourceManager作为Slave,在 Master 故障后,Slave 会自动切换为Master。
  3. reduce阶段内存溢出:是由于单个reduce任务处理的数据量过多,通过增大reducetasks数目、优化partition 规则使数据分布均匀进行解决。
  4. datanode内存溢出:是由于创建的线程过多,通过调整linux的maxuserprocesses参数,增大可用线程数进行解决。
  5. 集群间时间不同步导致运行异常:通过配置内网时间同步服务器进行解决。

15. 什么情况下会触发 recovery 过程, recover 是怎么做的。

当jobtracker.restart.recover 参数值设置为 true, jobtracker 重启之时会触发recovery机制;
在JobTracker重启前,会在history log中记录各个作业的运行状态,这样在JobTracker关闭后,系统中所有数据目录、 临时目录均会被保留,待 JobTracker 重启之后,JobTracker 自动重新提交这些作业,并只对未运行完成的 task 进行重新调度,这样可避免已经计算完的 task 重新计算。


16. 你认为 hadoop 有哪些设计不合理的地方。
  1. 不支持文件的并发写入和对文件内容的随机修改。
  2. 不支持低延迟、高吞吐的数据访问。
  3. 存取大量小文件,会占用 namenode 大量内存,小文件的寻道时间超过读取时间。
  4. hadoop 环境搭建比较复杂。
  5. 数据无法实时处理。
  6. mapreduce 的 shuffle 阶段 IO 太多。
  7. 编写 mapreduce 难度较高,实现复杂逻辑时,代码量太大。

你可能感兴趣的:(学习笔记)