Hadoop原理之——HDFS原理

article/2025/10/25 3:49:13

 

Hadoop 3个核心组件:

分布式文件系统:Hdfs——实现将文件分布式存储在很多的服务器上(hdfs是一个基于Linux本地文件系统上的文件系统)

分布式运算编程框架:Mapreduce——实现在很多机器上分布式并行运算

分布式资源调度平台:Yarn——帮用户调度大量的mapreduce程序,并合理分配运算资源

 

HDFS的设计特点是:

1、大数据文件,非常适合上T级别的大文件或者一堆大数据文件的存储,如果文件只有几个G甚至更小就没啥意思了。

2、文件分块存储,HDFS会将一个完整的大文件平均分块存储到不同计算器上,它的意义在于读取文件时可以同时从多个主机取不同区块的文件,多主机读取比单主机读取效率要高得多得都。

3、流式数据访问,一次写入多次读写,这种模式跟传统文件不同,它不支持动态改变文件内容,而是要求让文件一次写入就不做变化,要变化也只能在文件末添加内容。

4、廉价硬件,HDFS可以应用在普通PC机上,这种机制能够让给一些公司用几十台廉价的计算机就可以撑起一个大数据集群。

5、硬件故障,HDFS认为所有计算机都可能会出问题,为了防止某个主机失效读取不到该主机的块文件,它将同一个文件块副本分配到其它某几个主机上,如果其中一台主机失效,可以迅速找另一块副本取文件。

 

HDFS的关键元素:

1、Block:将一个文件进行分块,通常是64M。

2、NameNode:保存整个文件系统的目录信息、文件信息及分块信息,这是由唯一 一台主机专门保存,当然这台主机如果出错,NameNode就失效了。在 Hadoop2.* 开始支持 activity-standy 模式----如果主 NameNode 失效,启动备用主机运行 NameNode。

3、DataNode:分布在廉价的计算机上,用于存储Block块文件。

如果你想了解大数据的学习路线,想学习大数据知识以及需要免费的学习资料可以加群:784789432.欢迎你的加入。每天下午三点开直播分享基础知识,晚上20:00都会开直播给大家分享大数据项目实战。

 

一、HDFS运行原理

1、NameNode和DataNode节点初始化完成后,采用RPC进行信息交换,采用的机制是心跳机制,即DataNode节点定时向NameNode反馈状态信息,反馈信息如:是否正常、磁盘空间大小、资源消耗情况等信息,以确保NameNode知道DataNode的情况;

2、NameNode会将子节点的相关元数据信息缓存在内存中,对于文件与Block块的信息会通过fsImage和edits文件方式持久化在磁盘上,以确保NameNode知道文件各个块的相关信息;

3、NameNode负责存储fsImage和edits元数据信息,但fsImage和edits元数据文件需要定期进行合并,这时则由SecondNameNode进程对fsImage和edits文件进行定期合并,合并好的文件再交给NameNode存储。 

二、HDFS数据合并原理

1、NameNode初始化时会产生一个edits文件和一个fsimage文件,edits文件用于记录操作日志,比如文件的删除或添加等操作信息,fsImage用于存储文件与目录对应的信息以及edits合并进来的信息,即相当于fsimage文件在这里是一个总的元数据文件,记录着所有的信息;

2、随着edits文件不断增大,当达到设定的一个阀值的时候,这时SecondaryNameNode会将edits文件和fsImage文件通过采用http的方式进行复制到SecondaryNameNode下(在这里考虑到网络传输,所以一般将NameNode和SecondaryNameNode放在相同的节点上,这样就无需走网络带宽了,以提高运行效率),同时NameNode会产生一个新的edits文件替换掉旧的edits文件,这样以保证数据不会出现冗余;

3、SecondaryNameNode拿到这两个文件后,会在内存中进行合并成一个fsImage.ckpt的文件,合并完成后,再通过http的方式将合并后的文件fsImage.ckpt复制到NameNode下,NameNode文件拿到fsImage.ckpt文件后,会将旧的fsimage文件替换掉,并且改名成fsimage文件。  

通过以上几步则完成了edits和fsimage文件的合并,依此不断循环,从而到达保证元数据的正确性。

三、HDFS写原理

1、HDFS客户端提交写操作到NameNode上,NameNode收到客户端提交的请求后,会先判断此客户端在此目录下是否有写权限,如果有,然后进行查看,看哪几个DataNode适合存放,再给客户端返回存放数据块的节点信息,即告诉客户端可以把文件存放到相关的DataNode节点下;

2、客户端拿到数据存放节点位置信息后,会和对应的DataNode节点进行直接交互,进行数据写入,由于数据块具有副本replication,在数据写入时采用的方式是先写第一个副本,写完后再从第一个副本的节点将数据拷贝到其它节点,依次类推,直到所有副本都写完了,才算数据成功写入到HDFS上,副本写入采用的是串行,每个副本写的过程中都会逐级向上反馈写进度,以保证实时知道副本的写入情况;

3、随着所有副本写完后,客户端会收到数据节点反馈回来的一个成功状态,成功结束后,关闭与数据节点交互的通道,并反馈状态给NameNode,告诉NameNode文件已成功写入到对应的DataNode。

代码实现

  1. /*
  2. * 测试HDFS写入数据
  3. */
  4. @Test
  5. public void Test1() throws IOException {
  6. // 加载配置文件
  7. Configuration conf = new Configuration();
  8. FileSystem fs = FileSystem.get(conf);
  9. Path path = new Path("/gyb/student.txt");
  10. // 产生IO流
  11. FSDataOutputStream fsio = fs.create(path);
  12. // 包装输出IO流
  13. BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fsio));
  14. // 包装输入IO流
  15. BufferedReader br = new BufferedReader(
  16. new InputStreamReader(new FileInputStream("student.txt")));
  17. String line = null;
  18. while ((line = br.readLine()) != null) {
  19. bw.write(line);
  20. bw.newLine();
  21. bw.flush();
  22. }
  23. bw.close();
  24. br.close();
  25. }

四、HDFS读原理

1、HDFS客户端提交读操作到NameNode上,NameNode收到客户端提交的请求后,会先判断此客户端在此目录下是否有读权限,如果有,则给客户端返回存放数据块的节点信息,即告诉客户端可以到相关的DataNode节点下去读取数据块;

2、客户端拿到块位置信息后,会去和相关的DataNode直接构建读取通道,读取数据块,当所有数据块都读取完成后关闭通道,并给NameNode返回状态信息,告诉NameNode已经读取完毕。

代码实现

  1. /*
  2. * 测试HDFS读出的操作
  3. */
  4. @Test
  5. public void Test3() throws IOException {
  6. // 加载配置类
  7. Configuration conf = new Configuration();
  8. FileSystem fs =FileSystem.newInstance(conf);
  9. Path path = new Path("/gyb/student.txt");
  10. FileStatus[] fileStatus = fs.listStatus(path);
  11. for (FileStatus fileStatus2 : fileStatus) {
  12. if(fileStatus2 != null && fileStatus2.isFile()) {
  13. //open方法只能传文件
  14. FSDataInputStream fsi = fs.open(path);
  15. // 包装IO流
  16. BufferedReader br = new BufferedReader(new InputStreamReader(fsi));
  17. while(br.ready()) {
  18. System.out.println(br.readLine());
  19. }
  20. }
  21. }
  22. System.out.println( "--------over--------");
  23. }

 


http://chatgpt.dhexx.cn/article/lL3bMcOd.shtml

相关文章

HDFS架构及原理

HDFS架构及原理 1、HDFS架构及存储 HDFS 采用Master/Slave的架构来存储数据,这种架构主要由四个部分组成,分别为HDFS Client、NameNode、DataNode和Secondary NameNode。一个HDFS集群是由一个NameNode和一定数目的DataNode组成的。NameNode是一个中心服…

HDFS基本原理及数据存取实战

--------------------------------------------------------------------------------------------------------------- [版权申明:本文系作者原创,转载请注明出处] 文章出处:http://blog.csdn.net/sdksdk0/article/details/51622547 作者&am…

QT的开发学习路线

基础组件;页面布局;通信机制;

QT的学习

QT是利用C进行编写,而QT则是C的实际运用的一种方式。 QT也称GUI------grphical user interface(图形用户接口) 通过图形的方式操纵计算机用户界面 QT的特点以及应用: 1、跨平台(可以在多个平台上进操作&#xff08…

Qt 学习之路 2 --- 读书笔记

一、文章来由 来自豆子老师非常好的一本Qt教程,但是只有网络版,所以用这个做笔记了,不动笔墨不读书嘛~~ 二、读书笔记 1、Qt 学习之路 2(2):Qt 简介 1.1 关于 Qt 的一站式解决 Qt 是一个著名的 C 应用…

Qt学习之路之 QTextEdit 重温

其实,QTextEdit 也有对文本的编辑函数, 剪切,复制,撤销..... 看看下面的这个简单的例子: 控件一目了然。按钮 QTextedit 对象 , 垂直布局。 -------------------------------------------------- 环境&…

QT的进一步学习

QT的进一步学习 来源: ChinaUnix博客  日期: 2006.10.02 17:41 (共有条评论) 我要评论 本文收录了互联…

Qt学习之路之QMovie动画

QMovie类是一个很方便的类,用于播放动画。在刷新页面的时候,可以尝试用QMovie 来实现等待界面。 QMovie类用于显示简单的动画,没有声音。 首先,通过将一个文件的名称或者一个指针传递给QMovie的构造函数构建一个QMovie对象。传递…

QT学习之路-记事本

1、在创建记事本之前先明白有哪些功能: 先创建一个菜单栏,菜单栏是用来装各种功能的一个地方如上图所示,文件、编辑所在的地方为菜单栏, //创建菜单栏QMenuBar *menubarmenuBar();菜单栏创建好后再创建菜单,菜单在菜单…

QT学习

文章目录 前言一:Qt的三个基类QObject、QApplication和QWidget一:QObject类二:Qapplication类三:QWidget 二:Qt中QMainWindow、QWidget、QDialog的区别基础知识1:容器类常用的QListQStack和QQueueMap和Mult…

【QT学习之路】QThread的简单使用

QThread的使用说明:QThread线程类是QT已经封装好的, 如果要使用线程, 就派生出子类并且实现线程接口函数run(run就是线程任务函数) 下面就用QThread实现当前系统时间的获取并且在主界面(UI线程)上显示,实现…

【QT学习之路,QT安装】

1,安装QT 系统环境:ubuntu 22.04 sudo apt-get install build-essential sudo apt-get install qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools sudo apt-get install qtcreator sudo apt-get install qt5* 2,安装成功后会有4个程序 3…

qt学习之路(三)之使用QT语言家

一、简介 源代码中经常会出现一些字符串,比如定义要显示在控件上的文本,在不同的语言环境下,可能会需要显示不同语言对应的文本。针对多语言切换的需求,Qt提供的解决方案是,在所有需要翻译的字符串处都使用QObject::tr…

QT学习(2)

事件 事件与信号的关系?? 点击按钮,也会进入到事件循环,处理槽函数 事件对操作系统而言 事件大部分都是由硬件触发;事件产生,操作系统是知道的 鼠标移动: 事件在qt中是由多态去实现的&#xf…

Qt 进阶之路

作者:billy 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 前言 古语有云:“工欲善其事,必先利其器”。一件好的开发工具可以帮助开发者快速、准确的完成任务。博主主要从…

Qt 入门学习路线

参考书目 《C GUI Qt4编程》 一、Qt框架概述 1. 什么是Qt? Qt是一个用C编写的、成熟的、跨平台的GUI工具包,它是挪威Trolltech公司的产品,该公司为商业市场开发、销售和支持Qt及其相关软件。 Qt作为一个出色的软件框架,除了为应用程序提供…

《Qt基础教程之Qt学习之路》

在Qt开源社区中,有一个很好的Qt教程,叫做《Qt 学习之路》,下面是它的链接和目录。 链接地址:http://www.qter.org/thread-629-1-1.html 评论区说上面这个地址打不开,有可能没人管理了。可以试一下面的: h…

Qt学习之路 (一)概述

Qt(官方发音 [kju:t],音同 cute)是一个跨平台的 C 开发库,主要用来开发图形用户界面(Graphical User Interface,GUI)程序,当然也可以开发不带界面的命令行(Command User …

QT学习之路

文章目录 一、QT简单介绍二、.pro文件介绍三、 命名规范和常用快捷键以及QPushButton简单使用登录窗口布局控件--按钮组其他常用控件介绍自定义控件封装Qt中的鼠标事件定时器一定时器二event事件分发器事件过滤器绘图事件绘图高级设置绘图设备QFile文件读写操作QFileInfo文件信…

在自己电脑上搭建一个FTP服务器

在自己电脑上搭建一个FTP服务器 因为项目需要,第一次搭建FTP,也是在博客上找的经验,写这篇博客,主要是想记录一下,留个笔记,以防后面需要。 本文是在不借助工具的情况下在自己电脑上搭建FTP服务器。我的是w…