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.逐个节点写入
随机推荐
- 剑指Offer——把数组排成最小的数
题目描述: 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323. 分析: 排 ...
- java7(2)——使用mutilcatch注意事项
从java7推出mutilcatch后,到现在都少有看到人使用,可能是这个功能真正用起来,比起多个catch并不快多少,而且现在的工IDE具太厉害了,什么都有快捷键!说是这么说,我们还是得了解一下如何 ...
- 两台Linux系统之间传输文件
用CRT分别连上两台需要传输文件的linux系统服务器,并检查防火墙是否关闭. 查看防火墙状态: /etc/init.d/iptables status 若防火墙启用,暂时关闭防火墙: /etc/in ...
- python学习笔记(二十七)多线程与多进程
线程是程序里面的最小执行单元. 进程是资源的集合. 线程是包含在一个进程里面,一个进程可以有多个线程,一个进程里面默认有一个主线程.由主线程去启动子线程. 1.多线程 import threading ...
- R语言 dbWriteTable 写入数据库 为空和乱码问题
在windows环境下 用RMySQL 写入数据库中文数据为空 或者乱码问题. 找了下资料 一般情况是 用 insert 语句插入,结合现有业务有点麻烦,放弃了. 还有一种方式换平台,由于经常在win ...
- SpringBoot简介及第一个应用
一.Spring时代变换 1. Spring1.x 时代 Spring初代都是通过xml文件配置bean,随着项目的不断扩大,繁琐的xml配置,混乱的依赖关系,难用的bean装配方式,由此衍生了spr ...
- 存储器系列,L1缓存,L2缓存,内存(RAM),EEPROM和闪存,CMOS与BIOS电池
因为各级存储硬件的参数和性能不同所以在计算机硬件当中分为以下几种: 由此可见顶级空间小但处理速度最快,下层容量大但处理速度时间较长. 存储器系统采用分层结构,顶层的存储器速度较高,容量较小,与底层的存 ...
- JVM内存分配原理
堆栈常量池等内存分配原理详解 存储的方式: 寄存器 栈(stack) 堆(heap) 静态域 常量池 非RAM存储 JAVA寄存器 最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制. ...
- ubuntu 可能的依赖包,安装过程中根据需要安装
/*************依赖包安装****************/下面是可能的依赖包,安装过程中根据需要安装 build-essential - libglib2.-dev libpng3 li ...
- visual studio开发工具的C#主流控件属性一览表
visual studio开发工具的C#主流控件属性一览表 详细的介绍了各控制属性的详细中文介绍 C#控件及常用设计整理 1.窗体 1.常用属性 (1)Name属性:用来获取或设置窗体的名称,在应用程 ...