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. ZSTUOJ刷题⑧:Problem G.--铺地砖

    Problem G: 铺地砖 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 6461  Solved: 2592 Description 元旦过去了,新年 ...

  2. JLink OB SWI 取代串口打印的方式

    1:debug的串口被占用 2:从Keil 迁移到的LINUX下开发. 3:手上只有JLinkOB,(4线:CLK,SWIO,GND,RST) 4:设备只引出了4线(SWO 没接出) 环境: JLin ...

  3. Jenkins项目中的Performance Trend图表不显示

    权限问题:chmod 777 /.../*.jtl 其中上述目录为jmeter生成jtl格式的结果报告的路径,也就是ant对应build.xml里配置好的路径.

  4. vue实现按钮多选

    需求是这样: 首先考虑使用elementui中的组建实现,但是有时候会忽略组建.实现方式两种: 1.直接使用element实现 let weekTimeData: [ '星期一', '星期二', '星 ...

  5. 20200925--矩阵加法(奥赛一本通P93 6 多维数组)

    输入两个n行m列的矩阵A和B,输出它们的和A+B 输入: 第1行包含两个整数n和m(1<=n<=100,1<=m<=100),表示矩阵的行数和列数. 接下来n行,每行m个整数, ...

  6. python读取与处理netcdf数据

    netcdf是气候数据中的主流格式,当涉及到大范围的全球数万个格网点数据时,使用python脚本可以较快地读取与处理. import netCDF4 from netCDF4 import Datas ...

  7. Mac设置自动连接蓝牙设备

    1.安装blueutil管理软件 通过 brew install blueutil 2.通过命令: blueutil --paired 查看当前连接过的蓝牙设备的地址. 3.获取blueutil软件的 ...

  8. InnoDB和MyISAM的区别(超详细)

    1.事务 InnoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在begin和commit之间,组成一个事务: ...

  9. XML_DOM4J_20200415

    package com.wy.xml; import java.io.File;import java.util.Iterator; import org.dom4j.Attribute; impor ...

  10. django_ORM基础字段和选项

    一.修改ORM 1.任何关于表结构的修改,务必在对应模型类上修改. 2.在上一篇博文中,创建了bookstore_book表,如果需要再添加一个名为info(varchar 100)的字段,则需要如下 ...