天天看点

HDFS 简单介绍

前面介绍MapReduce,现在来了解一下HDFS -- Hadoop Distributed File System

HDFS 作为Hadoop集群的一部分,同时也可以独立的分布式文件系统使用。HDFS的¨just work¨设计理念在很多环境中都适用,了解HDFS知识对集群配置HDFS和诊断HDFS有很大的帮助。

概述

HDFS是Hadoop应用中的首选分布式文件存储系统。一个HDFS 集群包括一个管理文件系统元数据的NameNode,和存储数据的DataNode。

下面是用户比较感兴趣的几个特性:

1 Hadoop包含HDFS,非常适合在通用的硬件上进行分布式存储和分布式运算。Hadoop具有容错性,规模性和易扩展性。MapReduce在大型的分布式应用中非常的简单易用,同时也是Hadoop的一部分。

2 HDFS的默认配置能满足大多数用户的安装。在大多数时候,只有在非常大的集群中才需要编写配置文件。

3 Hadoop是用JAVA编写的,大多数主要平台都支持。

4 Hadoop支持 SHELL-LIKE 命令与HDFS直接交互。

5 NameNode和DataNodes可以使用web网页的方式展示集群的当前状态

6 新的特性和改进在HDFS中得以实现。以下是HDFS的一些有用的特性。

1) 文件的权限和认证

2) Rack awareness:统计节点的物理位置能够更好的分配task和确存储容量。

3) SafeMode:管理员配置模式。

4) fsck:一种诊断文件系统健康和找到丢失的文件或者blocks块的工具。

5) fetchdt:获取 Delegation Token 并把它以文件的方式把它存储在本地系统中。

6) Rebalancer:当数据不平衡的分布到DataNodes时进行集群的平衡。

7) Upgrade and rollback: 在软件升级后出现错误,HDFS可以回滚到升级之前的状态。

8) Secondary NameNode:周期性的执行NameNode命名空间的的checkpoints,有助于保持HDFS修改日志文件的大小。

Web 接口

NameNode和DataNode 分别运行在一个内部的web server中,这样以便展示当前集群运行状态的基本信息。默认配置里,NameNode的主页是http://namenode-name:50070。该主页列出了集群中的DataNode和集群的基本统计信息。同时该网页通常也用于文件系统的浏览。

Shell 命令

Hadoop包含很多shell-like的命令用于直接和HDFS和其他的Hadoop支持的文件系统进行交互。可以使用 bin/hdfs dfs -help 列出全出hadoop shell支持的全部命令。另外,bin/hdfs dfs -help命令中的 -name 可以展示一个命令的详细信息。这些命令支持大多数普通的文件系统的操作例如文件的复制和修改文件的权限等。同时也支持一些HDFS特殊的操作例如修改文件的副本数量。

DFSAdmin 命令

bin/hadoop dfsadmin 命令支持一些HDFS 管理员相关操作。Bin/hadoop dfsadmin -help命令可以列出全部支持的命令:

1)-report:报告HDFS基本统计信息。有些信息可以直接在NameNode的web界面中直接看到。

2)-safemode:通常不需要,管理员可以打开和关闭safemode模式。

3)-finalizeUpgrefe:删除最近一次升级前的集群备份。

4)-refreshNode:让集群中的主机主动将自己的状态与namenode进行交互。重新读取配置的修改文件,可以通过dfs.hosts 和 dfs.host.exclude 和读取全部的(hostnames)。

Secondary NameNode

NameNode 存储整个文件系统的修改日志,该修改日是以本地文件appended的方式进行记录。当NameNode启动时,会通过镜像文件读取HDFS状态,fsimage,然后使用edits读取日志文件。然后写入新的HDFS状态到fsimage,然后使用一个空白edits文件开始常规的操作。由于NameNode合并fsimage和编写记录日志文件只在启动的时候进行,edits log 文件非常大会出现超时。另外一个超大的edits文件在NameNode下次重启的时候需要更多的时间。

Secondary NameNode 合并fsimage 以及定期的处理edits log日志文件并保持edits log日志文件在限定的大小方位内。Secondary NameNode通常使用独立的机器运行。Secondary NameNode通过 bin/start-dfs.sh启动,在conf/masters 文件中指定节点作为Secondary NameNode。

在Secondary NameNode开始处理checkpoint时,有以下2个配置参数进行控制:

1)fs.checkpoint.period,默认是1小时周期执行,可以指定相邻两次的安全checkpint的执行时间周期。

2)fs.checkpoint.size,默认是64MB。定义edits log的文件大小来紧急的checkpoint即使在相邻的两次checkpoint时间还未到达。

Secondary NameNode存储着与 primary NameNode 最近一次文件路径一样的checkpoint。所以这个 checkpoint镜像文件总是可以被primary NameNode读取。

Import Checkpoint 

最近一次checkpoint可以导入到NameNode,如果在其他全部镜像和edits 文件全部丢失的时候。为了导入,我们应该:

1)在dfs.name.dir中创建一个可用的空目录文件。

2)在fs.checkppoint.dir中指定checkpoint的文件路径。

3)启动NameNode命令,并带上 -importCheckpoint选项。

NameNode将会从fs.checkpoint.dir路径里加载checkpoint,然后保存到Namede的dfs.name.dir文件路径中。如果一个合法的iamge镜像在dfs.name.dir目录中存在,将会失败操作。NameNode会验证fs.checkpoint.dir目录中的镜像文件是否一致,但是不能以任何方式进行修改。

Rebalancer

HDFS的数据不可能在DataNode中均匀的分布。如我们在现有的集群中添加一个新的DataNode节点。当填充新的blocks时(文件的数据以blocks序列被存储),DataNodes在选择接收这些blocks之前,NameNode需要如下参数信息:

1)策略来保证相同副本的一个节点作为写block。

2)需要将副本存储在不同的机架上,来保证集群能找回整机机架丢失的数据。

3)通常在同一机架中的文件副本由其中的一个副本来替换其他的副本,这样可以减少跨机架的网络I/O量。

4)在机群中均匀的分布HDFS数据到DataNodes。

由于要考虑多重竞争,数据可能不会均匀的分布到DataNodes中。HDFS提供一个管理员工具来分析block使用率和DataNode间数据的负载均衡。

Rack Awareness

     大型的hadoop集群一般部署在多机架环境中,网络传输会在同一机架的不同节点间以及不同机架的不同节点间。另外NameNode会将block副本分布多机架中来提高容错率。Hadoop 集群管理员可以通过配置 dfs.network.script 来决定那个节点属于那个机架。当script脚本配置了,每个节点运行该script脚本来确定它的rack id。默认安装后,全部节点属于同一机架。

Safemode

当NameNode启动时,会从fsimage镜像加载文件系统状态和记录日志文件。然后等待DataNodes来报告他们的blocks从而避免过早的创建blocks副本即使集群里存在足够的副本数。该阶段里NameNode处于 safemode模式。Namenode的Safemode模式在HDFS集群中是 read-only只读模式,不容许任何文件系统或bloks的修改。通常NameNode在DataNodes报告大多数文件系统的blocks可用后就会自动离开Safemode模式。如果需要,HDFS可以通过明确使用 bin/hadoop dfsadmin -safemode命令来切换到safemode模式。NameNode的web网页会显示safemode的开启或关闭状态。更多详细的描述和配置信息可以通过JAVADoc的NameNode.setSafeMode()得到。

fsck

HDFS支持使用fsck命令来检查不一致问题。其设计是用来报告各种文件问题,例如:一个文件丢失的blocks或者blocks的复制。不想传统的本地系统的fsck工具,该命令不会纠正它探测到的错误。通常NameNode自动修正大多数可以纠正的错误。报告期间默认情况下fsck会忽略打开的文件但是会提供一个选项去选择全部文件。HDFS的fsck命令不是hadoop shell命令。它可通过bin/hadoop fsck来运行。

fetchdt

HDFS支持 fetchdt命令来获取令牌环,并将它以文件的方式保存到本地系统中。该令牌可以用于以后没有安全策略的客户端访问有安全策略的服务器。可通过使用RPC或HTTPS(通过Kerberos)得到令牌,然后在运行之前得到需提供Kerberos凭证。HDFS的fetchdt命令不是hadoop shell命令。它通过bin/hadoop fetchdt DTfile运行。当你获取到令牌后可以不需要kerberos 凭证来运行HDFS命令,但需要指定HADOOP_TOKEN_FILE_LOCATION环境变量给令牌环文件。

Recovery Mode

一般情况下你需要配置metadata元数据到多个存储路径下。当某一个存储路径失效或不可用,你可以通过其他路径来读取metadata元数据。

然而,如果metadata元数据只存储到一个路径下,并且失效了,你该怎么办?在这种情况下,有一个特殊的NameNode启动模式叫做Recovery mode恢复模式,恢复模式允许你恢复大多数数据。

你可以使用恢复模式启动NameNode:namenode -recover

当在recovery mode中,Namenode会通过命令行的方式与你交互,并有你决定用什么方式来恢复你的数据。

如果你不想使用prompted的方式,可以使用 -force选项来屏蔽。这个选项始终默认选择第一选项来完成数据恢复任务。

因为Recovery mode会丢失你的数据,你应该总是在恢复之前保存好你edits log日志文件和fsimage镜像文件。

Upgrade and Rollback

在现有的集群上更新hadoop,就像任何软件更新一样,会可能出现一些新的bugs或者对现有应用和潜在的不相容的改变。HDFS允许管理员可以回到早期的hadoop版本,以及让所有节点回滚到更新前的状态。HDFS可以在某一个时间点上进行备份。在更新前,管理员需要使用bin/hadoop -finalizeUpgrade 命令来删除现有的备份。以下简单描述更新的过程:

1)在更新升级hadoop软件之前,使用dfsadmin -upgradeProgress status来判断是否集群需要被finalized。

2)停止集群和分发hadoop新版本。

3)运行新的版本 -upgrede 选项(bin/start-dfs.sh -upgrade)

4)大多数时间,集群工作的很好。一旦新的HDFS运行的非常好(或许几天的操作之后),完成升级。请注意,直到集群升级完成,删除升级前的文件是没有真正在DataNodes中释放磁盘空间的。

5)如果需要回滚到以前的版本:停止集群并分发hadoop的早期版本;使用rollback选项开始集群(bin/start-dfs.h -rollback)。

File Permissions and Security 

文件权限类似与linux权限设定。目前,简单文件权限的安全是被限制的。用户启动NameNode后,该用户将被视为HDFS的超级用户。未来的HDFS版本将会支持类似与Kerberos的网络认证协议来验证用户和数据传输加密。

Scalability

Hadoop目前能在几千台节点上运行。HDFS每个集群众只有一个NameNode。目前NameNode的内存是扩展性的瓶颈。在大型的集群里,存储在HDFS中的文件大小不断平均增加,集群的规模也在增加,但是NameNode的内存却没有增加。默认的配置可能不适合非常大的集群。

继续阅读