Hadoop总结—相关面试题
1. 入门
1.1 简要描述如何安装配置Apache的一个开源hadoop
- 使用root账户登录
- 修改ip
- 修改host主机
- 配置SSH免密登录
- 关闭防火墙(1-5可以简单说成准备一台服务器)
- 安装JDK
- 解压Hadoop安装包
- 配置Hadoop核心文件:hadoop-env.sh,core-site.xml,mapred-site.xml,hdfs-site.xml
- 配置hadoop环境变量
- 格式化:
hadoop namenode-format
- 启动节点:
start-all.sh
1.2 hadoop中需要哪些配置文件,其作用是什么
文件名需要记住
- core-site.xml
- hadoop-env.sh
- hdfs-site.xml
- mapred-site.xml
- yarn-site.xml
1.3 请列出正常工作的hadoop集群中hadoop都分别需要启动哪些进程,它们的作用分别是什么
- NameNode它是hadoop中的主服务器,管理文件系统名称和对集群中存储的文件的访问,保存有metadata。
- SecondaryNameNode,它不是Namenode的热备,而是提供周期检查点和清理任务。帮助NN合并editslog,减少NN的启动时间。
- DataNode它负责管理连接到节点的储存(一个集群中可以有多个节点)。每个节点都运行一个DataNode。
- ResourceManager(JobTracker)负责调度DataNode上面的工作。每个DataNode有一个TaskTracker,它们执行实际工作。
- NodeManager,也就是TaskTracker。
1.4 简述Hadoop的几个默认端口及其含义
- dfs.namenode.http-address:50070
- SecondaryNameNode 辅助名称节点的端口号:50090
- dfs.datanode.address:50010
- fs.defaultFS:8020 or 9000
- yarn.resourcemanager.webapp.address:8088
2. HDFS
2.1 HDFS的读写流程
2.1.1 上传
- 客户端向namenode请求上传文件,namenode检查目标文件是否已经存在,父目录是否已经存在。
- namenode返回是否可以上传
- 客户端请求第一个block上传到哪几个datanode服务器上
- namenode返回3个datanode的节点,分别为dn1,dn2,dn3.
- 客户端请求dn1上传数据,dn1收到请求会继续调用dn2,然后dn2调用dn3,将通信管道建立完毕。
- dn1、dn2、dn3逐级应答客户端
- 客户端开始往dn1上传第一个block,以packet为单位,dn1收到了就会把它传给dn2,dn2收到了就传给dn3。dn1每传一个packet就会放入一个应答队列等待应答。
- 当一个block传输完毕之后,客户端再次请求NameNode上传第二个block的服务器,然后重复执行上述3-7步。
2.1.2 下载
- 客户端向namenode请求下载文件,namenode通过查询元数据,找到文件块所在的datanode地址。
- 挑选一台datanode(就近原则)服务器,请求读取数据
- datanode开始传输数据给客户端,从磁盘里读取数据,以packet为单位来做校验
- 客户端以packet为单位接收,现在本地缓存,然后写到目标文件。
2.2 SecondaryNameNode和NameNode的区别与联系
区别:
- NameNode负责管理整个文件系统的元数据,以及每个路径(文件)所对应的数据块信息。
- SecondaryNameNode主要用于定期合并镜像文件和编辑日志
联系:
- SecondaryNameNode中保存了一份namenode一直的镜像文件(fsimage)和编辑日志(edits)
- 在namenode发生故障的时候,可以从SecondaryNameNode恢复数据。
2.3 服役新节点和退役旧节点
关于白名单和黑名单
2.4 NameNode挂了怎么办
- 将SecondaryNameNode中数据拷贝到NameNode存储数据库的目录
- 使用-importCheckpoint选项启动NameNode守护进程,从而将SecondaryNameNode中的数据拷贝到NameNode目录中去
3. MapReduce
3.1 谈谈hadoop序列化和反序列化,以及自定义bean对象实现序列化
- 序列化就是把内存中的对象,转换成字节序列(或者其他数据传输协议)以便于存储的持久化和网络传输。
- 反序列化就是将收到的字节序列(或者其他传输协议)或者是磁盘的持久化数据转换成内存中的对象。
- hadoop使用的是自己的序列化机制(Writable)
自定义bean对象: - 自定义bean对象的时候必须要实现Writable的接口
- 反序列化的时候,需要反射调用空参构造函数,所以bean对象一定要有空参构造函数。
- 重写序列化和反序列化的函数
- 反序列化参数到对象的顺序,一定要和序列化这些参数的顺序一致。
- 如果需要把bean当成key值传输,还要写Comparable接口,它一般和Writable接口合并成WritableComparable接口。
3.2 FileInputFormat切片机制
- 在向集群提交资源的时候,提交了:xml配置文件、jar包、切片信息
- 提交到:
- 切片大小一般按块的大小切,数据量大于切片大小的1.1倍才切
3.3 自定义InputFormat
- 自定义一个类继承FileInputFormat
- 改写RecordReader,实现一次读取一个完整的文件封装成KV
3.4 一个job的Map和Reduce数量是由什么决定的
-
map
由切片数量决定的 -
reduce
reduce的数量可以根据job.setNumReduceTasks(N)
,N为Reduce的数量,不设置默认为1
3.5 MR工作流程(MapTask工作机制、ReduceTask工作机制)
Hadoop之MapReduce—Shuffle的详细工作流程
两张图
3.6 MapReduce有几种排序及排序发生的阶段
排序种类
- 部分排序:MapReduce根据输入记录的键对数据集排序,保证输出的每个文件内部有序
- 全排序:全排序的实现是内部快排+外部归并排序达到效果
- 辅助排序(GroupingComparator分组
- 二次排序:在使用CompareTo的时候,设定两个判断条件。
- 自定义排序WritableComparable
发生阶段
- 二次排序、全排序、部分排序发生在map
- 辅助排序发生在Reduce
3.7 shuffle的流程和优化
- 增加环形缓冲区发生溢写的比例,减小溢写的次数
- 增加Combiner
- 增大溢写文件
- shuffle的过程可以把文件压缩进行传递
3.8 Combiner的作用是什么,什么情况可以使用,什么情况不可以使用,和reduce的区别在?
- Combiner的意义就是对每个MapTask的输出进行局部汇总,以减小网络传输量
- Combiner能够应用的前提是要不影响最终结果,并且,Combiner的输出kv跟reducer的输入KV要对应起来,这也就是说,Combiner的操作空间很小。
- Combiner和Reducer的区别在于运行位置,Combiner是在每个MapTask所在的节点运行,reduce是接收所有的数据并且处理输出。
3.9 如果不自定义Partitioner,数据是如何分区的
- 是根据每条数据的key的hashcode值模运算reduce的数量,得到的数字就是分区号。
3.10 MapReduce怎么实现TopN
可以自定义groupingComparator,或者在map端对数据进行排序,然后在reduce输出时,只输出N个数即可。
3.11 使hadoop任务输出到多个目录中
自定义OutputFormat
- 自定义OutputFormat
- 改写recordwriter,具体改写输出数据的方法write()
3.12 实现join的几种方法以及每种方法的实现
- Reduce Join
设两张表通过属性p进行连接,通过自定义分组,把具有相同p的数据放在一组,在reduce端对两张表进行数据的替换和连接。 - Map Join
把一张(或几张)小一点的表放进缓存,在map端就完成对表的拼接。
3.13 怎样实现二级排序
对map端输出的key进行排序,实现的compareTo方法,在该方法中排序的条件有两个。
3.14 切分成几块
hdfs块大小为64M
输入类型为FIleInputFormat
有三个文件的大小分别是:64kb、65MB、127MB
hadoop框架会把这些文件拆分成多少块
- 五块:64k、64M、1M、64M、63M
块的大小是严格切分的,只有切片才是大于1.1倍才切
3.15 RecordReader的作用
用来读取不同类型的文件的
3.16 编程题
1G的文件,分别有id,name,mark,source四个低端,按照mark分组,id排序,手写一个MapReduce,其中有几个Mapper?
public int compareTo(sortBean o){
int result;
if(this.mark>o.getmark()){
return 1;
}else if(this.mark<o.getmark()){
return -1;
}else{
return (this.id>o.getid())?-1:1
}
}
分为8块
4. Yarn
4.1 简述hadoop1与hadoop2的架构异同
- 加入了yarn解决了资源的调度问题
- 加入了zookeeper的支持,实现比较可靠的高可用
4.2 为什么会产生yarn,有什么优势
- 完成了对资源运算和资源分配的完全解耦
- yarn上可以运行各种类型的分布式运算系统,比如MapReduce,storm程序,spark程序等。
4.3 MR提交的全过程
4.4 HDFS的压缩算法?及每种算法的应用场景
4.5 hadoop调度策略
主要有三种:FIFO(先进先出),Capacity Scheduler(容量调度器,默认),Fair Scheduler(公平调度器)
4.6 MapReduce推测执行算法及原理
5.MapReduce的优化
6.重点
入门
- 虚拟机准备
- 编写脚本分发文件
- SSH免密登录
- 群起脚本
HDFS
- shell操作(上传下载)
MapReduce
- wordcount案例
- 序列化案例
- 自定义InputFormat案例
- CombineTextInputFormat
- 分区案例
- 排序案例
- OutputFormat
- MapJoin案例
压缩
- snappy
- Lzo
优化
- 调优参数(起码要知道有什么可以调)
其他案例
- TopN案例