有许多对流程进行描述的博客,但是感觉还是应当学习一遍代码,不然总感觉怪怪的,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. 拖拽js和jq写法

    第一种原生js写法 window.onload=function () { var oDrag=document.getElementById('drag'); oDrag.onmousedown=f ...

  2. MyEclipse 10的使用技巧

    默认快捷键 :Shift+Alt+s 然后选择generater getter and setter,这是快捷键.或者右键source里边有 generater getter and setter. ...

  3. Python学习笔记(一)数据类型

    一.整型和浮点型 Python可以处理任意大小的整数,当然包括负整数,在程序中的表示方法和数学上的写法一模一样 age=10 num=-35 score=98.8 二.布尔类型 布尔值和布尔代数的表示 ...

  4. NGS中的一些软件功能介绍

    1.bowtie 短序列比对工具,blast也是短序列比对工具,速度快,结果易理解. 输入可以是fastq或者fasta文件. 生成比对结果文件sam格式的吧. 2.bwa 转自:https://ww ...

  5. sql server 复制表从一个数据库到另一个数据库

    sql server 复制表从一个数据库到另一个数据库 /*不同服务器数据库之间的数据操作*/ --创建链接服务器 exec sp_addlinkedserver 'ITSV ', ' ', 'SQL ...

  6. Spring-2-A Magic Grid(SPOJ AMR11A)解题报告及测试数据

    Magic Grid Time Limit:336MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Description Tha ...

  7. php 安装Memcache扩展

    转载地址:http://www.tuicool.com/articles/EB3imm 文章概述:由于当前机器安装的php,是用yum安装,现在需要使用到memadmin做一些监控, memadmin ...

  8. CSS 图片

    CSS 图片 一.圆角图片 img { border-radius: 8px; } 二.缩略图 border 属性来创建缩略图. img { border: 1px solid #ddd; borde ...

  9. The mind

    Youtube励志红人Mateusz M,最近刚推出了网友期待已久最新励志短片<The mind>,短短一周播放量已近50万.来自波兰的他,年仅23岁,用自己擅长的蒙太奇,已创作十几个影响 ...

  10. 从页面到服务器,node实现文件下载

    起因: 新来了一个需求,让用户下载一个200m的zip文件,并且校验用户信息,难点:下载的文件是200M的. 现在维护的系统,以前的文件下载,走的是node的静态文件,用的express框架上自带的静 ...