HDFS读写流程learning
有许多对流程进行描述的博客,但是感觉还是应当学习一遍代码,不然总感觉怪怪的,https://blog.csdn.net/popsuper1982/article/details/51615285,首先从这个博客学习了一遍源码,总结一下流程,因为这个博客有些地方仍然没有show出来,所以未来还会看一看相关的东西,对本博客修正一下(说的好像我这个有人看一样。。)
读文件:
1 client打开文件:找NN要一下关于file的元数据,具体表现为得到一个InStream,里面有Block信息。
每个文件会有一个对应的iNode,NN是通过file的iNode得到所有的Block,顺便对所有的Block都得到一个map<block, can_use_DN_set>,然后返回Block的list,因为里面有定位信息,所以叫LocateBlocks,(打开文件的时候默认读取范围是0~max_size,所以其实还会对file的所有Block范围进行筛选)
结果就是client得到了一个InStream,顺便把LocateBlocks拿到内存。
2 client读取文件:通过InStream里面的方法读取,对于每一个块,现在本地思考[BlockId,read_start,read_end,Block_DN],然后建立socket去对应的DN取数据。DN会做好应对,一套读取head信息打过去,就可以get到对应的数据,存放在方法传入的buf数组里面。
InStream.read(start,end,buf),里面会有LocateBlock的成员变量(如果本地没有要读取的Block,将会去NN再要一发),通过扫一下块信息,就可以知道该块应当读何处,把它放到buf的对应pos,去找DN就可以了(这里没有管client是否有资格,应当只是我没看到?)
DN:DN起来的时候会建立DataXceiveServer,功能大概就是监听端口,对于每一个来的请求建一个socket去服务。
服务socket:看到来的请求类型是读,就建立一个OutStream,对着socket往里面根据要求位置send数据,具体实现类叫BlockSend,不过暂时没看
写文件: 这里我没有看到append类型的操作,学习的博客里show的方法是,“建立完文件直接写了它,每个块被写当且仅当发生在它刚刚被创建的时候”,但是感觉肯定是有append方法的吧。。
1 client create文件:找NN创建该path的文件,并为其生成一个未控制构建的iNode,返回给client一个OutStream用来写入。顺便还会构建一个用来在client与DN之间写文件的管道(pipeline)
OutStream中有BlockStream成员变量,其中存储着到当前被写入的Block的DN的信息以及OutSteam,还会记录当前Block写到了哪里了等信息,初始当然是null的,然后就是写文件时进行的神仙操作。
2 client 写入文件:OutSteam.write(),写文件的流程是,client传输文件到DN1,DN1给DN2,DN2给DN3这样。每个Block会分成好多个packet进行传输,每个packet被逐个的写入chunk,满了就推进队列等待发(顺便还会等一个对该packet的ack)
1 client不断的创造packet,如果当前packet满了就推进dataQue等后台线程发送
2 后台线程:取出dataQue中的packet,这时候其实已经是buf流了,通过BlockStream中提供的write方法写入到对应的Block中去,如果这个Block被写满了(client本地肯定是能算出来写没写满的),free掉BlockStream,给DN一个结束信号。
刚才提到BlockStream初始必然是空的,被free掉肯定也是空的,当前我们会面对“有data却无块可写”的情况,于是找NN申请一个新的块,得到块的id和stamp与对应的DN,NN会把这些信息记录在iNode下(元数据的存放),然后返回信息,顺便造一个新的BlockStream,利用得到的DN和BlockId等信息。
3 DN本身肯定也会得到新分配的Block信息,但是没看过代码。。
4 建立新的BlockStream:利用socket填上DN1的信息,搞一个OutStream,head放上控制信息以及剩余需要发送的DN_list,发过去请求建立连接,搞一个ReplyStream接收,如果ok,就返回构建成功,然后一个BlockStream就可以向DN发送数据啦。
5 刚才的读流程提到DN会建立在线的XceiveServer来接受socket连接,当判断到请求是写入请求,启动write流程
6 DNi建立到DNi+1的nextInStream接受AC信息,nextOutStream进行数据传输和控制信息传输,ReplyStream用于进行第4步的控制信息确认,InStream来接受client的数据和控制信息。
7 不断的读取InStream中的packet直到接受到结束信号,对于每一个来的packet包,将data区数据写入本地,然后发给nextDN,(按说这条纽带上任何一个DN挂都会使得这个包被重传,但是并没有看相关的处理,应该是通过ack get到信息,这里应该会存在一个对指定位置写入数据的方法。)
8 没有学习的部分:挂掉packet的重传,将file分成一个个chunk的细节。
HDFS读写流程learning的更多相关文章
- 大数据系列文章-Hadoop的HDFS读写流程(二)
在介绍HDFS读写流程时,先介绍下Block副本放置策略. Block副本放置策略 第一个副本:放置在上传文件的DataNode:如果是集群外提交,则随机挑选一台磁盘不太满,CPU不太忙的节点. 第二 ...
- 【转】HDFS读写流程
概述开始之前先看看其基本属性,HDFS(Hadoop Distributed File System)是GFS的开源实现. 特点如下: 能够运行在廉价机器上,硬件出错常态,需要具备高容错性流式数据访问 ...
- HDFS读写流程(转载)
概述开始之前先看看其基本属性,HDFS(Hadoop Distributed File System)是GFS的开源实现.特点如下: 能够运行在廉价机器上,硬件出错常态,需要具备高容错性 ...
- 超详细的HDFS读写流程详解(最容易理解的方式)
HDFS采用的是master/slaves这种主从的结构模型管理数据,这种结构模型主要由四个部分组成,分别是Client(客户端).Namenode(名称节点).Datanode(数据节点)和Seco ...
- Hadoop之HDFS读写流程
hadoophdfs 1. HDFS写流程 2. HDFS写流程 1. HDFS写流程 HDFS写流程 副本存放策略: 上传的数据块后,触发一个新的线程,进行存放. 第一个副本:与client最近的机 ...
- HDFS 读写流程-译
HDFS 文件读取流程 Client 端调用 DistributedFileSystem 对象的 open() 方法. 由 DistributedFileSystem 通过 RPC 向 NameNod ...
- HDFS 读写流程-英
HDFS 文件读取流程 The client opens the file it wishes to read by calling open() on the FileSystem object, ...
- HDFS读写流程(重点)
@ 目录 一.写数据流程 举例: 二.异常写流程 读数据流程 一.写数据流程 ①服务端启动HDFS中的NN和DN进程 ②客户端创建一个分布式文件系统客户端,由客户端向NN发送请求,请求上传文件 ③NN ...
- HDFS读写流程
01.并行读取 02.逐个节点写入
随机推荐
- 转载:futex同步机制详解
在编译2.6内核的时候,你会在编译选项中看到[*] Enable futex support这一项,上网查,有的资料会告诉你"不选这个内核不一定能正确的运行使用glibc的程序", ...
- linux系统centOS在虚拟机下的自定义安装
一 前戏 1.1在官网找到合适的版本,镜像文件 1.2安装VMware FF590-2DX83-M81LZ-XDM7E-MKUT4 CG54H-D8D0H-H8DHY-C6X7X-N2KG6 ZC3 ...
- yum install mysql on centos 6.5 zz
http://www.cnblogs.com/xiaoluo501395377/archive/2013/04/07/3003278.html 1.使用yum命令进行mysql的安装 yum list ...
- vue 动画过渡
一.过渡(动画) 1. 简介 Vue 在插入.更新或者移除 DOM 时,提供多种不同方式的应用过渡效果,本质上还是使用CSS3动画:transition.animation 2. 基本用法 1.使用t ...
- 关于safenetde 的明文 密文 数据 。这个数组使用 safenet的助手 产生的。
关于safenetde 的明文 密文 数据 .这个数组使用 safenet的助手 产生的. 下图是生成的数组 例如: { 0x9B, 0xFD, 0xF5, 0xA6, 0xF5, 0x57, 0 ...
- 64位win2003/win2008系统IIS6.0/7.5配置PHP的方法
64位win2003/win2008系统IIS6.0/7.5配置PHP的方法 32位的win2003系统配置PHP,估计很多人都已经驾轻就熟了,不过当遇到64位的系统时,估计又会遇上新的问题了.本文记 ...
- css选择器中间的空格
div p div标签下 的p标签 (后代) div .a div 的后代类属性有a的 div.a 类属性有a的div标签 div.a1.a2 多类选择器 类包含a1,a2的div标签 div.a1 ...
- PHP的pm、pm.max_requests、memory_limit
1.php-fpm.conf中的pm pm是来控制php-fpm的工作进程数到底是一次性产生固定不变(static)还是在运行过程中随着需要动态变化(dynamic).众所周知,工作 进程数与服务器性 ...
- Laravel 文档中的 Service Providers
$this->app->singleton('ReportServices', function () { return new \App\Services\ReportServices( ...
- Leetcode 236
思路:1.如果p或q就是根节点,那么LCA=p或q,返回根节点(递归出口) 2.分治 2.1 Divide:分别计算左字树和右子树的LCA 2.2 Conquer:如果左字树和右子树的计算结果均不为空 ...