本文翻译自:http://hadoop.apache.org/docs/r2.8.0/hadoop-project-dist/hadoop-hdfs/HdfsUserGuide.html
基于2.8.0文档
1.目的
本文可以作为以下人员的入门指引:使用hdfs的用户,或者仅仅使用分布式文件系统的用户。虽然hdfs设计的目的是在多个环境中可以用,但关于Hdfs的工作原理还是很有助于配置和诊断特定集群。
2.概述
HDFS是Hadoop应用的主要分布式存储。一个hDFS集群主要包含一个名称节点(管理文件系统元数据)和一个多个数据节点(存储实际的数据)。HDFS框架指引详细地描述了HDFS。本指引主要描述有关用户交互和HDFS集群管理。HDFS框架图简要示意了名称节点,数据节点和客户端的交互。
客户端连接名称节点获得文件系统元数据或者文件修改,然后和数据节点进行直接的文件i/o。
以下一些显著的特性对可能然许多用户感兴趣:
- hadoop,包含hdfs,很适用于分布式存储,并利用普通的设备进行分布式计算。它有容错,可伸缩,极其容易扩展。mapreduce,以简单和可用于大量分布式应用知名,是hadoop的一部分。
- HDFS是高度可配,并有一个默认的配置,可以有许多的安装方式。绝大部分时候,只有在非常大的集群中才需要调优(译注:应该是指节点多,数据多吧?)。
- hadoop使用java编写,支持所有主要的平台
- hadoop支持类似于shell的命令,可以用于交互hdfs目录
- 名称节点和数据节点都有内建的web服务器,用户很容易检查集群当前状态
- HDFS中一些新特性和提升会定期实现,以下几点是一些有用的特性:(译注,这是基于2.8.0编写的)
- 文件权限和授权
- 机栈敏感:在调度任务和分配存储的时候,会考虑一个节点的物理位置。
- 安全模式(safemode):用于维护的可管理模式(译注:可以通过命令设置为这种状态)
- fsck:用于诊断文件系统的健康,查找丢失的文件或者块。
- fetchdt:用户获取委托令牌(?delegationToken),并把令牌存储到本地文件系统
- 均衡器(balancer):均衡集群的工具
- 升级和回滚:在软件升级之后,有可能回滚到升级之前的状态(如果有不可测的问题)
- 第二名称节点:执行定期的名称空间检查点,并帮助名称节点中包含hdfs修改的日志文件保持在特定大小
- 检查点节点:执行名称空间定期的检查点,并帮助名称节点中包含HDFS变更日志的文件保持在最小状态。可以替代第二名称节点,虽然这不是强制的。只要系统中没有备份节点,那么名称节点允许存在多个检查点节点。
- 备份节点:是检查点节点的扩展(升级)。除了可以做检查点,它也从名称节点接受编辑日志流,并在自己的内存中维护名称空间,这个空间是和名称节点的名称空间同步的。只能有一个备份节点。
3.前提
以下文档描述如何安装配置一个hadoop集群:
http://hadoop.apache.org/docs/r2.8.0/hadoop-project-dist/hadoop-common/SingleCluster.html
http://hadoop.apache.org/docs/r2.8.0/hadoop-project-dist/hadoop-common/ClusterSetup.html
本文的剩余部分都会假设用户可以配置并运行至少有一个数据节点的HDFS。如果名称节点和数据节点运行在单一机器也是可以的。
4.web界面
名称节点和数据节点都有运行内部的web服务器,它们可以显示关于当前集群状态的基本信息。
根据默认设置,名称节点的主页是http://namenode-name:50070/.它会列出集群中的名称节点和集群的基本统计信息。web界面也可以用于浏览文件系统
译注:
可以通过8042,8099,50070端口访问,如果不修改默认配置的话。
例如http://bigdata.lzf:8099可以看集群配置文件
http://bigdata.lzf:50070 可以看数据节点和文件
5.shell命令
hadoop包含各种类shell命令,可以用来交互HDFS和hadoop支持的其它文件系统。
命令 bin/hdfs dfs -help列出hadoop shell支持的命令。此外,bin/hdfs -help 命令名称 可以显示更多的细节。
这些命令支持类似普通文件系统绝大部分的操作,例如复制文件,修改权限,等等。hdfs也会支持一些hdfs特定的操作,诸如修改文件复制。
译注:这个部分的内容和2.8.0全部文档中关于文件操作的不尽相同。hdfs dfs的命令虽然和hadoop fs 基本一致,但2.8.0的文档基本只介绍hadoop fs。这可能是文档没有妥当更新的缘故。
6.DFSAdmin 命令
hdfs dfsadmin命令支持一些hDFS管理。使用hdfs dfsadmin -help可以看看dfsadmin的详细帮助。
译注:更多细节参阅hadoop文档,或者看帮助,本文的目的不在于这些细节。
7.第二名称节点
名称节点使用本地文件系统来记录文件系统的修改,这个文件称为编辑日志。当名称节点启动的时候,会从映像文件(fsimage-本地文件)获取状态,然后把编辑日志总的事务应用到映像文件中,然后生成新的映像文件,而现有的编辑日志被清空。
由于每次节点只在启动的时候整合日志文件和映像文件,随着时间的推移,日志文件就可能变得非常巨大。巨大文件的一个影响是,下一次名称节点启动的时候,会耗费更多时间。
第二名称节点的作用之一就是定期合并编辑日志和映像文件,以便日志文件的大小保持在一个限度下。第二名称节点通常运行在单独的机器上,因为它对内存的需求同主名称节点一样。
第二名称节点上检查点进程的启动受到两个可配参数的控制:
dfs.namenode.checkpoint.period:默认是1小时(单位是秒),设定了两个连续检查点之间的最大延迟
dfs.namenode.checkpoint.txns:默认是1百万(译注:单位是个),设定未检查的事务数,操作这个数,就会触发检查点操作。
译注:两个条件之一满足就会触发检查点操作
第二名称节点把最新的检查点存储在本地目录,这个目录结构同主名称节点。这样,如果有必要,主名称节点总是可以读取检查点映像。(译注:这就是后面说的导入检查点)
8.检查点节点
译注:由于这个东西和第二名称节点的作用类似,所以原文的绝大部分可以省略。
hdfs namenode -checkpoint --启动检查点节点
dfs.namenode.backup.address 和dfs.namenode.backup.http-address可以用于配置检查点(或者备份)节点的地址,包括http地址。
如果没有备份节点,那么可以设定多个检查点节点。
9.备份节点
备份节点提供除了和检查点节点一样,可以提供检查点功能,还能够实时同步一个和主节点一样的系统命名空间(在内存中,并且状态是活动)。备份节点从主节点通过流的方式接受主节点上的编辑日志,并把这些日志保存在磁盘中,同时这些编辑日志一样会被应用到内存中,这样备份节点内存中的名称空间就和主节点完全一样。
备份节点不需要从主节点下载映像文件和编辑日志,因为它的内存中有个和主节点一样的名称空间。备份节点的检查点进程更加高效,因为它只需要把名称空间保存到本地的映像文件,并充值编辑日志。
由于备份几点维持了一个内存中的名称空间备份,所以它对于内存的需求同名称节点。
名称节点只支持一个备份节点。备份节点和检查点节点是不共存的。将来会支持同时使用多个备份节点(毫无疑问这是非常有必要的,apache已经意识到了)。
备份节点的配置方式同检查点节点--- hdfs namenode -backup.
备份节点的位置它的web界面通过dfs.namenode.backup.address 和dfs.namenode.backup.http-address来配置。
通过使用备份节点,就可以在在非持久设备上运行名称节点,并把状态的持久责任全部委托给备份节点。为了达到这个目的,可以在启动名称节点的时候带上-importCheckpoint参数,同时dfs.namenode.edits.dir参数中可以设定一个非持久存储目录。
为了能够全面讨论创建备份节点和检查点节点背后的动机,请参阅 https://issues.apache.org/jira/browse/HADOOP-4539
中关于名称节点部分内容。
10.导入检查点
如果编辑日志和映像文件的所有其它备份都无效(或者丢失),那么可以把最新的检查点导入到名称节点中。为了这么做,应当:
- 根据参数dfs.namenode.name.dir的设置,创建一个空间的目录
- 确定dfs.namenode.checkpoint.dir设定的检查点路径
- 启动名称节点,大必须带上-importCheckpoint选项。
名称节点从检查点路径下载元数据到本地的dfs.namenode.name.dir,名称节点会检查映像文件的一致性,但不做任何修改。
The NameNode will upload the checkpoint from the dfs.namenode.checkpoint.dir directory and then save it to the NameNode directory(s) set in dfs.namenode.name.dir. The NameNode will fail if a legal image is contained in dfs.namenode.name.dir. The NameNode verifies that the image in dfs.namenode.checkpoint.dir is consistent, but does not modify it in any way.
11.均衡器
HDFS的数据可能并不总是均匀分布在各个数据节点上。一个通常的原因是新节点的加入。
当存放新数据块的时候,名称节点考虑多个情况以便选择一个可以接受数据的数据节点,这些情况包括:
- 在写入数据块的节点上保留一个复制(译注:理所当然)
- 把部分复制放在不同机栈,避免整个机栈失效的时候,数据不会丢失
- 至少有两个复制在同一个机栈,这样可以减少网络I/O
- 在集群数据节点之间均匀分布HDFS数据
由于这些存在一定互斥的考虑,数据就可能无法在节点见均匀分布。HDFS给管理员提供了一个工具,可以分析块的分布,并在各个数据节点之间重新均衡数据块。
hdfs balancer
[-threshold <threshold>]
[-policy <policy>]
[-exclude [-f <hosts-file> | <comma-separated list of hosts>]]
[-include [-f <hosts-file> | <comma-separated list of hosts>]]
[-source [-f <hosts-file> | <comma-separated list of hosts>]]
[-blockpools <comma-separated list of blockpool ids>]
[-idleiterations <idleiterations>]
详细参考
http://hadoop.apache.org/docs/r2.8.0/hadoop-project-dist/hadoop-hdfs/HdfsUserGuide.html#Balancer
12.机栈敏感
一个HDFS集群可以识别机栈拓扑(机栈--节点存放的地方)。为了优化数据的存储和使用,正确配置拓扑还是很重要的。
具体参考:http://www.cnblogs.com/lzfhope/p/7000456.html
13.安全模式
名称节点启动的时候,首先至于安全模式,目的是检查复制情况,检查期间名称节点可读不可修改,这意味着期间任意文件都不可修改。
调整为正常模式之后,会把一些没有正常复制的数据块重新补充复制下。
除了启动的时候,自动设置为安全模式,也可以显式(手工)把集群设置为安全模式-- hdfs dfsadmin -safemode
14.fsck-文件检查
fsck专门检查各种文件的问题。例如块丢失,或者块复制不足。
不同于传统文件系统的检查工具,这个命令并不修正发现的错误。通常名称节点自动修改绝大部分可以恢复的问题。
默认情况下,fsck会忽略打开的文件,但我们可以在执行这个命令的时候通过选项控制是否忽略打开的文件。
HDFS fsck命令并不是hadoop shell命令。
15.fetchdt-获取委托令牌
HDFS支持fetchdet命令,以便获取委托令牌,并把令牌存储在本地文件系统。
令牌可以让用户从一个不安全的客户端访问安全的(secure)服务器(例如名称节点)。
通过rpc或者https(通过kerberos)获取令牌的工具,它们需要提供kerberos票。HDFS的fetchdt命令并非hadoop shell命令(译注:同fsck一样,虽然说不是hadoop shell命令,但我们一般都是那么任务的,只不过命令是以hdfs 开头).
当通过工具获得令牌之后,就可以不需要kerberos票就可以运行hdfs命令,前提是设置HADOOP_TOKEN_FILE_LOCATION环境变量。HADOOP_TOKEN_FILE_LOCATION指向令牌的存储位置。
16.恢复模式
典型地,我们会配置多个元数据存储位置。然后,如果一个存储点坏了,那么我们可以从其它存储点读取。
然而,如果只有一个存储点,且坏了,我们能怎么办? 在这种情况下,有一个特别的名称节点启动模式,称为恢复模式,这个模式可能让我们恢复大部分的数据。
命令: hdfs namenode -recover
当处于恢复模式的时候,名称节点以交互方式提示我们输入一些信息,做出一些选择。
如果不想被提示,可以给出-force选项。这种情况下,如果有选择,程序也只会选择第一个项目。通常情况下,这可能是最合理的选择。
因为恢复模式可能导致数据丢失,所以应该在执行前备份编辑日志和映像文件。
17.升级和回滚
当升级一个集群的时候,可能会出现一个新的bug或者一些不兼容现有软件的情况。在任何的正式安装中,肯定是选择保护数据,所以必须重启hdfs。
hdfs允许管理员回退到更早的hadoop版本和升级前的状态。hdfs升级的内容在hadoop升级wiki页面有更详细的说明。
HDFS一个时间只能有一个备份。在升级之前,管理员需要移除现存的备份,命令是hdfs dfsadmin -finalizeUpgrade.
下面简要描述典型的升级过程:
- 如果有备份节点,那么先移除
- 停止集群,并部署新版本的hadoop
- 运行sbin/start-dfs.sh -upgrade
- 大部分时间,集群运行良好。一旦认为新的HDFS运行良好(可能升级几天之后),结束升级。注意,除非集群认定升级完毕,否则删除升级前的文件不会真正释放数据节点上的空间
- 如果要回滚到老版本
-
- 停止集群,并部署早版本的hadoop
- 在名称节点上执行hdfs namenode -rollback
- 以回滚方式启动集群 sbin/start-dfs.sh -rollback
当升级到一个新版本hdfs的时候,有必要删除在新版hdfs中保留的的路径(也可以重新命名).如果名称节点在升级过程遇到一个保留的路径,那么它会输入类似如下的错误信息:
/.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来绕过以上问题。例如,如果想重新命名所有.snapshot的路径为.my-snapshot,用户可以如下操作:
-upgrade -renameReserved .snapshot=.my-snapshot
如果有多个目录,可以如下:
-upgrade -renameReserved .snapshot=.my-snapshot,.reserved=.my-reserved
对于重命名过程,有一些警告。我们建议,如果可能,应该在升级前保存名称空间(通过 hdfs dfsadmin -saveNamespace).
这是因为数据可能不一致,如果编辑日志操作执行一个自动改名的文件。
18.数据节点热交换磁盘
数据节点支持热交换磁盘。用户可以添加或者更换磁盘,而不用关闭数据节点。
下面简要描述热交换磁盘过程:
- 如果有新的存储目录,那么用户应该格式化和挂载
- 修改dfs.datanode.data.dir设置,加入新的路径
- 执行dfsadmin -reconfig datanode host:port start,以启动重配置路径。然后,使用dfsadmin -reconfig datanode host:port status查询重配置任务的状态
- 一旦重新配置完成,用户就可以安全的卸载有关目录,并物理移除磁盘
译注:这个小节告诉我们,配置一个单机的时候,存储数据的磁盘应该和操作系统磁盘有可能的话,还是分开。即一台电脑上最好有两块硬盘,而且最好支持热拔插。
19.文件权限和安全
文件系统的权限类似linux的。目前,安全仅限于简单的文件权限。启动名称节点的用户被当作HDFS的超级用户。
将来版本的HDFS会支持网络应用协议,例如用户的kerberos授权和数据传输加密。详细的信息参与权限指引。
译注:用户的kerberos授权,好像很早版本就有了,是否原文整理的时候没有纠正?
20.可伸缩
hadoop当前可以构建一个成千上万节点的集群。这个页面powerdBy列出了知名的用户。
hdfs有一个名称节点。目前数据节点上的可用内存是主要的伸缩限制。在非常大的集群上,提高平均文件大小会提升集群的大小。默认的配置可能不适用于非常大集群。FAQ WIKI提供了大型集群的建议配置。
译注:hadoop也在不断升级中。
访问 https://wiki.apache.org/hadoop/FAQ ,可以获得许多可能有益的帮助。
作为hadoop的核心,了解hdfs是唯一重要的事情。mr在很多小型的集群或者hadoop应用中,作用并不是很大。在将来的硬件情况下,mr更加没有价值。