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. Java的访问控制修饰符有哪些?各有什么访问权限?请对照第7页ppt的表格分别写程序验证。

    Java的访问控制修饰符有哪些? JAVA主要有两类修饰符: 访问控制修饰符 : default, public , protected, private 非访问控制修饰符 : final, abst ...

  2. 简体Windows系统登录玩新枫之谷方法

    2022-2-23  游戏更新后Locale.Emulato失效,64位游戏使用新的工具Locale_Remulator,请自行到GitHub上搜索下载,使用方法与Locale.Emulato类似. ...

  3. react实现转盘动画

    转盘动画方法如下: /** * 点击转动转盘 */ const turnCircle = () => { let runDeg = +(Math.random() * 360).toFixed( ...

  4. python之变量

    什么是变量? 用来记录事务的变化状态,计算机模拟人,就需要具备人类某一个功能.你通过记录我的名字年龄等一系列的身份信息,以此和我进行匹配,确定我就是phoebe这个人. 为什么有变量? 游戏里的英雄角 ...

  5. c#下载蓝奏云链接文件

    控制台版本,winform更简单 static string desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.Des ...

  6. HTML第四章作业

    学生实践4.1.3 1 <!doctype html> 2 <html> 3 <head> 4 <meta charset="utf-8" ...

  7. weblogic修改jdk版本方法

    首先,得知道JDk 的安装目录: /usr/local/ 第一种方法:weblogic控制台直接指定JDK 版本: 第二种方法:修改weblogic中默认的JDK版本: weblogic/Oracle ...

  8. 北京金橙子ezcad2和lmc1控制卡二次开发的动态连接库手册

    我要吐槽一下金橙子打电话过去一问三不答.要个手册2.0的不给,只给3.0的.而且态度角度***钻,想尽一切办法让你自己用不了.我又不是要做打标卡,只是做个二次开发.有必要这样吗?反正我是不会推荐用户再 ...

  9. Python机器学习/LogisticRegression(逻辑回归模型)(附源码)

    LogisticRegression(逻辑回归) 逻辑回归虽然名称上带回归,但实际上它属于监督学习中的分类算法. 1.算法基础 LogisticRegression基本架构源自于Adline算法,只是 ...

  10. 树莓派 IIC功能安装及测试

    参考连接: https://blog.csdn.net/panwen1111/article/details/81044428 https://blog.csdn.net/xukai871105/ar ...