hadoop2.x的面试题及详解

简述apache hadoop的安装过程
这里说明hadoop 主要有三大发行版本
apache:最原始的版本,方便学习
cloudera(cdh版本):大型互联网使用的较多,解决版本兼容问题
Hortonworks(hdp版本):几乎不用
apache hadoop 安装过程
安装jdk—安装ssh免密—安装apache hadoop—nn 格式化–启动

hadoop 需要哪些配置文件
8个 core-site.xml/hdfs-site.xml/mapred-site.xml/yarn-site.xml/slaves 以及3个环境配置文件

正常工作的hadoop 集群,需要启动哪些进行
nn dn 2nn rm nm 至少这五个

hadoop 常见端口号
50070-nn webui
50090-dn webui
8088–rm webui
9000–nn rpc
19888–historyserver webui

hdfs 读数据流程
a.客户端对象向nn 请求读/下载文件/a.txt(200m)
b.nn向客户端返回元数据(blk1 dn1 dn2 dn3 …),当然没有文件直接报错
c.客户端创建文件输入流,请求读blk1,传输数据
d. 一次读取第二块blk2,传输数据
d.关闭流

hdfs 写数据流程
首先说明hdfs文件不能直接修改,只能追加或者上传
hdfs fs -put a.txt /usr/
a.客户端对象向nn请求上传文件a.txt(200m)到目标目录/usr/
b.nn 检查目标目录,返回客户端目录存在可以上传
c.客户端请求上传第一个blk_1,nn 返回dn 列表给客户端
d.客户端创建文件输出流,请求建立block传输通道
e. 客户端一个个PACKAGE上传到dn1,dn1一边写入磁盘,一般建立网络流传输到第二个节点,同样传输到第三个节点
f. 等待所有block 上传完成,nn记录元数据

**nn 2nn 作用 **
nn :保存元数据
2nn :编辑日志滚动为镜像,加快nn 启动
还有就是nn 挂掉,可以从2nn 拷贝数据帮助恢复

hadoop 序列化和反序列化
hadoop 采用较java 轻量级的序列化writable
序列化: 就是将内存中对象转换为字节序列方便网络传输
自定义bean 实现序列化的注意事项
a.实现writable接口
b.重写序列化和反序列化方法
c.反序列化时候需要调用空参数构造,所以bean 对象必须空参数构造
d.序列化和反序列化顺序一致
e.排序的话要实现writablecomparator,重写comparator 方法

fileInputFormat 切片机制
首先切片是逻辑切分的。切分不考虑数据集整体,只对单一文件切片
切片遵守俩个机制
a. 默认按照块大小切,确保一个切片来自于同一个dn 减少网络传输
b.满足bytesRemaining/splitSize >1.1
切片要满足这俩个条件
注意是切片不是块大小
块是物理切分的
切片是逻辑切分的

如何决定map和reducer的数量
map 数据就等于上述切片数量
reducer 数量在driver端设置
理解数据块 & 数据切分

mapTask工作机制 reducerTask 工作机制 mr工作机制 shufle 工作机制
这几个问题其实就是文mr 的工作流程
mapTask :

  1. 文件通过split 被逻辑且分为多个split 文件
  2. 通过record 按行读取给自定义map 进行处理
  3. map 处理结束的数据交给环形缓冲器,每个mapTask 都有自己的环形缓冲器
  4. 缓冲器到达阀值的时候落地磁盘形成临时文件
  5. 整个mapTask 结束对临时文件进行合并,生产最终的输出文件
  6. 多个mapTask 并行运算,都完成后等待reduceTask 拉取
    shuffle:
  7. MapTask 输出结果默认保存在100M 的环形缓冲器中,保存的是k/v, partition 信息
  8. 当环形缓冲器中数据达到阀值的时候,数据就会落地磁盘,写入之前对数据按照key.comparator 进行排序,按照key的getPartition 进行分区
  9. 进所有溢出文件合并,确保一个mapTask 只生成一个中间文件
  10. 所有mapTask 结束之后,每个reduceTask 启动线程,copy 属于自己的那一份数据到内存中
  11. 拷贝的同时会对内存中数据进行合并merge
  12. 合并的同时会进行排序,分区操作
    reduceTask:
    reduceTask 的输入是已经分好组的数据,依次为每个键对应的组进行reduce 处理

如何优化shufle
a.增加combiner,只适合聚合操作
b. 增加环形缓冲取大小到150M, 阀值90%,减少溢写次数
c.map输出压缩
d.增大溢写文件

mr 中combiner的作用,和reducer的区别
combiner 预聚合作用 它也是extends reducer
只有做聚合操作可以使用平均值等不适合
作用在map端
和reducer作用位置不一样

如果没有自定义分区,数据在被送到reducer前怎么分区的?默认分区?
如果没有自定义分区,则根据key.hashcode%分区数 的值就是分区号
决定发往哪个reducer

hadoop 任务可以输出到多目录中吗?
使用multipleOutPutFormat
自定义outPutFormat

yarn 有什么优势
主要解决用户程序(mr)和资源调度 框架解耦

hdfs 压缩
snappy lzo(input output) …

hadoop调度器
fifo 容量调度器 公平调度器
默认容量调度器,目的提高并法度

mapreduce 怎么解决数据均衡问题
数据打散 加盐

nn 挂了怎么办
a.将2nn数据拷贝到nn存储数据目录,单独启动nn
b.使用-importCheckPoint启动nn 的守护进程,进而将2nn数据拷贝到nn中

mapreduce 跑的慢的原因
计算机性能–内存 cpu 等
数据倾斜—combiner 过滤 打散
map reduce 数量设置不合理
小文件过多—jvm 重用 archive combineInputformat

** 服役新节点 & 退役旧节点**
服役新节点
克隆原来服务器,删除数据,单独启动dn
新的服务器需要在白名单里面,保证数据安全
如果数据不均衡,可以采取以下目录负载均衡
start-balancer.sh 平衡负载
退役旧节点
在黑名单上主机强制退出,退出前会自动拷贝数据到其他节点

白名单和黑名单不能有一样的主机,会晕~~~

hadoop 为什么不用java序列化
java 序列化是一个重量级的序列化框架
一个对象被序列化后,额外带很多信息
不便大数据中使用
hadoop 支持多种语言的交互

dn 的多目录配置& nn 的多目录
nn 多目录保存的数据是相同的
dn 保存的数据是不同的

hadoop集群之间的递归数据复制
hadoop distcp hdfs://hadoop-101:9000/user/a.txt
hdfs://hadoop-103:9000/user/
手写wordcount mr
mapper类

public class WordCounrtMapper extends Mapper<LongWritable,Text,Text,IntWritable>{
@override
protected void map(LongWritable key,Text value, Context context)throws IOException, InterruptedException{
 String line = value.toString();
        String[] fields = line.split(" ");
        for (String word : fields) {
            text.set(word);
            context.write(text, intWritable);
        }
}
}

reducer类

public class WordCountReducer extends Reducer<Text,IntWritable,Text,IntWritable>{
@Override 
protected void reduce(Text key,Iterateble<IntWritable> values,Context context)hrows IOException, InterruptedException{
 int sum = 0;
        for (IntWritable value : values) {
            sum += value.get();
        }
        v.set(sum);
        context.write(key, v);
}
}

driver 类七个步骤

public class WordcountDriver {

	public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {

		// 1 获取配置信息以及封装任务
		Configuration configuration = new Configuration();
		Job job = Job.getInstance(configuration);

		// 2 设置jar加载路径
		job.setJarByClass(WordcountDriver.class);

		// 3 设置map和reduce类
		job.setMapperClass(WordcountMapper.class);
		job.setReducerClass(WordcountReducer.class);

		// 4 设置map输出
		job.setMapOutputKeyClass(Text.class);
		job.setMapOutputValueClass(IntWritable.class);

		// 5 设置最终输出kv类型
		job.setOutputKeyClass(Text.class);
		job.setOutputValueClass(IntWritable.class);
		
		// 6 设置输入和输出路径
		FileInputFormat.setInputPaths(job, new Path(args[0]));
		FileOutputFormat.setOutputPath(job, new Path(args[1]));

		// 7 提交
		boolean result = job.waitForCompletion(true);

		System.exit(result ? 0 : 1);
	}
}

数据清洗案例
**yarn 作业提价全过程 **
mr 参数调优
hadoop 实现二次排序
nn 的高可用需要哪些组件
mapreduce怎么实现TOPN
hadoop几种join?
mr 有几种排序以及排序发生的阶段
hadoop 小文件的处理方法
归档–减少nn的压力 archive .har 文件
jvm 重用
combineInputFormat 代替FileInputFormat

**是不是一定要等待mapTask 结束才开始reduceTask **
可以设置mapTask&reduceTask 共存

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值