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写操作(简单源码解读)的更多相关文章

  1. 源码解读·RT-Thread操作系统从开机到关机

    本篇内容比较简单,但却很繁琐,篇幅也很长,毕竟是囊括了整个操作系统的生命周期.这篇文章的目的是作为后续设计多任务开发的铺垫,后续会单独再抽出一篇分析任务的相关知识.另外本篇文章以单核MCU为背景,并且 ...

  2. Alamofire源码解读系列(七)之网络监控(NetworkReachabilityManager)

    Alamofire源码解读系列(七)之网络监控(NetworkReachabilityManager) 本篇主要讲解iOS开发中的网络监控 前言 在开发中,有时候我们需要获取这些信息: 手机是否联网 ...

  3. Spark jdbc postgresql数据库连接和写入操作源码解读

    概述:Spark postgresql jdbc 数据库连接和写入操作源码解读,详细记录了SparkSQL对数据库的操作,通过java程序,在本地开发和运行.整体为,Spark建立数据库连接,读取数据 ...

  4. MFC源码解读(一)最原始一个MFC程序,手写不用向导

    从这一篇开始,详细记录一下MFC的源码解读 四个文件,分别为: stdafx.h,stdafx.cpp,hello.h,hello.cpp 代码如下: //stdafx.h #include < ...

  5. SDWebImage源码解读之SDWebImageDownloaderOperation

    第七篇 前言 本篇文章主要讲解下载操作的相关知识,SDWebImageDownloaderOperation的主要任务是把一张图片从服务器下载到内存中.下载数据并不难,如何对下载这一系列的任务进行设计 ...

  6. AFNetworking 3.0 源码解读 总结(干货)(下)

    承接上一篇AFNetworking 3.0 源码解读 总结(干货)(上) 21.网络服务类型NSURLRequestNetworkServiceType 示例代码: typedef NS_ENUM(N ...

  7. AFNetworking 3.0 源码解读 总结(干货)(上)

    养成记笔记的习惯,对于一个软件工程师来说,我觉得很重要.记得在知乎上看到过一个问题,说是人类最大的缺点是什么?我个人觉得记忆算是一个缺点.它就像时间一样,会自己消散. 前言 终于写完了 AFNetwo ...

  8. AFNetworking 3.0 源码解读(十)之 UIActivityIndicatorView/UIRefreshControl/UIImageView + AFNetworking

    我们应该看到过很多类似这样的例子:某个控件拥有加载网络图片的能力.但这究竟是怎么做到的呢?看完这篇文章就明白了. 前言 这篇我们会介绍 AFNetworking 中的3个UIKit中的分类.UIAct ...

  9. AFNetworking 3.0 源码解读(八)之 AFImageDownloader

    AFImageDownloader 这个类对写DownloadManager有很大的借鉴意义.在平时的开发中,当我们使用UIImageView加载一个网络上的图片时,其原理就是把图片下载下来,然后再赋 ...

  10. AFNetworking 3.0 源码解读(一)之 AFNetworkReachabilityManager

    做ios开发,AFNetworking 这个网络框架肯定都非常熟悉,也许我们平时只使用了它的部分功能,而且我们对它的实现原理并不是很清楚,就好像总是有一团迷雾在眼前一样. 接下来我们就非常详细的来读一 ...

随机推荐

  1. flume 拦截器

    目的:功能1:判断json文件,如何格式合格则正常传输,否则就不传输 功能2:判断出合格的json文件,并且key值中包含"date"才进行传输 一.创建一个Json的工具类 pa ...

  2. vue + antV G6 实现流程图完整代码 (antv G6 流程图)

    效果如下: 代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...

  3. Docker之基本原理介绍

    Docker 环境搭建请移步:https://i.cnblogs.com/posts/edit;postId=14090026 First:docker能做什么? 传统的环境部署: 1.环境和项目分开 ...

  4. 基于Python接口自动化测试持续集成----在jenkins创建任务->检出git的代码-->生成报告-->发送邮件

    步骤一:先在jenkins创建一个自由风格的任务 步骤二:然后在源码管理选择git检出代码的方式,需要提供代码所在git的路径和登录git的账号和密码 步骤三:返回到任务配置的界面,先在构建后操作增加 ...

  5. CeiT:Incorporating Convolution Designs into Visual Transformers

    CeiT:Incorporating Convolution Designs into Visual Transformers 将CNN提取low-level特征,强化局部特征提取的能力,与Trans ...

  6. Element UI 父组件el-tabel选择某行跳转子组件,在子组件的el-table中选择数组,添加到父组件操作行中

    解决思路: 1.在父组件选择操作某行数据时,将父组件的行号暂存(index). 2.跳转子组件页面,选择某行数据,点击提交将该行数据传递个父组件 3.父组件取到第一步暂存行号(index),将子组件传 ...

  7. js 实现全屏预览(F11功能)--转

    参考文档   http://t.zoukankan.com/ghfjj-p-6322415.html HTML代码 <body> <div id="content" ...

  8. selenium定位元素位置-xpath

    xpath定位元素位置: 1.定位父兄节点: <div> <span>我是span1标签</span> <a id="1" href=&q ...

  9. C语言中的循环

    1我觉得循环就是程序一直重复的执行一些语句,直到当符合条件时停止.循环总体分为while循环,do while循环和for循环. 2while循环和do while循环的区别:while是先判定是否符 ...

  10. 3-1 熟悉Hadoop及其操作

    Hadoop最早起源于Nutch.Nutch的设计目标是构建一个大型的全网搜索引擎,包括网页抓取.索引.查询等功能,但随着抓取网页数量的增加,遇到了严重的可扩展性问题--如何解决数十亿网页的存储和索引 ...