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