hadoop分布式文件系统
HDFS是Apache Software Foundation项目和Apache Hadoop项目的子项目(请参阅参考资料 )。 Hadoop是存储诸如TB和PB之类的大量数据的理想选择,并且使用HDFS作为其存储系统。 HDFS使您可以连接包含在其上分布数据文件的群集中的节点 (商品个人计算机)。 然后,您可以将数据文件访问和存储为一个无缝文件系统。 对数据文件的访问以流方式处理,这意味着应用程序或命令直接使用MapReduce处理模型执行(同样,请参见参考资料 )。
HDFS是容错的,并提供对大数据集的高吞吐量访问。 本文探讨了HDFS的主要功能,并提供了HDFS体系结构的高级视图。
HDFS与其他分布式文件系统有许多相似之处,但是在几个方面有所不同。 HDFS的一个明显区别是HDFS的“一次写入多次读取”模型,该模型放宽了并发控制要求,简化了数据一致性,并实现了高吞吐量访问。
HDFS的另一个独特属性是这样的观点:通常最好将处理逻辑放在数据附近,而不是将数据移至应用程序空间。
HDFS严格限制一次只能将数据写入一个写入器。 字节总是附加在流的末尾,并且保证字节流按写入顺序存储。
HDFS有许多目标。 以下是一些最著名的:
HDFS为应用程序提供了接口,以将它们移到数据所在的位置,如以下部分所述。
您可以通过多种不同方式访问HDFS。 HDFS为Java API提供了本机Java™应用程序编程接口(API)和本机C语言包装器。 此外,您可以使用Web浏览器浏览HDFS文件。
表1中描述的应用程序还可用于与HDFS交互。
应用 | 描述 |
---|---|
FileSystem(FS)外壳 | 类似于常见Linux®和UNIX®shell(bash,csh等)的命令行界面,允许与HDFS数据进行交互。 |
DFS管理员 | 可用于管理HDFS群集的命令集。 |
fsck |
Hadoop命令/应用程序的子命令。 您可以使用fsck 命令检查与文件的不一致情况,例如丢失的块,但不能使用fsck 命令来纠正这些不一致情况。 |
名称节点和数据节点 | 这些服务器具有内置的Web服务器,管理员可以通过它们检查集群的当前状态。 |
HDFS具有简单而强大的体系结构,因此具有令人期待的非凡功能集。
HDFS由文件和目录所驻留的节点的互连群集组成。 HDFS群集由一个称为NameNode
节点组成,该节点管理文件系统名称空间并管理客户端对文件的访问。 另外,数据节点( DataNodes
)将数据存储为文件内的块。
在HDFS中,一个给定名称的节点管理文件系统名称空间操作,例如打开,关闭和重命名文件和目录。 名称节点还将数据块映射到数据节点,该数据节点处理来自HDFS客户端的读取和写入请求。 数据节点还根据管理名称节点的指令创建,删除和复制数据块。
图1说明了HDFS的高级体系结构。
如图1所示,每个群集包含一个名称节点。 这种设计简化了用于管理每个名称空间和仲裁数据分发的简化模型。
名称节点和数据节点是设计为在异构操作系统上的商品计算机上以解耦方式运行的软件组件。 HDFS是使用Java编程语言构建的; 因此,任何支持Java编程语言的机器都可以运行HDFS。 典型的安装群集具有一台专用计算机,该计算机运行一个名称节点,并可能运行一个数据节点。 集群中的每台其他机器都运行一个数据节点。
数据节点不断循环,向名称节点询问指令。 名称节点不能直接连接到数据节点。 它只是从数据节点调用的函数中返回值。 每个数据节点都维护一个开放的服务器套接字,以便客户端代码或其他数据节点可以读取或写入数据。 名称节点知道此服务器套接字的主机或端口,该节点将信息提供给感兴趣的客户端或其他数据节点。 有关数据节点,名称节点和客户端之间的通信的更多信息,请参见通信协议侧栏。
名称节点维护和管理对文件系统名称空间的更改。
HDFS支持传统的分层文件组织,用户或应用程序可以在其中创建目录并将文件存储在其中。 文件系统名称空间层次结构与大多数其他现有文件系统相似。 您可以创建,重命名,重定位和删除文件。
HDFS还支持第三方文件系统,例如CloudStore和Amazon Simple Storage Service(S3)(请参阅参考资料 )。
HDFS复制文件块以实现容错功能。 应用程序可以在创建文件时指定其副本数,此后可以随时更改此数目。 名称节点做出有关块复制的所有决定。
HDFS使用智能副本放置模型来提高可靠性和性能。 优化副本的放置使HDFS在大多数其他分布式文件系统中独树一帜,并且通过有效利用网络带宽的机架感知副本放置策略得以促进。
大型HDFS环境通常跨多个计算机安装运行。 不同安装中的两个数据节点之间的通信通常比同一安装中的数据节点要慢。 因此,名称节点尝试优化数据节点之间的通信。 名称节点通过其机架ID标识数据节点的位置。
HDFS的主要目标之一是支持大文件。 典型的HDFS块的大小为64MB。 因此,每个HDFS文件由一个或多个64MB块组成。 HDFS尝试将每个块放置在单独的数据节点上。
在HDFS上处理文件与其他文件系统所使用的过程相似。 但是,由于HDFS是显示为单个磁盘的多计算机系统,所以所有在HDFS上操纵文件的代码都使用org.apache.hadoop.fs.FileSystem
对象的子类(请参阅参考资料 )。
清单1中显示的代码说明了HDFS上的典型文件创建过程。
byte[] fileData = retrieveFileDataFromSomewhere();
String filePath = retrieveFilePathStringFromSomewhere();
Configuration config = new Configuration(); // assumes to automatically load
// hadoop-default.xml and hadoop-site.xml
org.apache.hadoop.fs.FileSystem hdfs = org.apache.hadoop.fs.FileSystem.get(config);
org.apache.hadoop.fs.Path path = new org.apache.hadoop.fs.Path(filePath);
org.apache.hadoop.fs.FSDataOutputStream outputStream = hdfs.create(path);
outputStream.write(fileData, 0, fileData.length);
客户端在HDFS中创建文件时,首先将数据缓存到临时本地文件中。 然后,它将随后的写入重定向到临时文件。 当临时文件积累了足够的数据以填充HDFS块时,客户端会将其报告给名称节点,该名称节点会将文件转换为永久数据节点。 然后,客户端关闭临时文件,并将所有剩余数据刷新到新创建的数据节点。 然后,名称节点将数据节点提交到磁盘。
当客户端累积完整的用户数据块时,它会从名称节点中检索包含该块副本的数据节点列表。 然后,客户端将整个数据块刷新到副本列表中指定的第一个数据节点。 当节点接收到大块数据时,它将它们写入磁盘,然后将副本转移到列表中的下一个数据节点。 下一个数据节点执行相同的操作。 重复此流水线过程,直到满足复制因子。
HDFS的一个重要目标是可靠地存储数据,即使在名称节点,数据节点或网络分区内发生故障时也是如此。
检测是HDFS克服故障的第一步。 HDFS使用心跳消息来检测名称和数据节点之间的连接。
有几件事会导致名称节点和数据节点之间的连接丢失。 因此,每个数据节点都会向其名称节点定期发送心跳消息,因此,如果后者停止接收它们,则可以检测到连接中断。 名称节点标记为无效数据节点,它们不响应心跳,并且拒绝向它们发送进一步的请求。 HDFS客户端无法再从该节点上将已存储在死节点上的数据用于该节点,该节点已从系统中有效删除。 如果节点的死亡导致数据块的复制因子降至其最小值以下,则名称节点将启动其他复制,以使复制因子恢复正常状态。
图2说明了发送心跳消息的HDFS过程。
HDFS数据块可能并不总是在数据节点之间均匀地放置,这意味着一个或多个数据节点的已用空间可能未被充分利用。 因此,HDFS支持使用各种模型重新平衡数据块。 如果数据节点上的可用空间太低,则一种模型可能会自动将数据块从一个数据节点移动到另一数据节点。 如果对给定文件的需求突然增加,则另一个模型可以动态创建其他副本并重新平衡群集中的其他数据块。 HDFS还提供了hadoop balance
命令来执行手动重新平衡任务。
进行重新平衡的一个常见原因是在群集中添加了新的数据节点。 在放置新块时,名称节点在选择数据节点以接收它们之前会考虑各种参数。 一些注意事项是:
HDFS的群集平衡功能只是它用来维持其数据完整性的一种机制。 接下来讨论其他机制。
HDFS竭尽全力确保跨集群的数据完整性。 通过将计算的校验和存储在与实际数据相同的名称空间中的单独的隐藏文件中,它对HDFS文件的内容使用校验和验证。 客户端检索文件数据时,可以验证接收到的数据是否与关联文件中存储的校验和匹配。
HDFS命名空间使用每个名称节点保存的事务日志进行存储。 文件系统名称空间以及文件块映射和文件系统属性存储在名为FsImage的文件中。 初始化名称节点后,它将读取FsImage文件以及其他文件,并应用在这些文件中找到的事务和状态信息。
名称节点使用称为EditLog的日志文件来永久记录HDFS文件系统元数据中发生的每个事务。 如果EditLog或FsImage文件损坏,则它们所属的HDFS实例将停止运行。 因此,名称节点支持FsImage和EditLog文件的多个副本。 有了这些文件的多个副本后,对这两个文件的任何更改都会同步传播到所有副本。 重新启动名称节点后,它将使用FsImage和EditLog的最新一致版本进行初始化。
HDFS为文件和目录实现了一种权限模型,该模型与可移植操作系统接口(POSIX)模型有很多共同点; 例如,每个文件和目录都与一个所有者和一个组相关联。 HDFS权限模型支持读(r),写(w)和执行(x)。 由于HDFS中没有文件执行的概念,因此x权限具有不同的含义。 简而言之,x属性指示访问给定父目录的子目录的权限。 文件或目录的所有者是创建文件或目录的客户端进程的标识。 该组是父目录的组。
HDFS最初计划支持快照,该快照可用于将损坏的HDFS实例回滚到以前的状态。 但是,目前已经列出了HDFS对快照的支持。
Hadoop是一个Apache Software Foundation分布式文件系统和数据管理项目,其目标是存储和管理大量数据。 Hadoop使用一种称为HDFS的存储系统来连接称为集群的商用个人计算机,这些集群包含在分布有数据块的集群中。 您可以使用MapReduce处理模型将数据块作为一个无缝文件系统进行访问和存储。
HDFS与其他分布式文件系统共享许多共同的功能,同时支持一些重要的区别。 HDFS的一个显着差异是HDFS的一次写入多次读取模型,该模型放宽了并发控制要求,简化了数据一致性,并实现了高吞吐量访问。
为了提供优化的数据访问模型,HDFS被设计为在数据附近放置处理逻辑,而不是在应用程序空间附近放置数据。
翻译自: https://www.ibm.com/developerworks/web/library/wa-introhdfs/index.html
hadoop分布式文件系统