### Hadoop
> hadoop主要
包括:hdfs(存储)/MapReduce(计算)/Yarn(资源调度)
#### 1.HDFS
> **hdfs**是hadoop分布式
文件存储系统,采用master/slave架构,主要
包括:NameNode,D
atanode,客户端
> 需要关注的原理:NN和DN之间是怎么工作联系的?NN和2NN之
间的关系和联系?以及整个读写数据的流程图?
1-1 **组成架构图**

1-2 **NN**
NameNode作为master服务,主要负责管理
文件系统的元数据以及客户端对
文件的访问(
文件被分割成块的信息+块归属DN的信息)
1-3 **DN**
DateNode作为slave,每个物理节点对应
一个DN,管理块信息,并通过心跳定时发送到NN,主要负责处理客户端的读写请求。
1-4 **
文件读写请求流程-
文件写入**
客户端请求写入
文件->NN根据
文件块大小和配置,返回给客户端它们要写入的DN的信息->客户端划分block->按照顺序写入dn
1-5 **
文件读写请求流程-
文件读取**
客户端向NN发送
文件读取请求->NN向客户端返回block信息以及其所在的DN信息->客户端读取
文件。
1-6 **备份数据存放**
HDFS采用机架感知的策略决定备份数据存放。
1-7 **副本的选择**
HDFS会尽量读取近的副本,降低整体的宽带消耗和读取延时。
#### 2.MapReduce
> MR的重要过程:job提交/inputformat/map/shuffle/reduce/outputformat/
2-1 **job提交流程**
>结合源码分析:
```
1. job.waitForCompletion(true);//提交Job
-->进入wait
方法--> 判断状态,进入submit
方法
-->submit(){
1.ensureState(JobState.DEFINE); //再次确认Job的状态
2.setUseNewAPI(); //设置使用新的API
3.connect();
--> 进入connect{
//确定使用的是LocalJobRunner 还是 YarnRunner
1.return new Cluster(getCon
figuration());
//1.创建Cluster对象
2.initialize(jobTrackAddr, conf);
3.clientProtocol = provider.create(conf);
//创建ClientProtocol
--> LocalJobRunner | YarnRunner//这里是local
}
4.getJobSubmitter(cluster.getFileSy
stem(),
cluster.getClient());//
获取提交对象
5.return submitter.submitJobInternal(Job.this,
cluster); // 提交Job
{
1 checkS
pecs(job); //确认
输出路径是否存在
2 JobSubmissionFiles.getStagingDir(cluster,
conf);//
获取临时工作目录
3 submitClient.getNewJobID();
//获得job提交真正路径
4 Path submitJobDir = new Path(jobStagingArea, jobId.toString());
5
copyAndCon
figureFiles(job, submitJobDir);
--> FileSy
stem.mkd
irs(jtFs, submitJobDir, mapredSysPerms); //在
文件系统上创建Job的提交目录
6 int maps = writeSplits(job, submitJobDir); //
生成切片个数
7 conf.setInt(MRJobCon
fig.NUM_MAPS, maps); //根据切片的个数设 置MapTask的个数
8 writeConf(conf, submitJobFile); //将job相关的信息写到job提交目录中
9 submitClient.submitJob( xxxx ); //真正的提交Job去执行
10 jtFs.delete(submitJobDir, true); //
删除Job的工作目录
}
}
```
2-2 **InputFormat**
> 1.主要作用
> 2.主要实现类
1.主要作用:
a.验证job的输入规范
b.对输入的
文件切分 形成多个InputSplit
文件 每
一个InputSplit对应
一个map任务
c.创建RecordReader 从InputSplit分片中读取数据 提供给map使用
2.主要实现类
a. FiexedLengthInputFormat
b.
keyvalueInputFormat
c. TextInputFormat
d. SequenceFileInputFormat 二进制
文件
e. CombineFileInputFormat 和
默认的FileInputFormat相比 合并多个小
文件成为
一个分片,分片过程也会考虑机架以及数据本地性 让每个mapper任务可以处理更多的数据
2-3 **shuffle流程图**

2-3-1 流程图解释
Map
输出的结果首先会写入环形缓冲区,达到内存的80%(100m)就会反向溢写,溢写前会分区/排序,每次溢出都会
生成新的磁盘
文件,这样,
一个文件块,
一个mapper,会
生成多个磁盘
文件,mapper任务结束的时候,会将多个磁盘
文件归并排序合并成
一个大的磁盘
文件。最后就是
一个mapper
一个磁盘
文件(多个分区)。
每个Reduce会分别拿不同分区的数据,进行汇总
输出。
2-4 **outputformat**
实现
文件最终的
输出路径和
输出格式。
2-5 **典型WordCount**
[转载:java 编写MR程序之 - WordCount 及解析](https://blog.csdn.net/u011393661/article/details/80227272)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。