有许多对流程进行描述的博客,但是感觉还是应当学习一遍代码,不然总感觉怪怪的,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的更多相关文章

  1. 大数据系列文章-Hadoop的HDFS读写流程(二)

    在介绍HDFS读写流程时,先介绍下Block副本放置策略. Block副本放置策略 第一个副本:放置在上传文件的DataNode:如果是集群外提交,则随机挑选一台磁盘不太满,CPU不太忙的节点. 第二 ...

  2. 【转】HDFS读写流程

    概述开始之前先看看其基本属性,HDFS(Hadoop Distributed File System)是GFS的开源实现. 特点如下: 能够运行在廉价机器上,硬件出错常态,需要具备高容错性流式数据访问 ...

  3. HDFS读写流程(转载)

    概述开始之前先看看其基本属性,HDFS(Hadoop Distributed File System)是GFS的开源实现.特点如下:    能够运行在廉价机器上,硬件出错常态,需要具备高容错性    ...

  4. 超详细的HDFS读写流程详解(最容易理解的方式)

    HDFS采用的是master/slaves这种主从的结构模型管理数据,这种结构模型主要由四个部分组成,分别是Client(客户端).Namenode(名称节点).Datanode(数据节点)和Seco ...

  5. Hadoop之HDFS读写流程

    hadoophdfs 1. HDFS写流程 2. HDFS写流程 1. HDFS写流程 HDFS写流程 副本存放策略: 上传的数据块后,触发一个新的线程,进行存放. 第一个副本:与client最近的机 ...

  6. HDFS 读写流程-译

    HDFS 文件读取流程 Client 端调用 DistributedFileSystem 对象的 open() 方法. 由 DistributedFileSystem 通过 RPC 向 NameNod ...

  7. HDFS 读写流程-英

    HDFS 文件读取流程 The client opens the file it wishes to read by calling open() on the FileSystem object, ...

  8. HDFS读写流程(重点)

    @ 目录 一.写数据流程 举例: 二.异常写流程 读数据流程 一.写数据流程 ①服务端启动HDFS中的NN和DN进程 ②客户端创建一个分布式文件系统客户端,由客户端向NN发送请求,请求上传文件 ③NN ...

  9. HDFS读写流程

    01.并行读取 02.逐个节点写入

随机推荐

  1. d3.js:数据可视化利器之 修改文档:DOM操作符

    style: CSS样式操作符 style()操作符用来设置或获取选择集中各DOM元素的CSS样式: selection.style(name[,value[,priority]]) style()操 ...

  2. (2.4)备份与还原--WAL与备份原理

    预写式日志(Write-Ahead Logging (WAL))  部分转自:http://www.cnblogs.com/wenBlog/p/4423497.html SQL Server中使用了W ...

  3. rabbitMQ基本概念

    一.网页登录方法 http://127.0.0.1:15672/ 用户名和密码默认为guest/guest 用java代码去连接rabbitmq用的端口是5672 二.rabbitMQ基本概念 Rab ...

  4. npm命令,查看当前npm版本,更新nmp到最新版本,安装sails

    打开Node.js command prompt 1 查看npm当前版本 npm -v 2 更新npm至最新版本 npm install npm@latest -g 3 安装sails  npm in ...

  5. SIP中的 session, dialog 及 transaction 的解释

    http://stackoverflow.com/questions/35133331/difference-between-session-dialog-and-transaction-in-sip ...

  6. matplotlib中的legend()—显示图例

    源自  matplotlib中的legend()——用于显示图例 -- 博客园 http://www.cnblogs.com/yinheyi/p/6792120.html legend()的一个用法: ...

  7. 推荐系统第3周--- 大数据环境下的itemCF实现

    代码报错注意事项: 1:最后Ctrl+shift+O  导入包2:导入mahout包3:新建datafile文件包,在其下面新建csv文件

  8. SCADA必备函数 实际测试。

    一:GetTickCount() 综述: 这是一个Window的平台的API函数, 所以啊 在 MFC中 他的前面有两个冒号,像个和尚一样. 所以它不会受限于类,可以在MFC中任意位置使用. 这个函数 ...

  9. boost circular buffer环形缓冲类

    Boost.Circular_buffer维护了一块连续内存块作为缓存区,当缓存区内的数据存满时,继续存入数据就覆盖掉旧的数据. 它是一个与STL兼容的容器,类似于 std::list或std::de ...

  10. 漫谈DOM 事件流的三个阶段

    一丶 流 什么是流? 比如 react 中的单项数据流,Node.js 中的流,或者本文中的 DOM 事件流,都是流的具体体现.专业地讲,流是程序输入或输出的一个连续的字节序列:通俗地讲,流是有方向的 ...