HDFS-简介
HDFS(Hadoop Distributed File System):Hadoop分布式文件系统
概念
数据块
HDFS上的文件被划分为块大小的多个分块(chunk),作为独立的存储单元。在2.X版本默认块大小为128MB,旧版本块大小默认为64MB。
-
查看文件块大小和副本数
## 语法 hadoop fs [generic options] -stat [format] <path> ... ## format 格式 %b:打印文件大小(目录为0) %n:打印文件名 %o:打印block size (我们要的值) %r:打印备份数 %y:打印UTC日期 yyyy-MM-dd HH:mm:ss %Y:打印自1970年1月1日以来的UTC微秒数 %F:目录打印directory, 文件打印regular file 当使用-stat选项但不指定format时候,只打印文件创建日期,相当于%y [hadoop@pg1 soft]$ hadoop fs -put ./jdk-8u202-linux-x64.tar.gz / [hadoop@pg1 soft]$ hadoop fs -ls / Found 4 items drwxr-xr-x - hadoop supergroup 0 2020-09-07 09:48 /hadoop drwxr-xr-x - hadoop supergroup 0 2020-09-09 10:18 /hbase -rw-r--r-- 2 hadoop supergroup 194042837 2020-09-25 09:28 /jdk-8u202-linux-x64.tar.gz drwxrwx--- - hadoop supergroup 0 2020-09-07 09:00 /tmp [hadoop@pg1 soft]$ hadoop fs -stat "%o %r" /jdk-8u202-linux-x64.tar.gz 134217728 2 [hadoop@pg1 soft]$
jdk-8u202-linux-x64.tar.gz文件块大小为128M,有2个副本
-
列出各个HDFS文件组成块信息
[hadoop@pg1 soft]$ hdfs fsck / -files -blocks Connecting to namenode via http://pg2:50070/fsck?ugi=hadoop&files=1&blocks=1&path=%2F FSCK started by hadoop (auth:SIMPLE) from /192.168.10.190 for path / at Fri Sep 25 09:34:42 CST 2020 / <dir> /hadoop <dir> /hadoop/hadoop-2.10.0.tar.gz 392115733 bytes, 3 block(s): OK 0. BP-2081959867-192.168.10.190-1599396161857:blk_1073741828_1004 len=134217728 Live_repl=2 1. BP-2081959867-192.168.10.190-1599396161857:blk_1073741829_1005 len=134217728 Live_repl=2 2. BP-2081959867-192.168.10.190-1599396161857:blk_1073741830_1006 len=123680277 Live_repl=2 ......
Namenode 和 Datanode
HDFS采用master/slave架构。一个HDFS集群是由一个Namenode和一定数目的Datanodes组成。
-
Namenode是一个中心服务器,负责管理文件系统的名字空间(namespace)以及客户端对文件的访问。
-
它管理文件系统树及整棵树内所有文件和目录。这些信息通过命名空间镜像文件和编辑日志文件这2种文件形式保存到本地磁盘上
## 命名空间镜像文件 fsimage_0000000000000003271 fsimage_0000000000000003271.md5 ## 编辑日志文件 edits_0000000000000002476-0000000000000002477
-
namenode记录着每个文件中各个块所在的数据节点信息,但不永久保存块的位置信息
-
若namenode机器毁坏,文件将会丢失。提供下面2种机制,实现容错
- 配置namenode在多个文件系统上保存元数据的持久状态(写入本地磁盘的同时写入一个NFS文件系统)
- 运行一个辅助namenode
-
-
集群中的Datanode一般是一个节点一个设备,负责管理它所在节点上的数据存储。
- 它们根据需要存储和检索数据块,并定期向namenode发送它们所存储的块的列表
-
辅助namenode(secondary namenode):负责定期合并编辑日志和命名空间镜像
- 它需要大量CPU资源和跟活动namenode一样多的内存合并编辑日志
HDFS暴露了文件系统的名字空间,用户能够以文件的形式在上面存储数据。从内部看,一个文件其实被分成一个或多个数据块,这些块存储在一组Datanode上。Namenode执行文件系统的名字空间操作,比如打开、关闭、重命名文件或目录。它也负责确定数据块到具体Datanode节点的映射。Datanode负责处理文件系统客户端的读写请求。在Namenode的统一调度下进行数据块的创建、删除和复制。
Namenode和Datanode被设计成可以在普通的商用机器上运行。这些机器一般运行着GNU/Linux操作系统(OS)。HDFS采用Java语言开发,因此任何支持Java的机器都可以部署Namenode或Datanode。由于采用了可移植性极强的Java语言,使得HDFS可以部署到多种类型的机器上。一个典型的部署场景是一台机器上只运行一个Namenode实例,而集群中的其它机器分别运行一个Datanode实例。这种架构并不排斥在一台机器上运行多个Datanode,只不过这样的情况比较少见。
集群中单一Namenode的结构大大简化了系统的架构。Namenode是所有HDFS元数据的仲裁者和管理者,这样,用户数据永远不会流过Namenode。
文件系统的名字空间 (namespace)
HDFS支持传统的层次型文件组织结构。用户或者应用程序可以创建目录,然后将文件保存在这些目录里。文件系统名字空间的层次结构和大多数现有的文件系统类似:用户可以创建、删除、移动或重命名文件。当前,HDFS不支持用户磁盘配额和访问权限控制,也不支持硬链接和软链接。但是HDFS架构并不妨碍实现这些特性。
Namenode负责维护文件系统的名字空间,任何对文件系统名字空间或属性的修改都将被Namenode记录下来。应用程序可以设置HDFS保存的文件的副本数目。文件副本的数目称为文件的副本系数,这个信息也是由Namenode保存的。
联邦HDFS
namenode在内存中保存每个文件和每个数据块的引用关系。对于拥有大量文件的集群来说,内存将成为横向扩展的瓶颈。在2.X中引入联邦HDFS允许系统通过添加namenode实现扩展,其中每个namenode管理文件系统命名空间的一部分。
在联邦环境下,每个namenode维护一个命名空间卷(namespace volume),由命名空间的元数据和一个数据块池(block pool)组成。数据块池包含该命名空间下文件的所有数据块。命名空间卷相互独立,两两之间并不相互通信。
HDFS的高可用性
Hadoop2针对namenode存在的单点失效(SPOF, single point of failure)问题,提供对HDFS的高可用性(HA)支持。通过配置一对活动-备用(active-standby) namenode。当活动namenode失效时,备用namenode自动接管它的任务并开始服务于来自客户端的请求。
HA架构改变
- namenode之间需要通过高可用共享存储实现编辑日志的共享。当备用namenode接管工作之后,它将通读共享编辑日志以实现与活动namenode的状态同步
- datanode需要同时向两个namenode发生数据块处理报告
- 辅助namenode的角色被备用namenode所包含,备用namenode为活动的namenode命名空间设置周期性检查点。
高可用共享存储实现方案
- NFS过滤器
- 群体日志管理器(QJM, quorum journal manager)
- QJM 是一个专用的HDFS实现,提供一个高可用的编辑日志而设计
- QJM 以一组日志节点(journal node)的形式运行,每次编辑必须写入多数日志节点
故障切换(failover)与规避(fencing)
Hadoop HA默认使用zookeeper作为故障转移控制器,它(zookeeper)负责监视(心跳机制)namenode是否失效并在namenode失效时进行故障转移。zookeeper确保集群中有且仅有一个活动namenode。
fencing方法用于确保先前活动的namenode不会执行危害系统并导致系统崩溃的操作。
同一时间QJM仅允许一个namenode向编辑日志写入数据。
当使用NFS过滤器实现共享编辑日志时,由于不能同一时间只允许一个namenode写入数据,更加需要有力的规避方法
- 撤销namenode访问共享存储目录的权限
- 通过远程管理命令屏蔽相应的网络端口
- 强制先前活动的namenode断电操作
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)