“ 本文档作为使用Hadoop分布式文件系统(HDFS)的起点,该系统既可以作为hadoop集群的一部分,也可以作为一个独立的通用分布式文件系统使用。”
以下内容均翻译自官方文档。
01
—
目的
本文档作为使用Hadoop分布式文件系统(HDFS)的起点,该系统既可以作为hadoop集群的一部分,也可以作为一个独立的通用分布式文件系统使用。虽然HDFS被设计成可以在许多环境中“正常工作”,但是了解HDFS的工作原理对于在特定集群上改进配置和诊断有很大帮助。
02
—
概述
HDFS是Hadoop应用上使用的最主要的分布式存储,一个HDFS集群主要是由一个管理文件系统元数据的NameNode和多个存储实际数据的DataNode组成。HDFS体系结构指南详细描述了HDFS。本用户指南主要处理用户和管理员与HDFS集群的交互。HDFS架构图描述了NameNode、DataNode和客户机之间的基本交互。客户端联系NameNode获取文件元数据或文件修改,并直接通过DataNode进行实际的文件读写操作。
以下是许多用户可能会感兴趣的一些显著特性:
包括HDFS在内的Hadoop非常适合使用商用硬件进行分布式存储和分布式处理。它具有容错性、可伸缩性,并且扩展极其简单。MapReduce以其简单性和对大型分布式应用程序集的适用性而闻名,它是Hadoop不可或缺的一部分。
HDFS具有高度可配置性,默认配置非常适合许多安装。大多数时候,配置只需要针对非常大的集群进行调优。
Hadoop是用java编写的,所有主要平台都支持。
Hadoop支持类似shell的命令来直接与HDFS交互。
NameNode和DataNode有一个内建的web服务器,通过这个web服务器可以方便的检查集群当前的状态。
HDFS经常实现新的特性和改进。以下是HDFS中有用功能的一个子集:
文件权限和身份验证。
机架感知:在调度任务和分配存储时考虑节点的物理位置。
安全模式: 用于维护的管理模式。
fsck: 诊断文件系统运行状况的实用工具,可以查找丢失的文件或块。
fetchdt: 获取授权令牌并将其存储在本地文件的一个实用工具。
Balancer: 当数据在数据节点之间分布不均衡时,用来平衡集群的实用工具。
升级和回退: 在软件升级后,如果出现意外问题,可以回滚到升级前的HDFS状态。
Secondary NameNode: 定期检查名称空间,并帮助将包含HDFS修改日志的文件的大小保持在NameNode的一定限制之内。
Checkpoint node: 定期执行命名空间和的检查点,并帮助最小化存储在NameNode上的日志的大小,其中包含对HDFS的更改。取代以前由Secondary NameNode填充的角色,尽管还没有经过严格的验证。NameNode允许同时有多个检查点节点,只要没有向系统注册的备份节点。
Backup node: 检查点节点的扩展。除了检查点之外,它还接收来自NameNode的编辑流,并维护自己的内存中的名称空间副本,该副本始终与活动的NameNode名称空间状态同步。一次只能向NameNode注册一个备份节点。
03
—
预备知识
以下文档描述了如何安装和设置一个hadoop集群:
1,Single Node Setup for first-time users.
2,Cluster Setup for large, distributed clusters.
后续我们假定读者是会设置和运行至少一个DataNode的HDFS。在本文中,NameNode和DataNode可以运行在同一台物理机器上。
04
—
Web接口
NameNode和DataNode都运行一个内部web服务器,以显示关于集群当前状态的基本信息。默认配置情况下,NameNode启动页位于http://namenode-name:9870/。它列出了集群中的数据节点和集群的基本统计信息。web界面也可以用来浏览文件系统(使用NameNode首页上的“浏览文件系统”链接)。
05
—
Shell命令
Hadoop包含各种类似shell的命令,这些命令可以直接与HDFS以及Hadoop支持的其他文件系统交互。bin/hdfs dfs -help列出了Hadoop shell支持的命令。此外,bin/hdfs dfs -help [命令名称] 显示该命令的更详细帮助。这些命令支持大多数常规的文件系统操作,如复制文件、更改文件权限等。它还支持一些HDFS特定的操作,比如更改文件副本。有关更多信息,请参阅 File System Shell Guide 。
DFSAdmin命令
bin/hdfs dfsadmin命令支持一些hdfs管理相关的操作。bin/hdfs dfsadmin -help命令列出当前支持的所有命令。如下:
-report: 报告HDFS的基本统计信息。有些信息也可以在NameNode首页上找到。
-safemode: 虽然通常不是必需的,但管理员可以手动进入或离开Safemode。
-finalizeUpgrade: 删除上次升级时对集群进行的以前备份。
-refreshNodes: 使用允许连接到namenode的datanode集更新namenode。默认情况下, namenode 会重新读取定义在dfs.hosts文件中的datanode主机名,在dfs.hosts中定义的dfs.hosts.exclude 主机也是集群的一部分datanode.如果dfs.hosts中定义有datanode条目,那么只有这些datanode才被允许向namenode注册. 那些定义在dfs.hosts.exclude中的datanode是要被停止使用的.或者,如果dfs.namenode.hosts.provider.classname被设置为org.apache.hadoop.hdfs.server.blockmanagement.CombinedHostFileManager。所有包含和排除主机都在dfs.hosts定义的JSON文件中指定。当数据节点中的所有副本都被复制到其他数据节点时,数据节点完成退役。退役节点不会自动关闭,也不会选择写入新的副本。
-printTopology: 打印集群的拓扑结构。显示由NameNode查看的连接到轨道的机架和数据节点树。
06
—
Secondary NameNode
NameNode将对文件系统的修改以edits日志的方式追加存储在本地文件系统文件中。当NameNode启动时,它从文件fsimage中读取HDFS的状态,然后应用edits日志文件中的编辑项。然后,它将新的HDFS状态写入fsimage,并以一个空的编辑文件启动正常操作。由于NameNode只在启动时合并fsimage和edits文件,因此在繁忙的集群中,随着时间的推移,edits日志文件可能会变得非常大。较大的edits文件的另一个副作用是,下一次重新启动NameNode需要更长的时间。
Secondary NameNode定期合并fsimage和edits日志文件,并将edits日志大小限制在一定范围内。它通常运行在与主NameNode不同的机器上,因为它的内存需求与主NameNode的顺序相同。
Secondary NameNode上检查点进程的触发是由两个配置参数控制。
dfs.namenode.checkpoint.period: 默认设置为1小时,指定两个连续检查点之间的最大延迟。
dfs.namenode.checkpoint.txns: 默认设置为1 million,在NameNode上定义将强制执行紧急检查点的未检查点事务的数量,即使检查点周期尚未到达。
Secondary NameNode将最新的检查点存储在一个目录中,该目录的结构与主NameNode的目录相同。因此,如果需要,主NameNode可以随时读取校验点image。
07
—
检查点节点
NameNode使用两个文件来保存它的名称空间:fsimage和edits,前者是名称空间的最新检查点,后者是记录检查点之后名称空间变化的日志。当NameNode启动时,它会合并fsimage和edits日志,以提供文件系统元数据的最新视图。然后NameNode用新的HDFS状态覆盖fsimage,并开始一个新的edits日志。
检查点节点定期创建名称空间的检查点。它从活动的NameNode下载fsimage并进行编辑,在本地合并它们,然后将新图像上传回活动的NameNode。检查点节点通常运行在与NameNode不同的机器上,因为它的内存需求与NameNode的顺序相同。检查点节点由配置文件中指定的节点上的bin/hdfs namenode -checkpoint启动。
检查点(或备份)节点及其相应的web接口的位置是通过dfs.namenode.backup.address和dfs.namenode.backup.http-address配置变量配置的。
检查点节点上检查点进程的触发是由两个配置参数控制。
dfs.namenode.checkpoint.period: 默认设置为1小时,指定两个连续检查点之间的最大延迟.
dfs.namenode.checkpoint.txns: 默认设置为1 million,在NameNode上定义将强制执行紧急检查点的未检查点事务的数量,即使检查点周期尚未到达。
检查点节点将最新的检查点存储在与NameNode目录结构相同的目录中。这使得NameNode在必要时总是可以读取检查点image。详情参见”Import checkpoint”小节。
可以在集群配置文件中指定多个检查点节点。
08
—
备份节点
备份节点提供与检查点节点相同的检查点功能,并在内存中维护着始终与活动NameNode状态同步的文件系统名称空间的最新副本。除了从NameNode接受文件系统edits日志流并将其持久化到磁盘之外,备份节点还将这些edits应用到内存中自己的名称空间副本中,从而创建名称空间的备份。
备份节点不需要从激活的NameNode下载fsimage和edits文件来创建检查点,而检查点节点或Secondary NameNode则需要这样做,因为它在内存中已经拥有了最新的名称空间状态。备份节点检查点过程更有效,因为它只需要将名称空间保存到本地fsimage文件中并重置edits。
由于备份节点在内存中维护名称空间的副本,因此它的RAM需求与NameNode相同。
NameNode每次支持一个备份节点。如果正在使用备份节点,则不能注册任何检查点节点。将来会支持同时使用多个备份节点。
备份节点的配置方式与检查点节点相同。它以bin/hdfs namenode -backup开始。
备份(或检查点)节点及其相应的web接口的位置是通过dfs.namenode.backup.address和dfs.namenode.backup.http-address配置变量配置的。
使用备份节点提供了在不使用持久存储的情况下运行NameNode的选项,并将持久化namespace 状态的所有责任委托给备份节点。为此,请使用 -importCheckpoint 选项启动 NameNode,同时为 NameNode 配置指定类型为 ds.namenode.edit.dir 的非持久存储目录。
09
—
Import Checkpoint
如果image的所有其他副本和edits文件丢失,可以将最新的检查点导入到NameNode。为了做到这一点,我们应该:
在dft .namenode.name.dir配置变量中创建一个空目录;
在配置变量
dfs.namenode.checkpoint.dir中指定检查点目录的位置;
并使用-importCheckpoint选项启动NameNode。
NameNode将从
dfs.namenode.checkpoint.dir目录上传检查点,然后将其保存到dfs.namenode.name.dir中设置的NameNode目录. 如果dfs.namenode.name.dir中包含合法image,NameNode将失败. NameNode验证dfs.namenode.checkpoint.dir中的image是否一致的,但不以任何方式修改它。
10
—
平衡器Balancer
HDFS数据可能并不总是跨DataNode均匀地放置。一个常见的原因是向现有集群添加新的数据节点。在放置新块时(文件的数据存储为一系列块),NameNode在选择接收这些块的datanode之前会考虑各种参数。其中一些考虑因素是:
以将块的一个副本与写入块的节点保持在同一节点上;
需要在机架上分散不同的块副本,以便集群在失去整个机架后能够存活;
其中一个副本通常被放在与写入文件的节点相同的机架上,这样就减少了跨机架的网络I/O;
将HDFS数据均匀地分布在集群中的数据节点上。
由于多种竞争考虑,数据可能不能均匀地跨数据节点放置。HDFS为管理员提供了一个工具,用于分析块的位置,并跨DataNode重新分配数据。在HADOOP-1652上有一个关于平衡器的简单管理员指南。
(未完待续)




