2 HDFS Users Guide
2.1目的
略
2.2.概述
HDFS是Hadoop应用使用的主要的分布式存储。HDFS集群使用namenode管理文件系统元数据,datanode保存实际数据。HDFS体系结构中有详细的描述。用户手册主要解决HDFS和用户的交互和HDFS集群的管理。HDFS体系结构中描述了namenode,datanode和client的相互之间的交互。Client从namenode获取元数据,修改元数据,在datanode中操作实际的数据。
以下是hdfs主要的特性:
· Hadoop包含hdfs,hdfs是非常适用于商用的硬件上面,进行分布式存储和分布式处理的。Hdfs有很好的容错性,可扩展性,扩大也很简单。Mapreduce也是极简的适用于庞大的分布式系统。
· HDFS是高可配置的,默认配置适用于大多数安装。只有在极大的集群下需要调整配置。
· Hadoop使用java开发,适用于绝大多数平台。
· Hadoop支持类似shell的命令行,与hdfs直接交互。
· Namenode和datanode有web服务,可以很简单的查看和检查当前集群状态。
· HDFS有用的特性:
o 文件权限和人认证
o Rack awareness:在调度任务和分配存储是,考虑node的物理位置
o Safemode:一个管理模式用来进行对hdfs维护。
o Fsck:一个用来诊断文件系统是否良好的工具,发现丢失的文件和块。
o Fetchdt:用来获取DelegationToken 并且保存到本地。
o Balancer:当datanode数据分布不均匀,使用这个工具来均衡。
o Upgrade和rollback:软件更新后,因为一些无法预计的问题,可以回滚HDFS的更新
o Secondary Namenode:定期的执行checkpoint,保证hdfs事务日志大小。
o Checkpoint node:在命名空间上执行checkpoint,并且最小化namenode的修改日志大小。
o Backup node:checkpoint node 的扩展。除了checkpoint之外会接受到一串修改,并且维护在内存中。和namenode 保持同步。一个namenode只能有一个backup node。
2.3.先决条件
略
2.4. Web Interface
Namenode和datanode每个都运行了一个内部的web server,为了显示cluster集群的基本信息。使用默认配置,namenode 的前段网站是http://hosts:9870。列出了cluster中的datanode和cluster的基本信息。Web interface可以用来浏览文件系统(使用 browse the file system)。
2.5. Shell Command
Hadoop 包含各种类似shell的命令,直接与HDFS和其他的文件系统进行交互。可以使用hdfs dfs –help查看支持的命令。hdfs dfs -help command-name可以查看命令的详细内容。命令支持很多和正常文件系统一样的操作,比如复制文件,修改文件权限等等。也支持HDFS的一些操作比如复制的文件个数。具体可以查看: File System Shell Guide.
2.5.1 DFSAdmin 命令
hdfs dfsadmin用来支持HDFS管理操作。hdfs dfsadmin –help列出所有支持的命令,比如:
· -report 报告HDFS的基本信息。一些信息都可以在namenode 的端页面上可以查看
· -safemode 可以让用户手动进入和退出safemode
· -finalizeupgrade 清理最后一次cluster升级的备份。
· -refreshnodes 更新namenode可以连接的datanode。默认namenode读取dfs.hosts,dfs.host.exclude定义的文件中读取。Dfs.hosts包含了只允许注册到namenode。Dfs.host.exclude是不允许的datanode。另外如果dfs.namenode.hosts.provider.classname设置为org.apache.hadoop.hdfs.server.blockmanagement.CombinedHostFileManager,所有包含和不包含的host都以json格式在dfs.hosts中。Datanode中的所有副本都放到了其他datanode,那么datanode会被停用。停用的node会自动被关闭。
· -printTopology 打印cluster的拓扑,显示了namenode 可以查看到的一个b树。
2.6 Secondary Namenode
Namenode的修改以日志方式被保存,append的方式被加入到本地的文件系统文件中。当namenode启动,会从fsimage读取hdfs的状态,然后应用editlog。然后把新的fsimage写回到磁盘并且清空editlog。因为namenode只会在startup状态才会合并,editlog文件在繁忙的cluster中会变的很大。这样会是namenode启动话很长时间。
Secondary namenode定期合并fsimage和editlog,并且限制editlog大小。通常运行在另外一个设备上,因为需要的内存和primary namenode一样。
Secondary namenode上执行的checkpoint有个2参数控制:
· Dfs.namenode.checkpoint.period 默认为1个小时,指定2个checkpoint的时间间隔。
· Dfs.namenode.checkpoint.txns 默认为100万,没100万事务进行一次checkpoint。
Secondary namenode在目录中保存了最后一次checkpoint,目录结构和primary namenode一样。Checkpoint的image会准备等待primary namenode 来读取。
Secondary namenode 相关命令 secondarynamenode
2.7 Checkpoint Node
Namenode使用2种文件来保存元数据,fsimage,最后一次checkpoint的元数据,editlog,从最后一次checkpoint到现在的元数据修改日志。当namenode启动,会使用fsimage和editlog合并,提供最新的文件系统状态。Namenode然后使用新的hdfs状态覆盖fsimage,并启动新的editlog。
Checkpoint node定期的创建命名空间的检查点。会从活动的namenode下载fsimage和editlog,在本地合并,并且把新的image重新上传到namenode。Checkpoint通常运行在不同的服务器上,因为内存的需求和namenode一样。Checkpoint node根据配置文件使用hdfs namenode –checkpoint启动。
Checkpoint node 或者backup node可以通过配置dfs.namenode.backup.address 和dfs.namenode.backup.http-address设置。
checkpoint有个2参数控制:
· Dfs.namenode.checkpoint.period 默认为1个小时,指定2个checkpoint的时间间隔。
· Dfs.namenode.checkpoint.txns 默认为100万,没100万事务进行一次checkpoint。
Checkpoint node在目录中保存了最后一次checkpoint,目录结构和namenode一样。Checkpoint的image会准备等待namenode 来读取。
2.8 Backup node
Backup node提供和checkpoint node一样的功能,也维护了一份内存的,最新的文件系统命名空间,这个是和活动namenode 保持同步状态的。接收namenode的修改的流,然后放到本地磁盘上,backup node也只应用这些修改到自己在内存的命名空间中,因此创建了一个namespace的备份。
Backup node不需要去下载fsimage和editlog,来创建checkpoint,因为已经在内存中有了最新的状态。Backup node checkpoint更加高效,只需要把命名空间保存到本地fsimage并且重置edit 。
Namenode只支持一个backup node。如果使用了backup node就无法使用checkpoint node。使用多个backup node在以后会支持。
Backup node和checkpoint node启动方式一样。使用hdfs namenode –backup启动。
本地的backup node或者checkpoint node的web interface通过dfs.namenode.backup.address和dfs.namenode.backup.http-address参数配置。
使用backup node提供了选项,可以让namenode在没有持续化存储下运行,委托了所有的持续化到backup node。Namenode以-importcheckpoint启动,只配置 dfs.namenode.edits.dir。
对于完整的讨论checkpoint node 和backup node 可以看 HADOOP-4539命令的使用可以看:namenode.
2.9 Import Checkpoint
最后一次checkpoint可以导入到namenode上如果所有其他的image和editlog没有丢失:
· 创建一个空的目录,dfs.namenode.name.dir指向这个目录
· 指向checkpoint数据所在目录,dfs.namenode.checkpoint.dir
· 使用-importcheckpoint启动namenode
Namenode会从checkpoint目录读取数据,然后存放到namenode目录中。如果dfs.namenode.name.dir有文件那么就会报错。Namenode会检查dfs.namenode.checkpoint.dir的一致性,但是不会修改它。
2.10 均衡器
HDFS数据并不是统一的在datanode中。一个原因就是cluster加入了一个新的datanode。当放置新的block,namenode会在选择datanode,考虑很多:
· 在写入的node上保留一份
· 跨机架需要一份
· 相同机架的不通服务器上面需要一份
· HDFS数据统一的分配到datanode中
因为很多考虑因素,因此数据不能统一的分配到所有datanode。Hdfs提供了一个工具来管理分析block的位置,并且重新平衡datanode。一个简单的均衡器管理在HADOOP-1652命令使用查看 balancer.
2.11 Rack Awareness
HDFS集群可以识别rack的拓扑。为了最优化数据容量和使用这个配置很重要。可以查看文档:rack awareness
2.12 Safemode
当启动namenode的时候从去加载fsimage和editlog文件。然后等待datanode 报告他们的block信息。如果副本不够就开始复制副本,这个时候namenode都在safemode下。Safemode下hdfs集群是只读的。如果datanode报告绝大多数block可用,那么就会推出safemode。如果需要,HDFS可以手动进入hdfs dfsadmin –safemode。Namenode的前端网站可以看出safemode是否打开。
2.13 fsck
HDFS支持fsck命令检查各种不一致性。Fsck被设计用来报告各种文件问题。比如,块丢失。不想传统的fsck工具,这个命令并不会修复发现的错误。Namenode会自动修复绝大多数的错误。Fsck不是hadoop的shell命令,使用hdfs fsck启动。具体可以查看:fsck.
2.14 fetchdt
HDFS支持fetchdt命令来获取Delegation Token并保存在本地系统中。这个token在后面用于访问服务器。工具使用RPC或者HTTPS获取token,hdfs fetchdt 是不是hadoop shell命令。可以使用hdfs fetchdt DTfile。如果获取了token之后运行hdfs命令就不需要Kerberos tickets。通过参数HADOOP_TOKEN_FILE_LOCATION指向token文件。Fetchdt命令具体使用: fetchdt
2.15 Recovery Mode
通常如果配置了多个元数据存储位置。如果一个存储位置损坏,可以从另外一个位置上读取。
但是如果只有一个存储位置,那么怎么办?这里有个namenode启动的特别模式recovery mode,可以恢复绝大多数数据。
通过namenode –recover进入recovery mode。
进入recovery mode,namenode会交互式提示你如何进行恢复。
如果不想要提示,可以加-force参数。会强制恢复模式总是选择第一个选项。通常都是合理的。
因为恢复模式会导致数据丢失,最要先备份editlog和fsimage。
2.16 更新和回滚
Hadoop在集群上的升级,和其他软件升级一样,都有可能会出现新的bug或者不兼容的修改影响现有的应用程序。HDFS允许管理员回退到之前的hadoop版本,并且回退cluster状态。HDFS升级可以看 Hadoop Upgrade 。在升级前,管理员需要删除已经有的backup使用hadoop dfsadmin –finalizeUpgrade命令。升级过程:
· 在升级前,确认是否有backup node
· 关闭集群,并且安装新的hadoop
· 使用-upgrade命令,start-dfs.sh –upgrade
· 很多情况下,cluster工作是没问题的,一旦新的hdfs被认为没问题,完成升级。
· 如果需要回退到老的版本:
o 关闭集群并且安装之前的hadoop
o 运行rollback命令hdfs namenode –rollback
o –rollback启动cluster 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 [optional key-value pairs]如果出现冲突那么会自动重命名比如,.snapshot 变为.my-snapshot 并且.reserved 变为 .my-reserved。-upgrade -renameReserved .snapshot=.my-snapshot,.reserved=.my-reserved.
如果-renameReserved后面没有kv对,namenode会自动加一个后缀.<LAYOUT-VERSION>.UPGRADE_RENAMED, e.g. .snapshot.-51.UPGRADE_RENAMED。
推荐在升级之前先运行hdfs dfsadmin –saveNamespace。如果edit log指向的文件被自动重命名那么就会有数据一致性问题。
2.17 Datanode热切换磁盘
Datanode支持热切换。用户可以增加或者替换HDFS数据卷,但是不需要关闭datanode。热切换过程:
· 如果有新的存储目录,用户可以格式化,并且mount
· 用户更新修改datanode配置dfs.datanote.data.dir
· 运行dfsadmin -reconfig datanode HOST:PORT start重新配置。然后可以通过命令dfsadmin -reconfig datanode HOST:PORT status查看重新配置的运行状态。
· 一旦重新配置任务完成,用户可以安全的umount老的数据卷。
2.18 文件权限和安全性
文件权限设计和其他的linux平台的文件系统类似。现在只用于限制简单的文件权限。启动namenode 的用户是HDFS的超级用户。未来的版本HDFS会支持网络验证协议,类似Kerberos并且加密数据传输。
2.19 可扩展性
Hadoop当前一个集群可能有上千个node。HDFS每个cluster有一个namenode。当前namenode 的内存使用时主要的可扩展性限制。对于非常庞大的集群来说,增加平均文件的大小,可以增加cluster 的大小,但是又不会消耗太多内存。默认配置不使用于非常大的集群。
2.20 相关阅读
- Hadoop Site: The home page for the Apache Hadoop site.
- Hadoop Wiki: The home page (FrontPage) for the Hadoop Wiki. Unlike the released documentation, which is part of Hadoop source tree, Hadoop Wiki is regularly edited by Hadoop Community.
- FAQ: The FAQ Wiki page.
- Hadoop JavaDoc API.
- Hadoop User Mailing List: user[at]hadoop.apache.org.
- Explore hdfs-default.xml. It includes brief description of most of the configuration variables available.
- HDFS Commands Guide: HDFS commands usage.