微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Hadoop详解

### Hadoop > hadoop主要包括:hdfs(存储)/MapReduce(计算)/Yarn(资源调度) #### 1.HDFS > **hdfs**是hadoop分布式文件存储系统,采用master/slave架构,主要包括:NameNode,Datanode,客户端 > 需要关注的原理:NN和DN之间是怎么工作联系的?NN和2NN之间的关系和联系?以及整个读写数据的流程图? 1-1 **组成架构图** ![image.png](http://www.icode9.com/i/li/?n=2&i=images/20210710/1625892197605947.png?,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=) 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(getConfiguration()); //1.创建Cluster对象 2.initialize(jobTrackAddr, conf); 3.clientProtocol = provider.create(conf); //创建ClientProtocol --> LocalJobRunner | YarnRunner//这里是local } 4.getJobSubmitter(cluster.getFileSystem(), cluster.getClient());//获取提交对象 5.return submitter.submitJobInternal(Job.this, cluster); // 提交Job { 1 checkSpecs(job); //确认输出路径是否存在 2 JobSubmissionFiles.getStagingDir(cluster, conf);//获取临时工作目录 3 submitClient.getNewJobID(); //获得job提交真正路径 4 Path submitJobDir = new Path(jobStagingArea, jobId.toString()); 5 copyAndConfigureFiles(job, submitJobDir); --> FileSystem.mkdirs(jtFs, submitJobDir, mapredSysPerms); //在文件系统上创建Job的提交目录 6 int maps = writeSplits(job, submitJobDir); //生成切片个数 7 conf.setInt(MRJobConfig.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流程图** ![image.png](http://www.icode9.com/i/li/?n=2&i=images/20210710/1625900174789945.png?,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=) 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] 举报,一经查实,本站将立刻删除。

相关推荐