HDFS简介
- 格式:docx
- 大小:193.51 KB
- 文档页数:6
Hadoop分布式⽂件系统(HDFS)详解HDFS简介:当数据集的⼤⼩超过⼀台独⽴物理计算机的存储能⼒时,就有必要对它进⾏分区 (partition)并存储到若⼲台单独的计算机上。
管理⽹络中跨多台计算机存储的⽂件系统成为分布式⽂件系统 (Distributed filesystem)。
该系统架构于⽹络之上,势必会引⼊⽹络编程的复杂性,因此分布式⽂件系统⽐普通磁盘⽂件系统更为复杂。
HDFS是基于流数据模式访问和处理超⼤⽂件的需求⽽开发的,它可以运⾏于廉价的商⽤服务器上。
总的来说,可以将 HDFS的主要特点概括为以下⼏点:(1 )处理超⼤⽂件这⾥的超⼤⽂件通常是指数百 MB、甚⾄数百TB ⼤⼩的⽂件。
⽬前在实际应⽤中, HDFS已经能⽤来存储管理PB(PeteBytes)级的数据了。
在 Yahoo!,Hadoop 集群也已经扩展到了 4000个节点。
(2 )流式地访问数据HDFS的设计建⽴在更多地响应“⼀次写⼊,多次读取”任务的基础之上。
这意味着⼀个数据集⼀旦由数据源⽣成,就会被复制分发到不同的存储节点中,然后响应各种各样的数据分析任务请求。
在多数情况下,分析任务都会涉及数据集中的⼤部分数据,也就是说,对HDFS 来说,请求读取整个数据集要⽐读取⼀条记录更加⾼效。
(3 )运⾏于廉价的商⽤机器集群上Hadoop设计对硬件需求⽐较低,只须运⾏在廉价的商⽤硬件集群上,⽽⽆须昂贵的⾼可⽤性机器上。
廉价的商⽤机也就意味着⼤型集群中出现节点故障情况的概率⾮常⾼。
这就要求在设计 HDFS时要充分考虑数据的可靠性、安全性及⾼可⽤性。
正是由于以上的种种考虑,我们会发现现在的 HDFS在处理⼀些特定问题时不但没有优势,⽽且有⼀定的局限性,主要表现在以下⼏个⽅⾯。
(1 )不适合低延迟数据访问如果要处理⼀些⽤户要求时间⽐较短的低延迟应⽤请求,则 HDFS不适合。
HDFS 是为了处理⼤型数据集分析任务的,主要是为达到⾼的数据吞吐量⽽设计的,这就可能要求以⾼延迟作为代价。
hdfs中dfsHDFS(Hadoop Distributed File System)中DFSHadoop Distributed File System(HDFS)是Apache Hadoop生态系统中最核心的组件之一。
它是一种被设计用于大规模数据处理和分布式存储的文件系统。
HDFS的设计目标是提供高可靠性、高可扩展性和高容错性,以满足大规模数据处理的需求。
本文将重点介绍HDFS中的DFS(Distributed File System)的相关内容。
DFS是HDFS的核心模块,负责将数据分布式地存储在集群中的各个节点上。
在Hadoop集群中,所有的数据都被切分成固定大小的块(block),这些块被分布式地存储在不同的节点上。
HDFS的块的默认大小是128MB,这种设计是为了在大规模数据处理时提供高效的访问性能。
当一个文件被上传到HDFS时,DFS会将文件切分成多个块,并将这些块存储在不同的节点上。
这种分布式存储的方式保证了数据的高可靠性和冗余性。
每个块会被复制到不同的节点上,这样即使某个节点发生故障,数据仍然能够被访问。
HDFS的DFS采用了主从架构,集群中有一个NameNode和多个DataNode。
NameNode负责管理文件系统的命名空间和块的分布情况,而DataNode则负责存储和服务于数据块。
NameNode是HDFS的核心组件,它保存了整个文件系统的元数据信息。
元数据包括文件和目录的名称、大小、创建时间、修改时间等。
当一个客户端需要访问文件时,它会先向NameNode发送请求,获取所需文件的块的位置信息,然后再直接和拥有这些块的DataNode通信。
为了保证系统的可靠性,HDFS将数据块的复制策略作为一个重要的设计考虑因素。
HDFS默认将数据块复制到集群的不同机架上的不同节点上,这样可以在机架或节点发生故障时提供数据的冗余备份,确保数据的高可用性。
DFS还支持手动或自动地增加或减少数据块的复制数量。
HDFS简介及基本概念(⼀)HDFS简介及其基本概念 HDFS(Hadoop Distributed File System)是hadoop⽣态系统的⼀个重要组成部分,是hadoop中的的存储组件,在整个Hadoop中的地位⾮同⼀般,是最基础的⼀部分,因为它涉及到数据存储,MapReduce等计算模型都要依赖于存储在HDFS中的数据。
HDFS是⼀个分布式⽂件系统,以流式数据访问模式存储超⼤⽂件,将数据分块存储到⼀个商业硬件集群内的不同机器上。
这⾥重点介绍其中涉及到的⼏个概念:(1)超⼤⽂件。
⽬前的hadoop集群能够存储⼏百TB甚⾄PB级的数据。
(2)流式数据访问。
HDFS的访问模式是:⼀次写⼊,多次读取,更加关注的是读取整个数据集的整体时间。
(3)商⽤硬件。
HDFS集群的设备不需要多么昂贵和特殊,只要是⼀些⽇常使⽤的普通硬件即可,正因为如此,hdfs节点故障的可能性还是很⾼的,所以必须要有机制来处理这种单点故障,保证数据的可靠。
(4)不⽀持低时间延迟的数据访问。
hdfs关⼼的是⾼数据吞吐量,不适合那些要求低时间延迟数据访问的应⽤。
(5)单⽤户写⼊,不⽀持任意修改。
hdfs的数据以读为主,只⽀持单个写⼊者,并且写操作总是以添加的形式在⽂末追加,不⽀持在任意位置进⾏修改。
1、HDFS数据块 每个磁盘都有默认的数据块⼤⼩,这是⽂件系统进⾏数据读写的最⼩单位。
这涉及到磁盘的相应知识,这⾥我们不多讲,后⾯整理⼀篇博客来记录⼀下磁盘的相应知识。
HDFS同样也有数据块的概念,默认⼀个块(block)的⼤⼩为128MB(HDFS的块这么⼤主要是为了最⼩化寻址开销),要在HDFS中存储的⽂件可以划分为多个分块,每个分块可以成为⼀个独⽴的存储单元。
与本地磁盘不同的是,HDFS中⼩于⼀个块⼤⼩的⽂件并不会占据整个HDFS数据块。
对HDFS存储进⾏分块有很多好处:⼀个⽂件的⼤⼩可以⼤于⽹络中任意⼀个磁盘的容量,⽂件的块可以利⽤集群中的任意⼀个磁盘进⾏存储。
hdfs ec策略摘要:一、HDFS 简介1.HDFS 的定义与作用2.HDFS 的特点二、HDFS 的EC 策略1.EC 策略的定义与作用2.EC 策略的类型2.1 数据EC2.2 对象EC2.3 块EC三、EC 策略的实现1.数据EC 的实现2.对象EC 的实现3.块EC 的实现四、EC 策略的优势与不足1.优势2.不足五、总结正文:HDFS(Hadoop Distributed File System)是一个分布式文件系统,被广泛应用于大数据领域。
它具有高可靠性、高可用性和高扩展性等特点,可以存储海量数据。
然而,在大规模数据存储中,数据的完整性和一致性变得尤为重要。
为此,HDFS 引入了EC(Error Correction)策略,用于提高数据的可靠性和一致性。
HDFS 的EC 策略主要分为数据EC、对象EC 和块EC 三种。
其中,数据EC 主要用于修复数据节点上的数据错误,对象EC 用于修复对象存储节点上的数据错误,块EC 用于修复块存储节点上的数据错误。
这三种EC 策略共同保证了HDFS 数据的高可靠性和一致性。
在实现EC 策略的过程中,HDFS 采用了多种技术手段。
例如,数据EC 通过数据校验和、数据复制等方式实现;对象EC 通过对象复制、对象版本控制等方式实现;块EC 通过块校验和、块复制等方式实现。
这些技术手段既保证了数据的可靠性,又提高了数据的一致性。
然而,HDFS 的EC 策略并非完美无缺。
首先,EC 策略的实现增加了系统开销,可能导致系统性能下降。
其次,EC 策略并不能完全消除数据错误,当错误发生时,仍然需要进行数据修复。
最后,随着数据量的不断增长,EC 策略的复杂性和实现难度也在不断加大。
综上所述,HDFS 的EC 策略在保证数据可靠性和一致性方面具有重要作用,但同时也存在一些不足。
hdfs的原理HDFS(Hadoop Distributed File System)是Hadoop生态系统中的基本组件之一,它是一个分布式文件系统,用于存储和处理大规模数据集。
HDFS的原理主要有以下几个方面:1. 数据切块:HDFS将要存储的文件切分成固定大小的数据块(默认为128MB),并将这些数据块分散存储在集群中的多个节点上。
2. 冗余复制:HDFS会将每个数据块复制多次,并保存在不同的节点上。
默认情况下,每个数据块会复制三次,分别存储在不同的机架上的不同节点上。
这样做的目的是增加数据的可靠性和容错性。
3. Master/Slave架构:HDFS由一个NameNode和多个DataNode组成。
NameNode是HDFS的主节点,负责管理文件系统的命名空间、数据块的存储位置等元数据信息;DataNode是HDFS的工作节点,负责实际的数据存储和读写操作。
NameNode维护了一个全局的文件系统命名空间和每个数据块所在的DataNode的信息。
4. 分布式读写:客户端可以通过与NameNode交互获取文件的块的位置信息,并直接与DataNode进行数据的读写操作。
如果要读取一个文件,客户端首先询问NameNode该文件各个数据块所在的DataNode位置信息,然后直接从这些DataNode上读取数据;如果要写入一个文件,客户端首先向NameNode发送写请求,NameNode返回可供写入的DataNode 列表,客户端将数据块分割成与DataNode对应的大小,并将数据块分别发送给各个DataNode进行存储。
5. 容错恢复:HDFS通过定期向NameNode发送心跳信号来检测和监控每个DataNode的健康状态。
如果发现某个DataNode 失效,NameNode会将存储在该节点上的数据块复制到其他正常的DataNode上,以保证数据的冗余备份。
通过以上的原理,HDFS实现了数据的高可靠性、高容错性和高扩展性,适用于大规模的数据存储和处理场景。
HDFS详解1、HDFS 是做什么的HDFS(Hadoop Distributed File System)是Hadoop项⽬的核⼼⼦项⽬,是分布式计算中数据存储管理的基础,是基于流数据模式访问和处理超⼤⽂件的需求⽽开发的,可以运⾏于廉价的商⽤服务器上。
它所具有的⾼容错、⾼可靠性、⾼可扩展性、⾼获得性、⾼吞吐率等特征为海量数据提供了不怕故障的存储,为超⼤数据集(Large Data Set)的应⽤处理带来了很多便利。
2、HDFS 从何⽽来HDFS 源于 Google 在2003年10⽉份发表的GFS(Google File System)论⽂。
它其实就是 GFS 的⼀个克隆版本3、为什么选择 HDFS 存储数据之所以选择 HDFS 存储数据,因为 HDFS 具有以下优点: 1、⾼容错性数据⾃动保存多个副本。
它通过增加副本的形式,提⾼容错性。
某⼀个副本丢失以后,它可以⾃动恢复,这是由 HDFS 内部机制实现的,我们不必关⼼。
2、适合批处理它是通过移动计算⽽不是移动数据。
它会把数据位置暴露给计算框架。
3、适合⼤数据处理处理数据达到 GB、TB、甚⾄PB级别的数据。
能够处理百万规模以上的⽂件数量,数量相当之⼤。
能够处理10K节点的规模。
4、流式⽂件访问⼀次写⼊,多次读取。
⽂件⼀旦写⼊不能修改,只能追加。
它能保证数据的⼀致性。
5、可构建在廉价机器上它通过多副本机制,提⾼可靠性。
它提供了容错和恢复机制。
⽐如某⼀个副本丢失,可以通过其它副本来恢复。
当然 HDFS 也有它的劣势,并不适合所有的场合: 1、低延时数据访问⽐如毫秒级的来存储数据,这是不⾏的,它做不到。
它适合⾼吞吐率的场景,就是在某⼀时间内写⼊⼤量的数据。
但是它在低延时的情况下是不⾏的,⽐如毫秒级以内读取数据,这样它是很难做到的。
2、⼩⽂件存储存储⼤量⼩⽂件(这⾥的⼩⽂件是指⼩于HDFS系统的Block⼤⼩的⽂件(默认64M))的话,它会占⽤ NameNode⼤量的内存来存储⽂件、⽬录和块信息。
HDFS简介作为Hadoop的核心技术之一,HDFS(Hadoop distributed File System,Hadoop分布式文件系统)是分布式计算中数据存储管理的基础。
它所具有的高容错高可靠性、高可扩展性、高获得性、高吞吐率等特征为海量数据提供了不怕故障的存储,为超大数据集(Large Data Set)的应用处理带来了很多便利。
HDFS放宽了一部分POSIX约束,来实现流式读取文件系统数据的目的。
HDFS在最开始是作为Apache Nutch搜索引擎项目的基础架构而开发的。
HDFS 是Apache Hadoop Core项目的一部分。
前提和设计目标硬件错误硬件错误是常态而不是异常。
HDFS可能由成百上千的服务器所构成,每个服务器上存储着文件系统的部分数据。
我们面对的现实是构成系统的组件数目是巨大的,而且任一组件都有可能失效,这意味着总是有一部分HDFS的组件是不工作的。
因此错误检测和快速、自动的恢复是HDFS最核心的架构目标。
流式数据访问HDFS的设计中更多的考虑到了数据批处理,而不是用户交互处理。
比之数据访问的低延迟问题,更关键的在于数据访问的高吞吐量。
POSIX标准设置的很多硬性约束对HDFS应用系统不是必需的。
为了提高数据的吞吐量,在一些关键方面对POSIX的语义做了一些修改。
大规模数据集HDFS上的一个典型文件大小一般都在G字节至T字节。
因此,HDFS被调节以支持大文件存储。
它应该能提供整体上高的数据传输带宽,能在一个集群里扩展到数百个节点。
一个单一的HDFS实例应该能支撑数以千万计的文件。
简单的一致性模型HDFS应用需要一个“一次写入多次读取”的文件访问模型。
一个文件经过创建、写入和关闭之后就不需要改变。
这一假设简化了数据一致性问题,并且使高吞吐量的数据访问成为可能。
Map/Reduce应用或者网络爬虫应用都非常适合这个模型。
“移动计算比移动数据更划算”一个应用请求的计算,离它操作的数据越近就越高效,在数据达到海量级别的时候更是如此。
因为这样就能降低网络阻塞的影响,提高系统数据的吞吐量。
将计算移动到数据附近,比之将数据移动到应用所在显然更好。
HDFS为应用提供了将它们自己移动到数据附近的接口。
异构软硬件平台间的可移植性HDFS在设计的时候就考虑到平台的可移植性。
这种特性方便了HDFS作为大规模数据应用平台的推广。
HDFS体系结构HDFS是一主/从(Master/Slave)体系结构,如图1所示。
从最终用户的角度来看,它就像传统的文件系统一样,可以难过目录路径对文件执行CRUD(Create、Read、Update 和Delete)操作。
但由于分布式存储的性质,HDFS集群拥有一个NameNode和一些DataNodes。
NameNode管理文件系统的元数据,DataNode存储实际的数据。
客户端通过同NameNode和DataNodes的交互访问文件系统。
客户端联系NameNode以获取文件的元数据,而真正的文件I/O操作是直接和DataNode进行交互的。
Namenode和Datanode被设计成可以在普通的商用机器上运行。
这些机器一般运行着GNU/Linux操作系统(OS)。
HDFS采用Java语言开发,因此任何支持Java的机器都可以部署Namenode或Datanode。
由于采用了可移植性极强的Java语言,使得HDFS可以部署到多种类型的机器上。
一个典型的部署场景是一台机器上只运行一个Namenode实例,而集群中的其它机器分别运行一个Datanode实例。
这种架构并不排斥在一台机器上运行多个Datanode,只不过这样的情况比较少见。
集群中单一Namenode的结构大大简化了系统的架构。
Namenode是所有HDFS元数据的仲裁者和管理者,这样,用户数据永远不会流过Namenode。
图1 HDFS结构示意图文件系统的名字空间(namespace)HDFS支持传统的层次型文件组织结构。
用户或者应用程序可以创建目录,然后将文件保存在这些目录里。
文件系统名字空间的层次结构和大多数现有的文件系统类似:用户可以创建、删除、移动或重命名文件。
当前,HDFS不支持用户磁盘配额和访问权限控制,也不支持硬链接和软链接。
但是HDFS架构并不妨碍实现这些特性。
Namenode负责维护文件系统的名字空间,任何对文件系统名字空间或属性的修改都将被Namenode记录下来。
应用程序可以设置HDFS保存的文件的副本数目。
文件副本的数目称为文件的副本系数,这个信息也是由Namenode保存的。
HDFS文件系统元数据的持久化Namenode上保存着HDFS的名字空间。
对于任何对文件系统元数据产生修改的操作,Namenode都会使用一种称为EditLog的事务日志记录下来。
例如,在HDFS中创建一个文件,Namenode就会在Editlog中插入一条记录来表示;同样地,修改文件的副本系数也将往Editlog插入一条记录。
Namenode在本地操作系统的文件系统中存储这个Editlog。
整个文件系统的名字空间,包括数据块到文件的映射、文件的属性等,都存储在一个称为FsImage的文件中,这个文件也是放在Namenode所在的本地文件系统上。
Namenode在内存中保存着整个文件系统的名字空间和文件数据块映射(Blockmap)的映像。
这个关键的元数据结构设计得很紧凑,因而一个有4G内存的Namenode足够支撑大量的文件和目录。
当Namenode启动时,它从硬盘中读取Editlog和FsImage,将所有Editlog中的事务作用在内存中的FsImage 上,并将这个新版本的FsImage从内存中保存到本地磁盘上,然后删除旧的Editlog,因为这个旧的Editlog的事务都已经作用在FsImage上了。
这个过程称为一个检查点(checkpoint)。
在当前实现中,检查点只发生在Namenode启动时,在不久的将来将实现支持周期性的检查点。
Datanode将HDFS数据以文件的形式存储在本地的文件系统中,它并不知道有关HDFS文件的信息。
它把每个HDFS数据块存储在本地文件系统的一个单独的文件中。
Datanode并不在同一个目录创建所有的文件,实际上,它用试探的方法来确定每个目录的最佳文件数目,并且在适当的时候创建子目录。
在同一个目录中创建所有的本地文件并不是最优的选择,这是因为本地文件系统可能无法高效地在单个目录中支持大量的文件。
当一个Datanode启动时,它会扫描本地文件系统,产生一个这些本地文件对应的所有HDFS数据块的列表,然后作为报告发送到Namenode,这个报告就是块状态报告。
通讯协议所有的HDFS通讯协议都是建立在TCP/IP协议之上。
客户端通过一个可配置的TCP端口连接到Namenode,通过ClientProtocol协议与Namenode交互。
而Datanode使用DatanodeProtocol协议与Namenode交互。
一个远程过程调用(RPC)模型被抽象出来封装ClientProtocol和Datanodeprotocol协议。
在设计上,Namenode不会主动发起RPC,而是响应来自客户端或Datanode 的RPC请求。
HDFS可靠性措施HDFS的主要设计目标之一就是在故障情况下也能保证数据存储的可靠性。
HDFS具备了较为完善的冗余备份和故障恢复机制,可以实现在集群中可靠地存储海量文件。
冗余备份HDFS将每个文件存储成一系列数据块(Block),默认块大小为64MB(配置)。
为了容错,文件的所有数据块都会有副本(副本数量即复制因子,可配置)。
HDFS的文件都是一次性写入的,并且严格限制为任何进修都只有一个写用户。
DataNode使用本地文件系统来存储HDFS的数据,但是它对HDFS的文件一无所知,只是用一个个文件存储HDFS的每个数据块。
当DataNode启动的时候,它会遍历本地文件系统,产生一份HDFS数据块和本地文件对应关系的列表,并把这个报告发给NameNode,这就是块报告(Blockreport)。
块报告包括了DataNode上所有块的列表。
副本存放副本的存放是HDFS可靠性和性能的关键。
优化的副本存放策略是HDFS区分于其他大部分分布式文件系统的重要特性。
这种特性需要做大量的调优,并需要经验的积累。
HDFS采用一种称为机架感知(rack-aware)的策略来改进数据的可靠性、可用性和网络带宽的利用率。
目前实现的副本存放策略只是在这个方向上的第一步。
实现这个策略的短期目标是验证它在生产环境下的有效性,观察它的行为,为实现更先进的策略打下测试和研究的基础。
大型HDFS实例一般运行在跨越多个机架的计算机组成的集群上,不同机架上的两台机器之间的通讯需要经过交换机。
在大多数情况下,同一个机架内的两台机器间的带宽会比不同机架的两台机器间的带宽大。
图2 数据的复制通过一个机架感知的过程,Namenode可以确定每个Datanode所属的机架id。
一个简单但没有优化的策略就是将副本存放在不同的机架上。
这样可以有效防止当整个机架失效时数据的丢失,并且允许读数据的时候充分利用多个机架的带宽。
这种策略设置可以将副本均匀分布在集群中,有利于当组件失效情况下的负载均衡。
但是,因为这种策略的一个写操作需要传输数据块到多个机架,这增加了写的代价。
在大多数情况下,副本系数是3,HDFS的存放策略是将一个副本存放在本地机架的节点上,一个副本放在同一机架的另一个节点上,最后一个副本放在不同机架的节点上。
这种策略减少了机架间的数据传输,这就提高了写操作的效率。
机架的错误远远比节点的错误少,所以这个策略不会影响到数据的可靠性和可用性。
于此同时,因为数据块只放在两个(不是三个)不同的机架上,所以此策略减少了读取数据时需要的网络传输总带宽。
在这种策略下,副本并不是均匀分布在不同的机架上。
三分之一的副本在一个节点上,三分之二的副本在一个机架上,其他副本均匀分布在剩下的机架中,这一策略在不损害数据可靠性和读取性能的情况下改进了写的性能。
心跳检测NameNode周期性地从集群中的每个DataNode接受心跳包和块报告,NameNode可以根据这个报告验证块映射和其他文件系统元数据。
收到心跳包说明该DataNode工作正常。
如果DataNode不能发送心跳消息,NameNode会标记最近没有心跳的DataNode为宕机,不会发给它们任何新的I/O请求。
这样一来,任何存储在宕机的DataNode的数据将不再有效。
DataNode的宕机会造成一些数据块的副本数下降并低于指定值,NameNode会不断检测这些需要复制的数据块,并在需要的时候重新复制。