1:HDFS 的读取流程
网络拓扑图:根据客户端与DataNode的网络连接情况进行排序,按优劣顺序返回给客户端;
HDFS的读取流程:首先应用程序或客户端向HDFS发起读取请求,指定要读取的文件的路径和偏移量,
然后客户端向NameNode发起文件读取请求(RPC)NameNode是HDFS的元数据管理节点,NameNode会去检查目录权限与目录,目标文件是否存在然后响应检查结果,
客户端会再发送一个读取请求向NN,block从哪里读取,NN会返回block块所有副本的位置,按照集群拓扑结构的出DN与客户端的距离然后进行排序,(网络拓扑结构中距离Client近的排前面;心跳机制中超时汇报的DN状态为stale的排在后面),将文件块在DN节点位置返回给客户端
客户端向DN发起请求建立通信连接进行数据块的传输。(如果所需传输的数据在多个DN中存在多个副本,客户端会选择与距离最近或者网络延迟最低的DN建立通信);
建立管道通信后客户端会从DN节点读取所需数据的内容,(数据块以流的形式进行传输,客户端🐖块读取数据),返回给客户端或者应用程序。
2: HDFS 的写入流程
HDFS的写入流程:首先客户端会向NN的发起文件上传的请求(RPC create)NN会检查权限与目录和目标文件是都存在,如果存在返回响应结果;
然后客户端还会在发起一个写的请求向NN,询问NNblock上传到哪个DN中,NN会根据机架感知策略进行分配(本地节点资源丰富也不忙的节点,选择和第一个节点不同的机架的其他节点,与第二个节点相同机架的其他节点)然后NN会返回满足条件的DN节点给客户端,
客户端会请求三台中的一台DN(网络拓扑的就近原则,如果都一样,则随机挑选一台DN)上传数据到DN,DN1收到请求会继续调用DN2建立传输通道,然后DN2会调用DN3建立传输通道,建立完成后,然后逐级返回给客户端。
然后客户端开始向DN上传第一个block(先从磁盘读取数据放到本地内存中缓存),以packet为单位,写入时会进行校验,他并不是通过packet(64k)而是以(512byte)为单位进行校验。
DN1收到一个packet就会传给DN2,DN2传给DN3,DN1每传一个pocket会放入一个应答队列等待应答,第一个block传输完成后,客户端会接着请求NN上传第二个block;
3: 阐述 MapReduce 的计算流程
Hadoop-MapReduced的计算流程
首先我们有个文件存进HDFS分成一个一个的block块(默认128M)然后根据块在进行split切分切成每一小块,每一个小块的大小约是64~128M,可以根据情况动态调整;(split可以动态调整参与计算的节点数量,希望更多的节点参与到计算,使用比我呢见块更小的切片设置,希望更少的节点参与到极端中,使用文件块更大的切片设置,默认和文件块一样大);
切完片之后每个split切片会生成一个计算任务(MapTask),读取的数据的格式是以KV形式,K表示行偏移量,V表示一行数据,写入到MapTask的环形缓冲区中(环形缓冲区:1.底层是一个数组,逻辑上数组首尾相接,2.数组的大小默认是100M,也是可以根据性能调整,当数据写到80%时,开始按照元数据中的分区与排序信息触发溢写,3.在剩余的20%中间设置新的赤道,如此反复,环形数据缓冲区实现无卡顿读写,4.我们在分区和排序中默认是使用Hash分区与快排)
在环形缓冲区达到溢写阈值时会溢写出一个数据文件,将溢写出的数据写入到磁盘中,进行一个合并处理(默认是最大是10个合并一次,主要减少了文件数量,相当于减少了IO次数),然后可以选择Combiner(Map预聚合用户自定义设置,每次spill溢写会被调用,合并文件超过三个会被调用,使用组合器也是减少了传输的数据量,节省了带宽)然后可以再写出时进行数据压缩(Snappy因为写出的数据不需要考虑是否切分,使用压缩可以减少传输的数据量,节省带宽,但是会增加CPU的负载)。;
ReduceTask会将MapTask写出的数据拉取到ReduceTask,将数据写入到内存中的环形缓冲区(默认使用当前Yarn服务器的总内存的70%内存当数据写入66%时开始触发溢写)时先进去归并(归并通常指将两个或多个已排序的序列或数组合并成一个有序的序列或数组的操作)归并后溢写
根据可选Combiner预聚合,在写入磁盘中进行最终的合并处理写出到(HDFS,SQL,NoSQL)还有考虑是否在进行计算使用压缩(如果写出后不在进行计算可以使用猛压Gzip,如果写出还需要进行二次计算需要推荐使用支持可切分的Bzip2压缩)程序员会重写reduce方法的逻辑,按照分组规则,将相同组的数据Value会在一起,循环将Value累加起来,计算有多少人
Shuflle洗牌,(分布式的天敌)
从代码的视角:MapTask的map方法开始到ReduceTask的reduce方法前
从服务器的视角:服务器之间需要数据交换进行汇集合并处理,分分合合的过程会产生多次的网络IO,磁盘IO
4: 阐述YARN 集群的工作流程
Yran的工作流程:
1.首先我们客户端会提交一个job,向RM申请一个Job-id;
2.Rm将Job-id和资源路经提交给客户端;
3.客户端会根据Rm提供的路径上传所需要的资料到指定的路径;
4.上传完资源之后,会给RM发送一个执行作业的请求,RM接受这请求之后,会创建一个AM来管理这个Job;
5.AM会将job添加到RS中,RS维护了一个队列,job在其中内部按一定的规则等待执行。
6.RS会通知AM有空闲的NodeManger,可以用来执行job
7.AM会让分配的NM开辟资源Container,并且在其中启动job对应的AM;
8.AM会获取提交在HDFS上的文件,根据数据生成Task;
9.ApplicationMaster向RM申请运行Task的任务资源;
10.RM 会将需要运行的Task分配给空闲的NM,NM接受Task并创建用于执行task的Container
11.AM通知接收到这个Task的NM开始计算
12.如果NM上的该Task执行完毕,还有新的Task,则向RM申请新的Container运行新的Task
13.所有的Task都完成说明Job完成,AM会向RM申请注销自己