HDFS
HDFS的组成架构
这种架构主要由四个部分组成分别为HDFS Client、NameNode、DataNode和Secondary NameNode。下面我们分别介绍这四个组成部分。 1Client就是客户端。 1文件切分。文件上传HDFS的时候Client将文件切分成一个一个的Block然后进行存储 2与NameNode交互获取文件的位置信息 3与DataNode交互读取或者写入数据 4Client提供一些命令来管理HDFS比如启动或者关闭HDFS 5Client可以通过一些命令来访问HDFS 2NameNode就是Master它是一个主管、管理者。 1管理HDFS的名称空间 2管理数据块Block映射信息 3配置副本策略 4处理客户端读写请求。 3DataNode就是Slave。NameNode下达命令DataNode执行实际的操作。 1存储实际的数据块 2执行数据块的读/写操作。 4Secondary NameNode并非NameNode的热备。当NameNode挂掉的时候它并不能马上替换NameNode并提供服务。 1辅助NameNode分担其工作量 2定期合并Fsimage和Edits并推送给NameNode 3在紧急情况下可辅助恢复NameNode。
HDFS文件块的大小怎么设置
为什么块的大小不能太大也不能太小。
1、HDFS的块设置太小会增加寻址时间程序一直在找块的开始位置。
2、如果块设置太大从磁盘传输数据的时间会明显大于定位这个块开始位置所需的时间。导致程序在处理这块数据时会非常慢。
HDFS块的大小设置主要取决于磁盘传输速率。
1NameNode启动
1第一次启动NameNode格式化后创建Fsimage和Edits文件。如果不是第一次启动直接加载编辑日志和镜像文件到内存。
2客户端对元数据进行增删改的请求。
3NameNode记录操作日志更新滚动日志。
4NameNode在内存中对元数据进行增删改。
2Secondary NameNode工作
1Secondary NameNode询问NameNode是否需要CheckPoint。直接带回NameNode是否检查结果。
2Secondary NameNode请求执行CheckPoint。
3NameNode滚动正在写的Edits日志。
4将滚动前的编辑日志和镜像文件拷贝到Secondary NameNode。
5Secondary NameNode加载编辑日志和镜像文件到内存并合并。
6生成新的镜像文件fsimage.chkpoint。
7拷贝fsimage.chkpoint到NameNode。
8NameNode将fsimage.chkpoint重新命名成fsimage。
HDFS写入流程
1客户端通过Distributed FileSystem模块向NameNode请求上传文件NameNode检查目标文件是否已存在父目录是否存在。 2NameNode返回是否可以上传。 3客户端请求第一个 block上传到哪几个datanode服务器上。 4NameNode返回3个datanode节点分别为dn1、dn2、dn3。 5客户端通过FSDataOutputStream模块请求dn1上传数据dn1收到请求会继续调用dn2然后dn2调用dn3将这个通信管道建立完成。 6dn1、dn2、dn3逐级应答客户端。 7客户端开始往dn1上传第一个block先从磁盘读取数据放到一个本地内存缓存以packet为单位dn1收到一个packet就会传给dn2dn2传给dn3 dn1每传一个packet会放入一个应答队列等待应答。 8当一个block传输完成之后客户端再次请求NameNode上传第二个block的服务器。
HDFS读取流程
1客户端通过Distributed FileSystem向NameNode请求下载文件NameNode通过查询元数据找到文件块所在的DataNode地址。 2挑选一台DataNode就近原则然后随机服务器请求读取数据。 3DataNode开始传输数据给客户端从磁盘里面读取数据输入流以packet为单位来做校验。 4客户端以packet为单位接收先在本地缓存然后写入目标文件。
MapReduce
MapReduce的Shuffle过程
1Map方法之后Reduce方法之前这段处理过程叫Shuffle
2Map方法之后数据首先进入到分区方法把数据标记好分区然后把数据发送到环形缓冲区环形缓冲区默认大小100m环形缓冲区达到80%时进行溢写溢写前对数据进行排序排序按照对key的索引进行字典顺序排序排序的手段快排溢写产生大量溢写文件需要对溢写文件进行归并排序对溢写的文件也可以进行Combiner操作前提是汇总操作求平均值不行。最后将文件按照分区存储到磁盘等待Reduce端拉取。
3每个Reduce拉取Map端对应分区的数据。拉取数据后先存储到内存中内存不够了再存储到磁盘。拉取完所有数据后采用归并排序将内存和磁盘中的数据都进行排序。在进入Reduce方法前可以对数据进行分组操作。
MapTask工作机制
MapTask有以下几个阶段Read、Map,Collect、Spill、Combine
1Read阶段MapTask通过用户编写的RecordReader从输入InputSplit中解析出一个个key/value。
2Map阶段该节点主要是将解析出的key/value交给用户编写map()函数处理并产生一系列新的key/value。
3Collect收集阶段在用户编写map()函数中当数据处理完成后一般会调用OutputCollector.collect()输出结果。在该函数内部它会将生成的key/value分区调用Partitioner并写入一个环形内存缓冲区中。
4Spill阶段即“溢写”当环形缓冲区满后MapReduce会将数据写到本地磁盘上生成一个临时文件。需要注意的是将数据写入本地磁盘之前先要对数据进行一次本地排序并在必要时对数据进行合并、压缩等操作。
溢写阶段详情
步骤1利用快速排序算法对缓存区内的数据进行排序排序方式是先按照分区编号Partition进行排序然后按照key进行排序。这样经过排序后数据以分区为单位聚集在一起且同一分区内所有数据按照key有序。
步骤2按照分区编号由小到大依次将每个分区中的数据写入任务工作目录下的临时文件output/spillN.outN表示当前溢写次数中。如果用户设置了Combiner则写入文件之前对每个分区中的数据进行一次聚集操作。
步骤3将分区数据的元信息写到内存索引数据结构SpillRecord中其中每个分区的元信息包括在临时文件中的偏移量、压缩前数据大小和压缩后数据大小。如果当前内存索引大小超过1MB则将内存索引写到文件output/spillN.out.index中。
5Combine阶段当所有数据处理完成后MapTask对所有临时文件进行一次合并以确保最终只会生成一个数据文件。
当所有数据处理完后MapTask会将所有临时文件合并成一个大文件并保存到文件output/file.out中同时生成相应的索引文件output/file.out.index。
在进行文件合并过程中MapTask以分区为单位进行合并。对于某个分区它将采用多轮递归合并的方式。每轮合并io.sort.factor默认10个文件并将产生的文件重新加入待合并列表中对文件排序后重复以上过程直到最终得到一个大文件。
让每个MapTask最终只生成一个数据文件可避免同时打开大量文件和同时读取大量小文件产生的随机读取带来的开销。
ReduceTask工作机制
MapTask有以下几个阶段Copy,Merge,Sort,Reduce
1Copy阶段ReduceTask从各个MapTask上远程拷贝一片数据并针对某一片数据如果其大小超过一定阈值则写到磁盘上否则直接放到内存中。
2Merge阶段在远程拷贝数据的同时ReduceTask启动了两个后台线程对内存和磁盘上的文件进行合并以防止内存使用过多或磁盘上文件过多。
3Sort阶段按照MapReduce语义用户编写reduce()函数输入数据是按key进行聚集的一组数据。为了将key相同的数据聚在一起Hadoop采用了基于排序的策略。由于各个MapTask已经实现对自己的处理结果进行了局部排序因此ReduceTask只需对所有数据进行一次归并排序即可。
4Reduce阶段reduce()函数将计算结果写到HDFS上。
Yarn
MR作业提交Yarn全过程
1作业提交
第1步Client调用job.waitForCompletion方法向整个集群提交MapReduce作业。
第2步Client向RM申请一个作业id。
第3步RM给Client返回该job资源的提交路径和作业id。
第4步Client提交jar包、切片信息和配置文件到指定的资源提交路径。
第5步Client提交完资源后向RM申请运行MrAppMaster。
2作业初始化
第6步当RM收到Client的请求后将该job添加到容量调度器中。
第7步某一个空闲的NM领取到该Job。
第8步该NM创建Container并产生MRAppmaster。
第9步下载Client提交的资源到本地。
3任务分配
第10步MrAppMaster向RM申请运行多个MapTask任务资源。
第11步RM将运行MapTask任务分配给另外两个NodeManager另两个NodeManager分别领取任务并创建容器。
4任务运行
第12步MR向两个接收到任务的NodeManager发送程序启动脚本这两个NodeManager分别启动MapTaskMapTask对数据分区排序。
第13步MrAppMaster等待所有MapTask运行完毕后向RM申请容器运行ReduceTask。
第14步ReduceTask向MapTask获取相应分区的数据。
第15步程序运行完毕后MR会向RM申请注销自己。
Yarn的默认调度器、调度器分类、以及他们之间的区别
调度器重要分为三类FIFO 、Capacity Scheduler容量调度器和Fair Sceduler公平调度器
区别
FIFO调度器先进先出同一时间队列中只有一个任务在执行。
容量调度器多队列每个队列内部先进先出同一时间队列中只有一个任务在执行。队列的并行度为队列的个数。
公平调度器多队列每个队列内部按照缺额大小分配资源启动任务同一时间队列中有多个任务执行。队列的并行度大于等于队列的个数。
【本文转自:日本cn2服务器 http://www.558idc.com/jap.html提供,感恩】