HDFS 概念
Hadoop 分布式文件系统 (Hadoop Distributed File System) 是一种分布式文件系统
,旨在运行在商用硬件上。它与现有的分布式文件系统有许多相似之处。但是,与其他分布式文件系统的差异很大。HDFS 具有高度容错能力,旨在部署在低成本硬件上。HDFS 提供对应用程序数据的高吞吐量访问,适用于具有大型数据集的应用程序。HDFS 放宽了一些 POSIX 要求,以启用对文件系统数据的流式访问。HDFS 最初是作为 Apache Nutch Web 搜索引擎项目的基础设施构建的。HDFS 是 Apache Hadoop Core 项目的一部分。
它能够将大文件分割成多个数据块,并将这些块分散存储在集群中的多台机器上。HDFS 提供高容错性和高吞吐量,适合处理大量数据,并支持高并发的数据访问。它主要用于支持 Hadoop 生态系统中的数据处理任务,确保数据的一致性和可扩展性。
HDFS适用场景✔
硬件故障
硬件故障是常态,而不是例外
。HDFS 实例可能由数百或数千台服务器计算机组成,每台服务器计算机都存储文件系统的一部分数据。事实上,有大量的组件,并且每个组件都有非平凡的故障概率,这意味着 HDFS总是无法正常工作的。因此,检测故障并快速、自动地从故障中恢复是HDFS的目标
。
流数据访问
HDFS需要对其数据集进行流式访问。它们不是通常在通用文件系统上运行的通用应用程序。HDFS 更多地是为批处理而设计的
,而不是供用户交互使用。重点是数据访问的高吞吐量,而不是数据访问的低延迟
。POSIX 施加了许多硬性要求,这些要求对于针对 HDFS的。几个关键领域的 POSIX 语义已被交易以提高数据吞吐率。
大型数据集
在 HDFS具有较大的数据集。HDFS为 GB 到 TB。因此,HDFS 被调整为支持大文件。它应该提供高聚合数据带宽,并扩展到单个集群中的数百个节点。它应该在单个实例中支持数千万个文件
。
简单的一致性模型
HDFS 应用程序需要对文件进行一次写入多次读取的访问模型。文件一旦创建、写入和关闭,除了 appends 和 truncates 之外,不需要更改
。支持将内容附加到文件末尾,但不能在任意时间点更新。此假设简化了数据一致性问题,并支持高吞吐量数据访问。MapReduce 应用程序或 Web 爬虫应用程序非常适合此模型。
💡这也就是为什么HDFS不支持修改,使用简单的一致性模型,保证高吞吐,而不是像mysql那样搞一堆锁(全局锁、表级锁、行级锁、间隙锁、临建锁)对目标进行锁定保证一致性。
“移动计算比移动数据更便宜”
如果应用程序请求的计算在其操作的数据附近执行,则效率会高得多。当数据集的大小很大时,尤其如此。这最大限度地减少了网络拥塞并增加了系统的整体吞吐量。假设是,
将计算迁移到更靠近数据所在的位置通常比将数据移动到应用程序运行的位置要好
。HDFS 为应用程序提供了接口,使它们能够将自身移动到更靠近数据所在的位置。
跨异构硬件和软件平台的可移植性
HDFS 被设计为可以轻松地从一个平台移植到另一个平台。这促进了 HDFS,作为大量应用程序的首选平台。
HDFS不适合的应用类型❌
低延时的数据访问需求
对延时要求在毫秒级别的应用,不适合采用HDFS。HDFS是为高吞吐数据传输设计的,因此可能牺牲延时HBase更适合低延时的数据访问。
大量小文件
文件的元数据(如目录结构,文件block的节点列表,block-node mapping)保存在NameNode的内存中, 如果有大量小文件
的情况下,整个文件系统的文件数量会受限于NameNode的内存大小
。
经验而言,一个文件/目录/文件块一般占有150字节的元数据内存空间。如果有100万个文件,每个文件占用1个文件块,则需要大约300M的内存。因此十亿级别的文件数量在现有商用机器上难以支持。
多方读写,需要任意的文件修改
HDFS采用追加append-only
的方式写入数据。不支持文件任意offset的修改。不支持多个写入器(writer)。
HDFS-架构
HDFS具有主/从架构
。HDFS 集群由单个 NameNode 组成,NameNode 是一个主服务器,用于管理文件系统命名空间并控制客户端对文件的访问。此外,还有许多 DataNode,通常集群中的每个节点一个,用于管理附加到它们运行所在的节点的存储。HDFS 公开了文件系统命名空间,并允许将用户数据存储在文件中。在内部,一个文件被拆分为一个或多个Block块
,这些块存储在一组 DataNode 中
。NameNode 执行文件系统命名空间操作,例如打开、关闭和重命名文件和目录。它还确定块到 DataNode 的映射
。DataNode 负责为来自文件系统客户端的读取和写入请求提供服务。DataNode 还根据 NameNode 的指令执行区块创建、删除和复制。
基本单位-Block
- 比如用户上传一个500M的文件,会将这个文件分割成128M单位的4个Block,如果副本为3的情况下,会将每个Block分别存储不同的3个DataNode上。
- 当数据读取时,也会按照1、2、3、4 的顺序分别到不同的DataNode上来读取。
- 最后一个128MB的块明显没有存满,但是也不能给其他Block使用,因为Block是不共享的。
HDFS-协议
- file://
- hdfs://mycluster/tmp
- webhdfs://hadoop01:50070/tmp