HDFS写操作(简单源码解读)
HDFS最重要的就是写流程了,学校老师教的时候也是重点介绍这个过程(虽然我并没有在任何面试中被问到过)。下面从画图和文字两个过程介绍写流程,这次读了源代码之后对整个过程更加清晰了。
一、图解

二、文字解说
HDFS客户端会先给NameNode发送请求上传文件a,代码层面上就是使用create方法,参数就是上传的文件路径,这个请求最本质的就是调用DFSOutputStream方法里的newStreamForCreate方法,这个方法总得就是返回一个DFSOutputStream对象,抽象层面上就是NameNode对请求进行了一个应答,源码层面上,newStreamForCreate干了两件事,第一件事就是通过RPC调用nameNode服务器上创建文件的操作,这个会返回一个status状态值,如果不合法则创建失败,那么DFSOutputStream对象也创建失败了,比如检查路径是否已经存在,如果存在是否可以覆盖,副本策略是否生效等,第二件事就是创建DFSOutputStream对象,这个创建过程会启动DFSOutputStream内部的一个DataStreamer线程,这个线程的run方法就是处理Data Queue队列信息以及向nameNode申请Block存储的节点信息以及创建对应的数据通信管道,总得如果没什么问题,我们自己写的create代码会返回一个由DFSOutputStream对象封装成的FSDataOutputStream对象,我们操作这个FSDataOutputStream对象进行write操作,回到顶层抽象层面,收到可以上传文件a的应答后,我们就向NameNode发送写数据请求,这个请求会唤醒之前说的DataStreamer线程,因为没写之前Data Queue数据队列是空的,进行wait操作(这里采用了生产者消费者模式),DataStreamer线程唤醒后执行run方法里,run方法有部分代码写的就是获取datanode,这里面也会通过RPC调用NameNodeRpcServer获取Block存储的节点信息,这里使用了就是机架感应策略,然后返回dn0,dn1,dn2,有了数据节点信息之后,DataStreamer还要干另一件事,与dn0建立输出流,具体的就是通过Sender类里的send方法通过socke发送Data queue中的packet,当然datanode中也会启动一个线程DataXceiverServer线程来工作,具体的就是BlockReceiver这个东西来写入磁盘,同时也会调用Sender里的send方法给下一个datanode交互,每次写入成功都会都会向前一个节点发出Responser应答,DataStreamer会处理这个应答,如果有这个应答,会将数据从ACK queue中移除,至此第一个block就结束了,之后的就是其他block的了,也是同理的。
上一段没有讲讲我们调用的write方法,进入源码里,首先是写chunk,然后将chunk包装为packet,在写入datastreamer里的data queue里。
三、源码追踪

HDFS写流程主要是这两个方法
建议点进去看看,具体的流程图等我有时间再补补。重要的代码太多了也不方便截图,感兴趣的同学可以看看《Hadoop2.x HDFS源码剖析》
这个源码写的还是很牛的,需要掌握基础的多线程知识以及RPC知识,同时也要明白生产者消费者模式。
HDFS写操作(简单源码解读)的更多相关文章
- 源码解读·RT-Thread操作系统从开机到关机
本篇内容比较简单,但却很繁琐,篇幅也很长,毕竟是囊括了整个操作系统的生命周期.这篇文章的目的是作为后续设计多任务开发的铺垫,后续会单独再抽出一篇分析任务的相关知识.另外本篇文章以单核MCU为背景,并且 ...
- Alamofire源码解读系列(七)之网络监控(NetworkReachabilityManager)
Alamofire源码解读系列(七)之网络监控(NetworkReachabilityManager) 本篇主要讲解iOS开发中的网络监控 前言 在开发中,有时候我们需要获取这些信息: 手机是否联网 ...
- Spark jdbc postgresql数据库连接和写入操作源码解读
概述:Spark postgresql jdbc 数据库连接和写入操作源码解读,详细记录了SparkSQL对数据库的操作,通过java程序,在本地开发和运行.整体为,Spark建立数据库连接,读取数据 ...
- MFC源码解读(一)最原始一个MFC程序,手写不用向导
从这一篇开始,详细记录一下MFC的源码解读 四个文件,分别为: stdafx.h,stdafx.cpp,hello.h,hello.cpp 代码如下: //stdafx.h #include < ...
- SDWebImage源码解读之SDWebImageDownloaderOperation
第七篇 前言 本篇文章主要讲解下载操作的相关知识,SDWebImageDownloaderOperation的主要任务是把一张图片从服务器下载到内存中.下载数据并不难,如何对下载这一系列的任务进行设计 ...
- AFNetworking 3.0 源码解读 总结(干货)(下)
承接上一篇AFNetworking 3.0 源码解读 总结(干货)(上) 21.网络服务类型NSURLRequestNetworkServiceType 示例代码: typedef NS_ENUM(N ...
- AFNetworking 3.0 源码解读 总结(干货)(上)
养成记笔记的习惯,对于一个软件工程师来说,我觉得很重要.记得在知乎上看到过一个问题,说是人类最大的缺点是什么?我个人觉得记忆算是一个缺点.它就像时间一样,会自己消散. 前言 终于写完了 AFNetwo ...
- AFNetworking 3.0 源码解读(十)之 UIActivityIndicatorView/UIRefreshControl/UIImageView + AFNetworking
我们应该看到过很多类似这样的例子:某个控件拥有加载网络图片的能力.但这究竟是怎么做到的呢?看完这篇文章就明白了. 前言 这篇我们会介绍 AFNetworking 中的3个UIKit中的分类.UIAct ...
- AFNetworking 3.0 源码解读(八)之 AFImageDownloader
AFImageDownloader 这个类对写DownloadManager有很大的借鉴意义.在平时的开发中,当我们使用UIImageView加载一个网络上的图片时,其原理就是把图片下载下来,然后再赋 ...
- AFNetworking 3.0 源码解读(一)之 AFNetworkReachabilityManager
做ios开发,AFNetworking 这个网络框架肯定都非常熟悉,也许我们平时只使用了它的部分功能,而且我们对它的实现原理并不是很清楚,就好像总是有一团迷雾在眼前一样. 接下来我们就非常详细的来读一 ...
随机推荐
- servlet 500,405错误
servlet500错误 状况: 1.能打开项目,但是打开web.xml中指定的servlet url错误报错500,再次刷新出现404 出现提示: 实例化Servlet类[xxx]异常 java.l ...
- Jetpack compose学习笔记之自定义layout(布局)
一,简介 Compose中的自定义Layout主要通过LayoutModifier和Layout方法来实现. 不管是LayoutModifier还是Layout,都只能measure一次它的孩子Vie ...
- C++/Lua栈操作
一.Lua栈结构 1. index为正数 c++获取lua的数组元素的实例: // 接口参数:void lua_rawgeti (lua_State *L, int index, int n); lu ...
- 记一次因为关键字OUT 导致的后台"sql injection violation" 报错的问题
在navicat和mssm中执行用字段别名'out'均没有问题,但是在mybatis里使用就会报 "sql injection violation, syntax error: ERROR. ...
- centos7 redis 无法用 systemctl 启动
今天刚安装了redis,修改了 /etc/redis.conf 的内容. 尝试在 bind 后添加一个地址 "bind 127.0.0.1 -::* 192.168.2.1", 后 ...
- SpringBoot 快速开启事务(附常见坑点)
序言:此前,我们主要通过XML配置Spring来托管事务.在SpringBoot则非常简单,只需在业务层添加事务注解(@Transactional )即可快速开启事务.虽然事务很简单,但对于数据方面是 ...
- github pic test
- 前端访问Tornado跨域问题
- iphone 熄屏黑屏录像方法-取证拍摄-自带功能
iphone 有个旁白模式是为了残疾盲人的只听模式. 1.在 设置 - 辅助功能 - 辅助功能快捷键 - 选旁白 ,这样按三下电源键进入/退出旁白模式. 2.把声音调没,这样旁白就不会发出朗读. 3. ...
- Qt Windows上实现毛玻璃效果
首发于我的个人博客:xie-kang.com 博客内有更多文章,欢迎大家访问 原文地址 前言: 很多人看到这个需求的第一想法都是录制软件窗口后的桌面内容,并且加上个高斯模糊就能实现了. 思路没有错,操 ...