有许多对流程进行描述的博客,但是感觉还是应当学习一遍代码,不然总感觉怪怪的,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. linux下非root用户的sudo问题

    linux下的root用户是个超级管理员,一般是不用这个用户登录进行操作的,但有时候需要root权限,又不想切换用户的话可以使用sudo命令.但是不是所有的用户都可以使用sudo命令的. 首先可能会遇 ...

  2. 剑指Offer——复杂链表的复制

    题目描述: 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.(注意,输出结果中请不要返回参数中的节点引用, ...

  3. centos7修改hostname和hosts

    1.修改/etc/hostname vi /etc/hostname 打开之后的内容是: localhost.localdomain 把它修改成想要的名字就可以,比如:master 保存退出 2.修改 ...

  4. 介绍importlib

    Python将importlib作为标准库提供.它旨在提供Pythonimport语法和(__import__()函数)的实现.另外,importlib提供了开发者可以创建自己的对象(即importe ...

  5. Python 连接 Oracle数据库

    1.环境设置 [root@oracle ~]# cat /etc/redhat-release CentOS release 6.9 (Final) [root@oracle ~]# python - ...

  6. 001-linux scp文件拷贝

    scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的.可能会稍微影响一下速度.当你服务器 ...

  7. 如何停止requestAnimationFrame方法启动的动画

    HTML5/CSS3时代,我们要在web里做动画选择其实已经很多了:(1) 你可以用CSS3的animattion+keyframes;(2) 你也可以用css3的transition; (3) 你还 ...

  8. SSH secure shell 原理与运用

    转: http://www.ruanyifeng.com/blog/2011/12/ssh_remote_login.html 作者: 阮一峰 日期: 2011年12月21日 SSH是每一台Linux ...

  9. Yii 2.x 和1.x区别以及yii2.0安装

    知乎上有个类似的问题:http://www.zhihu.com/question/22924271/answer/23085751 大致思路不会变,开发流程变化也不是很大.有变化的是1.yii2带入的 ...

  10. android 写入联系人

    public void testInsert() { ContentValues values = new ContentValues(); /* * 首先向RawContacts.CONTENT_U ...