HDFS用户指南-02

1、前言

本文写于2018年02月份,以当前HDFS版本2.9.0为主,主要参考为官方文档,其中加入了一些自己的理解,如有不对之处,还请多多指教,感谢!

HDFS既可以作为Hadoop集群的一部分,也可以作为独立的通用分布式文件系统来使用。虽然HDFS可以在多环境中轻松简单的运行起来,但是去了解一些HDFS的知识,可以极大地帮助您在集群上进行配置、调优和诊断。

2、概览

HDFS是Hadoop主要使用的分布式存储。一个HDFS集群,主要由管理文件系统元数据的NameNode和存储实际数据的DataNode组成。在上一篇文章中已经介绍了HDFS的架构。这一篇,主要介绍普通用户和管理员如何使用和管理HDFS群集。HDFS架构图中介绍了NameNode,DataNode和客户端之间的一些基本交互流程。客户首先从NameNode获取文件元数据信息,然后直接在DataNode上执行实际的文件I/O操作。

以下是HDFS的一些显着特性:

  • Hadoop平台,包括HDFS组件,是非常适合运行在普通的商用硬件上的,来进行分布式存储和计算。它具有很高的容错性,可扩展性。其中, MapReduce以其简单和适用于大数据规模的分布式处理程序而闻名,也是Hadoop不可或缺的一部分。

  • HDFS可配置性非常灵活,一般使用默认配置安装即可。如果是非常大的集群,才有必要去更改一些配置。

  • Hadoop使用Java编写,支持主流的操作系统。

  • Hadoop支持类似shell的命令来直接与HDFS进行交互。

  • NameNode和Datanodes节点内置了Web服务器,可以轻松的去检查群集的当前状态。

    • HDFS会定期优化和发布新功能。以下是HDFS的部分特性:

    • 文件权限和认证。

    • 机架感知(Rack awareness):在调度任务和分配存储时会去考虑节点的物理位置。

    • 安全模式(Safemode):维护的管理HDFS的一种模式。

    • fsck命令:用于诊断文件系统健康状况的实用程序,也可以用来查找丢失的文件或块。

    • fetchdt命令:用于获取DelegationToken(属于HDFS安全机制的内容,做认证使用)并将其存储在本地系统文件中的实用程序。

    • Balancer命令:当数据不均匀分布在DataNode中时,可以使用该命令平衡集群中的数据。

    • 升级和回滚:软件升级后,如果出现意外问题,可以回滚到HDFS之前的状态。

    • Secondary NameNode:对命名空间定期执行检查点操作。它可以合并NameNode的edit logs到fsimage文件中,有助于将HDFS修改日志的文件大小保持在NameNode的特定范围内。

    • 检查点节点(Checkpoint node):定期对命名空间执行检查点操作。功能和Secondary NameNode类似。建议直接使用Checkpoint node。NameNode同时允许多个Checkpoint节点。

    • 备份节点(Backup node):检查点节点的扩展。除了检查点功能之外,它还接收来自NameNode的实时变更数据,把它维护其自己的内存中,该副本始终与活动的NameNode保持同步。一次只能向NameNode注册一个备份节点。

3、先决条件

以下文档介绍了如何安装和设置Hadoop集群:

  • Single Node Setup:单节点安装步骤

  • Cluster Setup:适用于大型分布式集群

    本文的其余部分假设用户能够安装,并且运行至少一个DataNode的HDFS。NameNode和DataNode可以在同一台物理机器上运行。

4、Web接口

NameNode和DataNode各自在嵌入了一个Web服务器,用来显示集群的基本信息,和当前的状态信息。如果使用默认配置,NameNode首页地址为:http://namenode-name:50070/。它列出了群集中所有的DataNode解点,和群集的基本统计信息。Web界面也可用于浏览HDFS上到文件(点击NameNode首页上的“浏览文件系统”链接)。

5、Shell 命令

Hadoop包含各种类似于shell的命令,可直接与HDFS进行交互。如命令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的Web页上也提供了这些信息中的一部分。

  • -safemode:通常不需要执行这个命令,执行此命令可以离开安全模式。

  • -finalizeUpgrade: 删除上次升级期间所做群集所做的备份

  • -refreshNodes: 更新Datanode连接。默认情况下,Namenodes会重新读取文件dfs.hosts、dfs.hosts.exclude中的数据节点主机列表。dfs.hosts中定义是集群数据节点。如果dfs.hosts中存在记录,则只允许记录中的主机注册namenode到。 dfs.hosts.exclude中的条目是需要下线的datanode。同时,如果参数dfs.namenode.hosts.provider.classname设置为org.apache.hadoop.hdfs.server.blockmanagement.CombinedHostFileManager,则在由dfs.hosts定义的JSON文件中指定所有包含和排除主机。 当节点上所有副本数据都复制到其他节点时,Datanodes才会完成停用。 下线的节点不会自动关闭,也不会再写入新副本。

  • -printTopology :打印群集的拓扑图。以树形的方式,显示集群的机架和节点列表。

关于命令的更多用法,参考链接dfsadmin.

6、Secondary NameNode

NameNode会去记录HDFS文件修改的记录,并记录到本地文件系统edits文件中。当NameNode启动时,它会从fsimage映像文件中去读取HDFS状态、应用edits日志文件中的操作记录。然后将新的HDFS状态写入fsimage文件中,最后使用空的edits文件开始进行正常的操作。由于NameNode仅在启动时,对fsimage和edits进行合并操作,edits文件可能会在繁忙的群集上随着时间变得越来越大。不好之处是下次重新启动NameNode需要花费更长的时间来进行合并操作。

基于上述原因,secondary NameNode的作用是,通过启动一个检查点(Checkpoint)的进程,去定期合并fsimage和edits文件,并将edits文件大小保持在限制范围内。它通常在与主NameNode不同的机器上运行,因为它同样对机器内存有一定的要求。

Secondary NameNode上的Checkpoint进程的启动,是由两个配置参数控制的:

  • dfs.namenode.checkpoint.period:默认设置为1小时来指定两个检查点之间的最大间隔时间

  • dfs.namenode.checkpoint.txns:默认设置为100万,在距上一次检查点之后,还未做checkpoint事务数量,这是强制紧急检查点,即使dfs.namenode.checkpoint.period中设置的间隔时间还没有达到。

secondary NameNode将最新的检查点存储在与主NameNode相同的目录中。这样检查点点映像文件(fsimage)总是可以随时被NameNode读取。

secondary NameNode相关命令用法,请参阅secondarynamenode

7、检查点节点(Checkpoint Node)

NameNode使用两个文件来保存它的命名空间:fsimage(包含着上一次检查点的namespace信息和edits操作信息) 和edits日志(上一次检查点之后的新记录)。当NameNode启动时,它会去合并fsimage和edits日志,得到最新的文件系统元数据。启动之后,NameNode用新的HDFS状态覆盖fsimage文件,并将后续操作记录到新的edits日志文件中。

检查点节点(Checkpoint Node)定期对命名空间(namespace)生成检查点。它从活动的NameNode(active NameNode)上下载fsimage和edits日志到本地进行合并,并将新合并的映像(image )上传回活动的NameNode上。 它通常在与主NameNode运行在不同的机器上,因为它同样对机器内存有一定的要求。如果需要启动检查点节点,首先在配置文件中指定的节点,然后执行bin/hdfs namenode -checkpoint即可。

Checkpoint(或Backup)节点及其相应的Web界面,可以通过dfs.namenode.backup.addressdfs.namenode.backup.http-address进行配置。

Checkpoint node节点上的Checkpoint进程的启动,是由两个配置参数控制的:

  • dfs.namenode.checkpoint.period:默认设置为1小时来指定两个检查点之间的最大间隔时间

  • dfs.namenode.checkpoint.txns:默认设置为100万,在距上一次检查点之后,还未做checkpoint事务数量,这是强制紧急检查点,即使dfs.namenode.checkpoint.period中设置的间隔时间还没有达到。

Checkpoint node将最新的检查点存储在与主NameNode相同的目录中。这样检查点点映像文件(fsimage)总是可以随时被NameNode读取。

可以在群集配置文件中指定多个检查点节点。

Checkpoint Node相关命令用法,请参阅namenode

8、备份节点(Backup Node)

备份节点提供与检查点节点功能类似,都有执行检查点的方法,以及在内存中维护着一份,始终与活动NameNode状态同步的命名空间文件的最新副本。除了接受来自活动NameNode的edits日志流,并将其保存到磁盘之外,备份节点还将这些日志应用到它自己的内存中的命名空间的副本中,从而去创建命名空间的备份。

备份节点不需要从活动的NameNode下载fsimage和edits文件,用来创建检查点。只有Checkpoint Node或Secondary NameNode会需要这些文件,因为它已经有一份最新的命名空间数据在内存中。Backup node的检查点进程效率更高,因为它只需将命名空间的数据保存到本地的fsimage文件上,并重置edits文件。

由于备份节点在内存中维护命名空间的副本,因此其内存要求与NameNode相同。

NameNode一次只支持一个备份节点。如果正在使用备份节点,则不会注册任何检查点节点(Checkpoint nodes)。将来会支持同时使用多个备份节点。

备份节点的配置方式与检查点节点相同。执行bin/hdfs namenode -backup启动。

备份(或检查)节点及其附带的Web界面的位置通过dfs.namenode.backup.addressdfs.namenode.backup.http-address参数,进行配置。

使用备份节点后,提供了一种运行NameNode但不使用持久性存储(设备断电后保留数据,有时被称为非易失性存储器。)的选择,备份节点承担着持久化命名空间状态的任务。如果有这样的场景,使用-importCheckpoint选项来启动NameNode,并在namenode配置中,不配置dfs.namenode.edits.dir参数的持久化存储目录。

有关创建备份节点和检查点节点的的完整讨论,请参阅HADOOP-4539。有关命令的用法,请参阅namenode

9、导入检查点

如果NameNode的fsimage和edits日志都丢失了,可以将最新的检查点数据导入到NameNode中。为了做到这一点,应该:

  • 在参数dfs.namenode.name.dir中配置变量,指定一个空目录(需要提前创建好);

  • 在参数dfs.namenode.checkpoint.dir中指定检查点目录位置;

  • 最后使用-importCheckpoint选项来启动NameNode。

    NameNode将从dfs.namenode.checkpoint.dir目录中上传检查点的数据,然后将其保存到NameNode的dfs.namenode.name.dir的目录中。如果dfs.namenode.name.dir目录中,已经存在一个合法的映像文件,则NameNode将会启动失败。 NameNode会去验证dfs.namenode.checkpoint.dirdfs.namenode.name.dir中的映像文件是否一致,但不会修改它。

    有关命令的用法,请参阅namenode

10、平衡(Balancer)

HDFS数据可能并不总是均匀的分散在DataNode中。一个常见的原因是,新的DataNode添加到现有群集中。在放置新块(一组数据文件称为块)时,NameNode会根据各种参数去选择,用哪个来进行DataNode接收。其中一些考虑因素是:

  • 如果一个节点正在写入块,那么这个块的副本会有一个,和它在同一个节点上

  • 需要在机架上复制分散不同的副本,以便群集可以在整个机架出现故障的情况下,依然可用。

  • 副本中,通常有一个副与写入文件的节点放在同一个机架上,以便减少跨机架网络I/O。

  • 将HDFS数据统一分布在集群中的DataNode中。

由于会出现多种因素,数据可能不会均匀的分散在DataNodes中。 HDFS为管理员用户提供了一个工具,用于分析整个集群数据数据节点上的数据块分散情况,和数据平衡的功能。

数据平衡(balancer)使用指南,请参考HADOOP-1652

11、机架感知(Balancer)

HDFS群集可以识别放置每个节点的机架的架构。为了优化数据容量和使用率,配置好集群的架构非常重要。更多详细信息,请查看rack awareness文档。

12、安全模式(Safemode)

在启动期间,NameNode从fsimage和edits日志文件中加载文件系统状态。即使群集中已经存在足够的副本,它也会去等待DataNodes报告数据块(blocks)的信息,以便它不会过早地开始复制块。在此期间,NameNode进入安全模式。NameNode的安全模式本质上是HDFS群集的只读模式,它不允许对文件系统或块进行任何修改操作。通常,NameNode会在DataNodes报告大多数文件系统块可用后,自动离开Safemode模式。如果有需要,可以使用bin/hdfs dfsadmin -safemode命令显式地将HDFS置入安全模式。NameNode的Web首页会显示Safemode是打开还是关闭。更详细的信息,请查看JavaDoc for setSafeMode()

13、fsck命令

HDFS可以使用fsck命令来检查集群中各种不一致情况。它可以报告各种文件的问题,例如,缺少文件块或未复制块。与原生文件系统的fsck命令不同,此命令不会自行更正它检测到的错误。通常NameNode会自动修复大部分可恢复的故障。默认情况下,fsck会忽略打开的文件,但会提供一个选项来告知用户。 HDFS fsck命令不在Hadoop shell命令范围内。通过执行命令bin/hdfs fsck来运行。有关命令用法,请参阅fsck。 fsck可以在整个文件系统或文件的子集上运行。

14、fetchdt命令

HDFS可以使用fetchdt命令来获取授权令牌(Delegation Token)并将其存储在本地系统的文件中。此令牌稍后可用于从非安全客户端访问安全的服务器(例如NameNode)。如果程序要使用RPC或HTTPS(通过Kerberos)获取令牌,Kerberos票据必须在运行前就已经存在(运行kinit命令以获取票据)。HDFS fetchdt命令不在Hadoop shell命令范围内。通过执行命令bin/hdfs fetchdt DTfile来运行。获得令牌之后,无需Kerberos票据就可以运行HDFS的命令,将HADOOP_TOKEN_FILE_LOCATION环境变量指向令牌文件即可。更多用法,请参阅fetchdt

15、恢复模式(Recovery Mode)

通常情况下,可以配置多个元数据存储位置。如果一个存储位置损坏,则可以从其他存储位置来读取元数据。

但是,如果可用的唯一存储位置也损坏了,那么在这种情况下,有一种称为恢复模式(Recovery mode)的特殊NameNode启动模式,可以让您恢复大部分数据。

启动NameNode时,通过:namenode -recover来进入恢复模式。

当处于恢复模式时,NameNode将在命令行中交互式地提示您可以采取哪些措施恢复数据。

如果您想跳过提示,可以加上-force选项。该选项将强制恢复模式始终选择第一个选项。通常情况下,这也是最合理的选择。

由于恢复模式会导致数据丢失,因此在使用之前,需要备份好edit日志和fsimage文件。

16、升级和回滚

当Hadoop在现有集群上进行升级时,与任何软件升级一样,可能会出现新的错误或不兼容的问题,这些问题会影响现有的程序,而且出现的问题可能是以前未发现到的。HDFS升级安装,或者重新开始启动HDFS,都不允许出现数据丢失的情况。HDFS允许管理员会退到早期版本的Hadoop版本,并将群集回滚到升级前的状态。在Hadoop Upgrade Wiki页面中更详细地介绍了HDFS升级的步骤。 HDFS只能有一个备份。在升级之前,管理员需要使用bin/hadoop dfsadmin -finalizeUpgrade命令删除现有备份。以下简要介绍典型的升级过程:

  • 在升级Hadoop之前,确认集群是否已经存在备份。

  • 停止集群并分发新版本的Hadoop软件。

  • 使用-upgrade选项运行新版本的Hadoop(bin/start-dfs.sh -upgrade)。

  • 大多数时候,群集运行正常。一旦新的HDFS被认为运行良好(可能是在运行几天后),最终确定升级。请注意,在群集完成升级之前,删除文件不会释放DataNode上的磁盘空间。

    • 如果需要回退到旧版本,
    • 停止集群并分发早期版本的Hadoop软件。
    • 在namenode上运行rollback命令(bin hdfs namenode -rollback)。
    • 使用回滚选项来启动集群。 (sbin/start-dfs.sh -rollback)。

升级到HDFS的新版本时,有必要重命名或删除旧版本中的目录。如果NameNode在升级过程中遇到目录已存在,它将打印如下所示的错误:

/.reserved is a reserved path and .snapshot is a reserved path component in this version of HDFS. Please rollback and delete or rename this path, or upgrade with the -renameReserved [key-value pairs] option to automatically rename these paths during upgrade.

指定-upgrade -renameReserved [可选的键值对]后,NameNode将自动重命名启动期间找到的任何旧版本的目录。例如,将.snapshot的所有路径重命名为.my-snapshot并将.reserved重命名为.my-reserved,用户可以指定-upgrade -renameReserved .snapshot = .my-snapshot,.reserved = .my-reserved。

如果没有使用-renameReserved指定键值对,那么NameNode将后缀为.<LAYOUT-VERSION> .UPGRADE_RENAMED的保留路径,例如, .snapshot.-51.UPGRADE_RENAMED

重命名过程中有一些注意事项。如果可能的话,建议在升级之前执行hdfs dfsadmin -saveNamespace命令操作。这么做是因为如果edits日志操作引用自动重命名文件,则可能会导致集群内数据不一致。

17、DataNode热插拔

Datanode支持热插拔驱动器。用户可以在不关闭DataNode的情况下添加或替换HDFS数据盘。以下简要介绍一个热插拔的流程:

  • 如果有新的数据盘,先进行格式化并挂载。

  • 更新DataNode的配置,在dfs.datanode.data.dir参数中,新增数据目录。

  • 运行dfsadmin -reconfig datanode HOST:PORT start 命令,使用新的配置进行启动。用户可以使用dfsadmin -reconfig datanode HOST:PORT status命令来查询重新配置后的运行状态。

  • 重新配置任务完成后,用户可以安全的卸载其他不需要的数据卷目录并物理删除磁盘。

18、文件权限和安全

HDFS的文件权限的设计与其他熟悉的平台(如Linux)上的文件权限类似。目前,安全性设置通过简单的文件权限来实现的。启动NameNode的用户被视为HDFS的超级用户。后续到HDFS版本将支持通过Kerberos等网络认证协议来进行用户认证和数据传输加密。

19、可扩展性

Hadoop当前可以运行在有数千个节点的群集上。 PoweredBy Wiki页面列出了一些在使用了大型Hadoop集群的组织。由于HDFS每个集群只有一个NameNode,集群主要的可伸缩性限制是NameNode机器上的可用内存。在非常大的群集上,增加HDFS中存储的文件的平均大小有助于增加群集的可扩展性,而不会增加NameNode上的内存要求。默认配置可能不适合非常大的群集。 FAQ Wiki页面列出了针对大型Hadoop集群的优化和建议配置。

20、相关文档

在开始使用HDFS时,阅读这份文档是一个很好的开始。在该指南不断完善的同时,还有大量有关Hadoop和HDFS的文档。以下列表您还可以继续探索HDFS的世界:

  • Hadoop Site: Apache Hadoop站点的主页。

  • Hadoop Wiki:Hadoop Wiki主要。与Hadoop源代码一起发布的文档不同,Hadoop Wiki定期由Hadoop社区进行维护。

  • FAQ:FAQ Wiki页面。

  • Hadoop JavaDoc API.

  • Hadoop User Mailing List:Hadoop邮件列表user[at]hadoop.apache.org.

  • hdfs-default.xml。该页面介绍了hdfs中的变量和默认参数配置。

  • HDFS Commands Guide: HDFS命令的用法。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值