从零开始学Hadoop----浅析HDFS(二)

上一篇,我们简单介绍了一下Hadoop的核心之一HDFS,对其中的一些概念有了一定的了解。今天我们来看看HDFS的一些原理解析。

二、原理解析

1、架构

HDFS是一个主/从(Mater/Slave)体系结构,从最终用户的角度来看,它就像传统的文件系统一样,可以通过目录路径对文件执行CRUD(Create、Read、Update和Delete)操作。但由于分布式存储的性质,HDFS集群拥有一个NameNode和一些DataNode。

NameNode管理文件系统的元数据,DataNode存储实际的数据。客户端通过同NameNode和DataNodes的交互访问文件系统。客户端联系NameNode以获取文件的元数据,而真正的文件I/O操作是直接和DataNode进行交互的。

2、管理员更新日志

- CheckPoint的时间点

fs.checkpoint.period 指定两次checkpoint的最大时间间隔,默认3600秒。 
fs.checkpoint.size    规定edits文件的最大值,一旦超过这个值则强制checkpoint,不管是否到达最大时间间隔。默认大小是64M。
  • 流程解析
1、每隔两个小时,或者edits文件超过最大值时,SecondaryNameNode通知NameNode切换edits,
此时在NameNode中生成一个名为edits.new的新edits,在fsimage被替换之前,所有的操作都会写到edits.new中。
2、SecondaryNameNode通过Http协议复制edits和fsimage到SecondaryNameNode中
3、SecondaryNameNode将fsimage导入内存,用edits中的操作,生成新的fsimage.ckpt文件
4、SecondaryNameNode将新的fsimage复制,并通过http Post传给NameNode
5、NameNode将接收到的新的fsimage.ckpt替换掉之前的fsimage,同时将新的edits.new重命名为edits,将之前的替换掉

3、读文件

初始化FileSystem,然后客户端(client)用FileSystem的open()函数打开文件
FileSystem用RPC调用元数据节点,得到文件的数据块信息,对于每一个数据块,元数据节点返回保存数据块的数据节点的地址。
FileSystem返回FSDataInputStream给客户端,用来读取数据,客户端调用stream的read()函数开始读取数据。
DFSInputStream连接保存此文件第一个数据块的最近的数据节点,data从数据节点读到客户端(client)
当此数据块读取完毕时,DFSInputStream关闭和此数据节点的连接,然后连接此文件下一个数据块的最近的数据节点。
当客户端读取完毕数据的时候,调用FSDataInputStream的close函数。
在读取数据的过程中,如果客户端在与数据节点通信出现错误,则尝试连接包含此数据块的下一个数据节点。
失败的数据节点将被记录,以后不再连接。

4、写文件

初始化FileSystem,客户端调用create()来创建文件
FileSystem用RPC调用元数据节点,在文件系统的命名空间中创建一个新的文件,元数据节点首先确定文件原来不存在,
并且客户端有创建文件的权限,然后创建新文件。
FileSystem返回DFSOutputStream,客户端用于写数据,客户端开始写入数据。
DFSOutputStream将数据分成块,写入data queue。data queue由Data Streamer读取,
并通知元数据节点分配数据节点,用来存储数据块(每块默认复制3块)。
分配的数据节点放在一个pipeline里。Data Streamer将数据块写入pipeline中的第一个数据节点。
第一个数据节点将数据块发送给第二个数据节点。第二个数据节点将数据发送给第三个数据节点。
DFSOutputStream为发出去的数据块保存了ack queue,等待pipeline中的数据节点告知数据已经写入成功。
当客户端结束写入数据,则调用stream的close函数。
此操作将所有的数据块写入pipeline中的数据节点,并等待ack queue返回成功。
最后通知元数据节点写入完毕。
如果数据节点在写入的过程中失败,关闭pipeline,将ack queue中的数据块放入data queue的开始,
当前的数据块在已经写入的数据节点中被元数据节点赋予新的标示,则错误节点重启后能够察觉其数据块是过时的,会被删除。
失败的数据节点从pipeline中移除,另外的数据块则写入pipeline中的另外两个数据节点。
元数据节点则被通知此数据块是复制块数不足,将来会再创建第三份备份。

总结:

今天我们接着上次介绍了一下HDFS的概念之后,我们对HDFS的架构,内部构造以及运行原理做了一些解析,下次我们将在实战中熟练使用HDFS做一些例子。

时间: 2024-11-10 13:03:52

从零开始学Hadoop----浅析HDFS(二)的相关文章

从零开始学ios开发(二):Hello World!

今天看了书的第二章,主要介绍了一下Xcode的使用方法和一些必要的说明,最后做了一个“Hello World!”的小程序,其实就是在屏幕上用一个Label显示“Hello World!”,一行代码都没有写,拖拖控件,改变一下Label字体大小颜色什么的,还是比较简单的,下面把这个过程写一下,至于xcode的使用说明就不在这里具体叙述了,反正到时候用到哪就介绍到哪里吧. 1)启动Xcode 选择“Create a new Xcode project”,创建一个新的项目. 2)模板选择,选择“Sin

从零开始学Go之基本(二):包、函数声明与格式化输出

包: 每个go程序在开头都要有一个package来声明当前包 其中包含main函数的包必须为main包来声明入口 从零开始学Go之基本(二):包.函数声明与格式化输出 导入包: import 包名称 //import "fmt" 单个导入 import ( "fmt" "math" ) 引用其他包时必须通过import来获取,根据包中的变量或者函数的开头大小写来判断能否导出:大写才能导出,否则不能被外部包引用 函数声明: func 函数名 (函数

从零开始学Hadoop----浅析HDFS(一)

之前,我们简单介绍了一下Hadoop,知道他是一个处理大数据的框架.今天我们来看看Hadoop的核心构成之一--HDFS. 一.基础概念 1.是什么 HDFS是Hadoop Distribute File System 的简称,也就是Hadoop的一个分布式文件系统. 分布式文件系统(Distributed File System)是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连.分布式文件系统的设计基于客户机/服务器模式.一个典型的网络可能包括多个供多用户

从零开始学Hadoop----浅析HDFS(三)

之前,我们简单介绍了一下Hadoop的核心之一HDFS,对其中的一些概念和他的原理做了一些解析.今天我们来看看HDFS的操作实例. 三.小试牛刀 1.shell命令 2.fs实例 在做之前,我们需要做一些准备环境,例如在Linux上安装hadoop,创建工程,导入需要的jar文件等等,网上分享的步骤很全,这里不在赘述,直接看它实际应用中的代码. public class HDFSDemo { FileSystem fs=null; @Before public void init() throw

从零开始学安全(四十二)●利用Wireshark分析ARP协议数据包

wireshark:是一个网络封包分析软件.网络封包分析软件的功能是撷取网络封包,并尽可能显示出最为详细的网络封包资料.Wireshark使用WinPCAP作为接口,直接与网卡进行数据报文交换,是目前全世界最广泛的网络封包分析软件 什么是ARP协议    协议分析篇第一个要研究的就是ARP协议.ARP(Address Resolution Protocol,地址解析协议)用于将IP地址解析为物理地址(MAC地址).这里之所以需要使用MAC地址,是因为网络中用于连接各个设备的交换机使用了内容可寻址

从零开始学Go之容器(二):切片

切片(slice)是对数组一个连续片段的引用(该数组我们称之为相关数组,通常是匿名的),所以切片是一个引用类型. 切片的内部结构包含开始位置地址(&).大小(len)和容量(cap). 切片并不存储任何数据,它只是描述了底层数组中的一段. 更改切片的元素会修改其底层数组中对应的元素. 声明: var 数组名 []类型 var a []int 切片的声明跟数组很相似,但是长度是不定长的,所以不需要说明长度. 切片的初始化与使用: var 数组名 []类型{初始化值列表} var a []int{1

从零开始学android<android事件的处理方式.二十四.>

在android中一共有 多种事件,每种事件都有自己相对应的处理机制 如以下几种 1 单击事件 View.OnClickListener public abstract void onClick (View v) 单击组件时触发 2 单击事件 View.OnLongClickListener public abstract boolean onLongClick (View v) 长按组件时触发 3 键盘事件 View.OnKeyListener public abstract boolean

从零开始学android<RatingBar评分组件.二十三.>

如果现在用户要对某个应用程序打分往往会使用图所示的组件,通过选择的"五角星"的个数来决定最终的打分成绩 这样的功能在Android之中,可以使用RatingBar组件实现,使用此组件可以方便用户的输入,而且很直观,RatingBar类的定义结构如下: java.lang.Object ? android.view.View ? android.widget.ProgressBar ? android.widget.AbsSeekBar ? android.widget.RatingBa

【高德地图API】从零开始学高德JS API(二)地图控件与插件——测距、圆形编辑器、鼠标工具、地图类型切换、鹰眼鱼骨

摘要:无论是控件还是插件,都是在一级API接口的基础上,进行二次开发,封装的一系列更加便于开发者使用,减少开发者工作量的二级API接口.除了官方通用的鱼骨.鹰眼控件,还有大量官方开发的地图插件,类似谷歌的lib.当然本文还会介绍自定义插件的使用. ------------------------------------------------------------------------------------------------- 第一部分 控件 目前官方支持的控件包含:缩放控制条-地图