hadoop分布式系统
简介HDFS, the Hadoop Distributed File System, 是一个分布式系统,它被设计用来存储大数据量的信息(通常是TB或PB),并提供对数据进行高吞吐量访问的性能。文件被存储在多台机器中,确保系统的抗失 效性能以及并行应用程序的高效。这篇
简介
HDFS, the Hadoop Distributed File System, 是一个分布式系统,它被设计用来存储大数据量的信息(通常是TB或PB),并提供对数据进行高吞吐量访问的性能。文件被存储在多台机器中,确保系统的抗失 效性能以及并行应用程序的高效。这篇文章主要介绍 HDFS的设计意图、结构,并告诉读者怎样去使用它。
本文的目标:
- 了解HDFS的设计意图,以及基本的分布式系统的一些概念。
- 学习怎样从命令行中设置和使用HDFS。
- 学习怎样在应用程序中使用HDFS。
分布式系统基本原理
分布式系统被设计成可以存储和管理大数据量的信息的系统,并为这些数据提供对外的访问功能(通过网络)。现在已经有许多的分布式系统用各种不同的方法解决了这个问题。
NFS, the Network File System, 是目前最普遍的分布式系统。它也是还在使用的最老的分布式系统之一。它的设计是非常易懂的,但它也有许多的局限性。NFS 为存储在一台机器上的一个逻辑卷提供远程访问。一个NFS能够让它的本地文件系统的一部分对其他的客户端可见。然后,客户端 会把这个远程系统 加进 它们自己的 Linux 文件系统,然后就像 远程系统在本地硬盘上一样 去使用它。
这个模型的一个主要的优点就是它的透明性。客户端压根儿不用知道它们是否在使用远程系统。标准库中的方法,例如 open(),close(),fread(),等等,会帮助我们使用在NFS上的文件。
但是作为一个分布式系统,它的功能并不是很强大。NFS 中的文件始终都只是存储在一台机器上。这就意味着,存储的容量不可能超过那台机器的容量,并且 NFS 也不提供可靠性上的保证(比如 数据备份)。最后,因为 所有的数据都被存储在一台机器上,那所有的客户端都得跑到这台机器上来取数据。当很多客户端同时跑过来的时候,服务器可能会超负荷。而且,客户端在每次处 理数据之前,都必须跑到服务器上去取数据。
HDFS的设计能够解决一些其他的分布式系统,例如 NFS,所无能为力的问题。尤其是在以下一些方面:
- HDFS的设计 能够存储海量的数据(通常是TB或PB),这要求将数据分散的存储在多台机器上。并且它所支持的文件大小比NFS所支持的要大很多。
- HDFS能够可靠的存储数据,也即是说集群里面的个别机器的故障将不会影响到数据的使用。
- HDFS能够提供对数据快速的、可扩展的访问。它能够通过简单的往集群里面加一台机器的做法来解决大量客户端同时访问的问题。
- HDFS很好的跟Hadoop MapReduce编程模型结合,尽可能的让数据的计算和读取操作在同一台机器上执行。
HDFS的可扩展性,高性能也决定了它对应用程序的不同于其他分布式系统的苛刻要求。为了达到设计者的目的,设计者做了一些额外的限制设计和折中方案。主要有:
- 使用HDFS的应用程序读取文件的方式被假定为流式读取。HDFS在流式读取的性能上做了些优化,当然这也就意味着,在文件上进行随机读取的操作的时间将会比较长。
- HDFS的数据被设计成只允许一次写入和多次读取操作。当写入操作被关闭后,想要往文件里面更新一些内容是不受支持。(最近的Hadoop0.19将会支持在文件尾部增加数据。
- 由于存储的文件过大,以及它流式读取方式,系统没有提供缓存的功能。
- 假定,个别机器的永久性崩溃和间歇性故障总是会频繁的发生。集群应该能够承受多台机器的故障,就算它们一起发生。集群的性能将会按照所损失的机器的数量的比例减少,整个系统不会一下慢下来,数据也不会丢失。数据备份能够起到作用。
HDFS的设计是基于google的分布式系统GFS的,这里是google发表的相关论文。
HDFS 是一个块结构的文件系统;每个文件都被分割成固定大小的文件块。这些块根据数据存储策略被分别存储在一台或者多台机器上。集群中的机器,我们 叫,DataNode。一个文件能够被分割成几个文件块,这些文件块并不一定会被存储在同一台机器上,哪个块存在哪个机器上是随机的。由此,想要访问一个 文件,或许得要几台机器一起合作才行。但是却因此而获得了存储大文件的能力,显而易见,文件能够要求比单个硬盘更大的空间来存储它。
如果一个文件的使用,需要多台机器的配合,那么一台机器的故障将会导致该文件的不可用。HDFS通过为文件的每一个块都做备份的方式来解决这个问题(通常,有3个备份)。
图 2.1: DataNodes 存储着文件的文件块 ,备份的数量是2 。NameNode 结点负责将文件名映射到文件块的ID上。
多数块结构的文件系统使用4k或者8k 数量级别的块大小。相比之下,HDFS的块大小默认下是64MB—一个大很多的数量级别。这个设计减少了HDFS持有的文件块的数量(文件块的容量大 的时候,块的数量就会相应的减少了)。这样做更有利于流式读取方式。显而易见,HDFS 非常喜欢 特大的文件,并且更喜欢流式地读取它们。不像NTFS 或EXT这样的文件系统,它们通常保存很多的小文件,HDFS更希望存储适中数量的特大文件,几百M的、几百G的。毕竟,一个100M的文件也才不过两个 文件块而已。在我们平常的计算机中,文件通常是被随机访问的,应用程序可能会读取一个文件的不同的几个部分,这些部分通常不是连续的存储在硬盘上的。相比 之下,HDFS期望程序一次读完整个文件。这种做法刚好非常适合MapReduce编程的风格。也就是说,像平常使用一般分布式系统那样去使用HDFS, 不是一个明智的选择。
HDFS将文件分成块,并存储在几台机器上,这些文件不可能被当成正常文件系统的一部分了。在一台跑Hadoop的机器上使用ls命令,返回的结果是 linux系统的内容,而并不会包括任何存储在HDFS系统里面的文件。HDFS是一个建立在本地文件系统之上的应用。HDFS的文件(更确切的说,组成 文件的那些文件块) 被存储在 DataNode 结点的一个特定的目录下,但这些文件块只有id。所以,你根本就没有办法使用linux 文件系统的一些工具(ls,cp,mv等等)去操作这些文件。不用操心,HDFS 自带了文件管理功能,操作起来跟(ls,cp,mv)等命令一样地简单。
数据的可靠性是相当重要的。HDFS的数据被设计成只允许一次写入和多次读取操作,当大量的客户端同时需要对文件目录进行修改的时候,同步工作就显得异常 重要了。所以,对文件目录的维护由单独的一台机器来完成,这台机器我们称之为NameNode。NameNode将会存储 文件系统的文件目录和文件名称。因为,每个文件需要记录的东西是很少的(例如,文件名、权限、文件块的位置等),所以,所有的数据都可以被存储在一台机器 上,并提供快速的访问功能。
假设,客户端要访问文件A。客户端从NameNode中取得组成文件A的文件块的位置列表。这个列表知道文件块被存储在哪台机器上。然后客户端 直接 从DataNode上读取文件数据。NameNode是不参与文件的传输的,我们要保证NameNode的消耗尽可能的小。
当然,我们还有预防NameNode机器崩溃的情况。我们使用冗余来保证文件系统的数据不会丢失,即使是在NameNode忽然崩溃的情况下。显 然,NameNode的崩溃要比集群里面的任何一台DataNode的崩溃要严重得多了。当一台DataNode故障的时候,整个集群还可以继续运行,但 当NameNode故障的时候,集群就无法运行了,这时候,我们得手动的采取措施修复故障。当然,NameNode的工作量是相当的小的,它发生故障的概 率要比其他机器发生故障的概率小得多了。
关于HDFS的设计与实现,下面的这篇文章阐述的更加详细。document
配置HDFS
配置HDFS应该是一件不难的事情。首先,我们先配好HDFS的配置文件,再对NameNode进行format操作。
配置Cluster
这里,我们假定,你已经下载了Hadoop的一个版本,并解压完毕。
Hadoop安装目录下的conf是hadoop存放配置文件的目录,里面有一些XML文件需要配置。conf/hadoop-defaults.xml 文件包含了hadoop的任何参数的默认值。这个文件应该是只读的。你可以通过在conf/hadoop-site.xml中设置新值的方式来覆盖默认的 配置。集群上所有的机器的hadoop-site.xml文件应该是一致的。
配置文件本身是键值对的一个集合。
<property>
<name>property-name</name>
<value>property-value</value>
</property>
property 中有 <final>true</final> 这样的一行的,则表示这个属性是不能被用户应用程序覆盖的。
下面的一些属性是必须要配置的,这样HDFS才能跑起来:
| key | value | example |
|---|---|---|
| fs.default.name | protocol://servername:port | hdfs://alpha.milkman.org:9000 |
| dfs.data.dir | pathname | /home/username/hdfs/data |
| dfs.name.dir | pathname | /home/username/hdfs/name |
这些属性的有着如下的意思:
fs.default.name – 这是一个描述集群中NameNode结点的URI(包括协议、主机名称、端口号),集群里面的每一台机器都需要知道NameNode的地址。 DataNode结点会先在NameNode上注册,这样它们的数据才可以被使用。独立的客户端程序通过这个URI跟DataNode交互,以取得文件的 块列表。
dfs.data.dir – 这是DataNode结点被指定要存储数据的本地文件系统路径。DataNode结点上的这个路径没有必要完全相同,因为每台机器的环境很可能是不一样 的。但如果每台机器上的这个路径都是统一配置的话,会使工作变得简单一些。默认的情况下,它的值是/temp, 这个路径只能用于测试的目的,因为,它很可能会丢失掉一些数据。所以,这个值最好还是被覆盖。
dfs.name.dir – 这是NameNode结点存储hadoop文件系统信息的本地系统路径。这个值只对NameNode有效,DataNode并不需要使用到它。上面对于/temp类型的警告,同样也适用于这里。在实际应用中,它最好被覆盖掉。
这里再介绍一个配置参数,它叫dfs.replication 。它决定着 系统里面的文件块的数据备份个数。对于一个实际的应用,它 应该被设为3(这个数字并没有上限,但更多的备份可能并没有作用,而且会占用更多的空间)。少于三个的备份,可能会影响到数据的可靠性(系统故障时,也许会造成数据丢失)。
下面是一个模板文件。
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://your.server.name.com:9000</value>
</property>
<property>
<name>dfs.data.dir</name>
<value>/home/username/hdfs/data</value>
</property>
<property>
<name>dfs.name.dir</name>
<value>/home/username/hdfs/name</value>
</property>
</configuration>
your.server.name.com 需要被配置成正确的主机名,端口号的指定是随意的。
配置好conf/hadoop-site.xml文件以后,你可以将conf目录拷贝到其他的机器上了。
master结点有必要知道集群里其他机器的的地址,这样启动脚本才能正常运行。conf/slaves这个文件列举了所有的可用的主机名,一个主机名一 行。在一个集群的环境中,这个文件不需要包含master的地址。但是单机的情况下,master也要有,因为除了master以外,没有其他的机器可以 作为DataNode结点了。
然后,建立我们要使用的目录:
user@EachMachine$ mkdir -p $HOME/hdfs/data
user@namenode$ mkdir -p $HOME/hdfs/name
执行Hadoop的用户需要这些目录的读写权限,使用chmod命令为该用户设置权限。在一个大的集群环境中,我建议你在每台机器上都创建一个 hadoop的用户,用它来执行hadoop相关的程序。对于一个单机系统,使用自己的用户名就可以了。我不推荐使用root用户来执行hadoop。
启动HDFS
现在,我们先格式化一下我们刚刚配置的hadoop文件系统。
user@namenode:hadoop$ bin/hadoop namenode -format
这个操作应该值被执行一次,当这个执行完毕之后,我们就可以启动分布式系统了。
user@namenode:hadoop$ bin/start-dfs.sh
这个命令将会启动master机器上的Namenode程序。它也会启动slave机器上的DataNode程序。在一个单机版的集群中,slave跟 master是同一台机器。在一个真实的集群环境中,这个命令就通过ssh登录到slave上,并启动DataNode程序。
Interacting With HDFS
这个部分,我们将会熟悉与HDFS交互、存储文件、获取文件所需要用到的一些命令。
大多数命名都是由 bin/hadoop 脚本执行的。它将会在java虚拟机上加载hadoop系统,并执行用户地方命令。这些命令通常有下列的格式。
user@machine:hadoop$ bin/hadoop moduleName -cmd args…
The moduleName 告诉脚本程序,要使用哪个hadoop模块。-cmd 在这被指定模块支持的,要执行的命令名称。紧跟在命令名称后面的是该命令的参数。
HDFS主要的模块有: dfs 和 dfsadmin。它们的使用将会在下面介绍。
通用操作的例子
dfs 模块,我们也叫它“FsShell”,提供基本的文件处理功能。以下是它的一些用法介绍。
集群之所以有用,是因为,它存有我们感兴趣的数据。所以,我们要介绍的第一个操作是,往集群里面写数据。我们假定用户为“someone”,这个 要根据你的实际情况而定。操作是可以在任何一台能够访问到集群的机器上进行的,其中,conf/hadoop-site.xml文件必须设为集群中 NameNode的地址。命令可以在安装目录下被运行,安装目录可以是/home/someone/src/hadoop也可以是/home/foo /hadoop,具体随你自己的情况而定。下面介绍的命令,主要是关于将数据导入HDFS,验证数据是不是真的导入了,并将数据导出来。
列出文件
当我们试图使用HDFS的时候,会发现它并没有想象中的有趣:
someone@anynode:hadoop$ bin/hadoop dfs -ls
someone@anynode:hadoop$
没有带参数的这个“-ls”命令,没有返回任何值,它默认返回你在HDFS“home”目录下的内容,这个目录跟我们平常系统上的home目录 “/home/$user”不太一样(HDFS跟本地系统是独立的)。在HDFS中,没有当前工作目录这样的一个概念,也没有cd这个命令。
给-ls一些参数,比如说/,或许可以看到以下的内容:
someone@anynode:hadoop$ bin/hadoop dfs -ls /
Found 2 items
drwxr-xr-x – hadoop supergroup 0 2008-09-20 19:40 /hadoop
drwxr-xr-x – hadoop supergroup 0 2008-09-20 20:08 /tmp
这些结果是由系统产生的,结果中的”hadoop”是我们用来启动的Hadoop的用户,supergroup是包含hadoop的一个组。这些目录允许 Hadoop MapReduce system 将数据移动到不同的结点上。具体的细节在Module 4中介绍.
我们要创建我们自己的home目录,然后导入一些文件。
导入数据
典型的UNIX或Linux将用户文件存储在/home/$user目录下,但是hadoop将用户文件存储在/home/$user下。对于某些 命令,例如 ls,目录参数是被要求有的,但实际上却没有填写,这时候的目录参数的值为默认目录。(其他的命令一般要求明确的源路径和目的路径)。在HDFS中使用的 相对路径,都是基于刚刚介绍的基本路径的(也即是用户目录)。
Step 1: 如果你的用户目录还不存在,那么创建一个吧
someone@anynode:hadoop$ bin/hadoop dfs -mkdir /user
如果没有/user目录,那么首先要先创建它。它其实会被自动创建的,但是为了介绍的目的,我们先手动的创建一下这个目录。
下面我们就可以创建我们的home目录了。
someone@anynode:hadoop$ bin/hadoop dfs -mkdir /user/someone
将 /user/someone 改成 /user/yourUserName.
Step 2: 导入一个文件。我们可以使用”put”命令。
someone@anynode:hadoop$ bin/hadoop dfs -put /home/someone/interestingFile.txt /user/yourUserName/
它将会把 /home/someone/interestingFile.txt从本地文件系统中拷贝到 HDFS的 /user/yourUserName/interestingFile.txt 。
Step 3: 验证刚才的操作。这里我们有两个命令可以使用,它们是等效的:
someone@anynode:hadoop$ bin/hadoop dfs -ls /user/yourUserName
someone@anynode:hadoop$ bin/hadoop dfs -ls
你应该能够看见一个文件列表,它的前面是”Found 1 items”的字样,文件列表里面包含了你刚刚插入的文件。
The following table demonstrates example uses of the put command, and their effects:
下面这个列表将展示“put”命令的用法,以及它们的效果。
| Command: | 前提条件: | 输出: |
|---|---|---|
| bin/hadoop dfs -put foo bar | 在 HDFS中没有/user/$User/bar这样的文件存在 | 将本地文件foo上传到hdfs系统,并命名为/user/$USER/bar |
| bin/hadoop dfs -put foo bar | /user/$USER/bar 是一个目录 | 将本地文件foo上传到hdfs系统,并命名为/user/$USER/bar/foo |
| bin/hadoop dfs -put foo somedir/somefile | /user/$USER/somedir 不存在 | 将本地文件foo上传到hdfs系统,并命名为 /user/$USER/somedir/somefile, 创建没有存在的目录 |
| bin/hadoop dfs -put foo bar | /user/$USER/bar 已经是系统中的一个文件 | 操作无效,系统将返回一个错误给用户。 |
当执行一个”put”操作时,它的结果是要么全做,要么全不做。上传文件的时候,文件首先被拷贝到DataNode节点上。当所有的 DataNode都接收完数据的时候,文件句柄被关闭,这个文件才真正的上传完。根据”put”命令的返回值,我们可以知道这个操作是成功了,还是完全失 败了。文件不可能会只被上传一半。如果文件上传到一半时,上传操作被中断了,那么hdfs就会当作什么事情也没有发生一样。
Step 4: 一次上传多个文件. “put”命令是可以一次上传多个命令的,它能够将一整个目录上传到HDFS中。
创建一个本地目录,然后往里面拷一些文件。情况像下面的那样。
someone@anynode:hadoop$ ls -R myfiles
myfiles:
file1.txt file2.txt subdir/
myfiles/subdir:
anotherFile.txt
someone@anynode:hadoop$
目录 myfiles/能够这样被拷贝进HDFS中:
someone@anynode:hadoop$ bin/hadoop -put myfiles /user/myUsername
someone@anynode:hadoop$ bin/hadoop -ls
Found 1 items
/user/someone/myfiles <dir> 2008-06-12 20:59 rwxr-xr-x someone supergroup
user@anynode:hadoop bin/hadoop -ls myfiles
Found 3 items
/user/someone/myfiles/file1.txt <r 1> 186731 2008-06-12 20:59 rw-r–r– someone supergroup
/user/someone/myfiles/file2.txt <r 1> 168 2008-06-12 20:59 rw-r–r– someone supergroup
/user/someone/myfiles/subdir <dir> 2008-06-12 20:59 rwxr-xr-x someone supergroup
上面的例子也证明了,这个目录是完全的被拷贝进来了。注意文件路径旁边的<r 1>,里面的数字1 表示备份的数量是1。同时ls命令也列出了文件大小,上传时间,权限,所有者这些信息。
-put 的另外一种写法是 -copyFromLocal. 它们的功能和用法是一样的。
从 HDFS中导出数据
从HDFS中导出数据是有许多的方法的,最简单的那种应该是使用”cat”将一个文件的内容输出到标准输出上。(当然,它也能够作为参数传到程序里面,或者是其他地方)
Step 1: cat 命令.
在这个例子中,我们假定你已经传了一些文件进入你的HDFS中了。
someone@anynode:hadoop$ bin/hadoop dfs -cat foo
(contents of foo are displayed here)
someone@anynode:hadoop$
Step 2: 将HDFS中的文件拷贝到本地系统中。
“get”命令有跟”put”命令相反的功能,它能够将HDFS中文件或目录拷贝到本地系统中。“get”命令的别名叫做copyToLocal.
someone@anynode:hadoop$ bin/hadoop dfs -get foo localFoo
someone@anynode:hadoop$ ls
localFoo
someone@anynode:hadoop$ cat localFoo
(contents of foo are displayed here)
跟 “put”命令一样,”get”操作既可以操作文件,也可以操作目录。
HDFS的关闭
如果你想关闭集群上的HDFS系统,你可以在NameNode结点执行以下的命令:
someone@namenode:hadoop$ bin/stop-dfs.sh
这个命令必须由启动HDFS的用户来执行。
HDFS 命令参考
当然 bin/hadoop dfs 的命令远不只这几个,不过这些命令已经可以让你开始使用HDFS了。执行没有带参数的bin/hadoop dfs命令,会列出所有的FsShell system的命令。 bin/hadoop dfs -helpcommandName 会列出某一个具体的命令的用法指南。
所有的命令都作为一个表格列在下面了,这里是这个表格的一些注释:
- italics 表示这个变量是用户应该填的。
- “path” 一个文件名,或者目录名。
- “path…” 多个文件名,或者多个目录名。
- “file” 任何文件名.
- “src” and “dest” 路径名称。
- “localSrc” and “localDest” 跟上面的路径类似,只不过限定在了本地系统中。其他形式的路径都表示HDFS中的路径。
- 在”[]“里面的参数是可选的。
| Command | Operation |
|---|---|
| -ls path | Lists the contents of the directory specified by path, showing the names, permissions, owner, size and modification date for each entry. |
| -lsr path | Behaves like -ls, but recursively displays entries in all subdirectories of path. |
| -du path | Shows disk usage, in bytes, for all files which match path; filenames are reported with the full HDFS protocol prefix. |
| -dus path | Like -du, but prints a summary of disk usage of all files/directories in the path. |
| -mv src dest | Moves the file or directory indicated by src to dest, within HDFS. |
| -cp src dest | Copies the file or directory identified by src to dest, within HDFS. |
| -rm path | Removes the file or empty directory identified by path. |
| -rmr path | Removes the file or directory identified by path. Recursively deletes any child entries (i.e., files or subdirectories of path). |
| -put localSrc dest | Copies the file or directory from the local file system identified by localSrc to dest within the DFS. |
| -copyFromLocal localSrcdest | Identical to -put |
| -moveFromLocallocalSrc dest | Copies the file or directory from the local file system identified by localSrc to dest within HDFS, then deletes the local copy on success. |
| -get [-crc] src localDest | Copies the file or directory in HDFS identified by src to the local file system path identified by localDest. |
| -getmerge src localDest[addnl] | Retrieves all files that match the path src in HDFS, and copies them to a single, merged file in the local file system identified by localDest. |
| -cat filename | Displays the contents of filename on stdout. |
| -copyToLocal [-crc] srclocalDest | Identical to -get |
| -moveToLocal [-crc] srclocalDest | Works like -get, but deletes the HDFS copy on success. |
| -mkdir path | Creates a directory named path in HDFS. Creates any parent directories in path that are missing (e.g., like mkdir -p in Linux). |
| -setrep [-R] [-w] rep path | Sets the target replication factor for files identified by path to rep. (The actual replication factor will move toward the target over time) |
| -touchz path | Creates a file at path containing the current time as a timestamp. Fails if a file already exists at path, unless the file is already size 0. |
| -test -[ezd] path | Returns 1 if path exists; has zero length; or is a directory, or 0 otherwise. |
| -stat [format] path | Prints information about path. format is a string which accepts file size in blocks (%b), filename (%n), block size (%o), replication (%r), and modification date (%y, %Y). |
| -tail [-f] file | Shows the lats 1KB of file on stdout. |
| -chmod [-R] mode,mode,… path… | Changes the file permissions associated with one or more objects identified by path…. Performs changes recursively with -R. mode is a 3-digit octal mode, or {augo}+/-{rwxX}. Assumes a if no scope is specified and does not apply a umask. |
| -chown [-R] [owner][:[group]] path… | Sets the owning user and/or group for files or directories identified by path…. Sets owner recursively if -R is specified. |
| -chgrp [-R] group path… | Sets the owning group for files or directories identified by path…. Sets group recursively if -R is specified. |
| -help cmd | Returns usage information for one of the commands listed above. You must omit the leading ‘-’ character in cmd |
DFSAdmin 命令参考
”dfs”模块提供了对文件和目录的操作命令,”dfsadmin”则提供了管理整个文件系统的操作。
全局状态信息: 通过 bin/hadoop dfsadmin -report命令,我们可以得到一份全局状态报告。这份报告包含了HDFS集群的基本信息,当然也有每台机器的一些情况。
改变 HDFS 成员组成 - 删除结点的时候,我们要按步骤的和结点断开链接以保证数据不会丢失。关于decommissioning 命令的一些详细的信息,我们会在后面讨论。
升级 HDFS - 但HDFS从一个版本升级到另外一个版本的时候,NameNode和DataNode使用的文件格式有可能会改变。当你第一次使用新版本的时候,你要使用 bin/start-dfs.sh -upgrade告诉Hadoop 去改变HDFS版本(否则,新版本不会生效)。然后它开始升级,你可以通过 bin/hadoop dfsadmin -upgradeProgress 命令来查看版本升级的情况。当然你可以使用bin/hadoop dfsadmin -upgradeProgress details来查看更多的详细信息。当升级过程被阻塞的时候,你可以使用bin/hadoop dfsadmin -upgradeProgress force 来强制升级继续执行(当你使用这个命令的时候,一定要慎重考虑)。
当HDFS升级完毕后,Hadoop依旧保留着旧版本的有关信息,以便你可以方便的对HDFS进行降级操作。你可以使用bin/start-dfs.sh -rollback来执行降级操作。
Hadoop一次只保存一个版本的备份。当新版本运行几天以后还是没有出现什么问题,你就可以使用bin/hadoop dfsadmin -finalizeUpgrade命令把旧版本的备份从系统中删掉了。删除以后rollback 命令就失效了。在另外一次版本升级前,这个操作是一定要 做的。
获取帮助 - 跟 dfs 模块是一样的, 你可以使用 bin/hadoop dfsadmin -help命令来获取特定的命令的一些用法。
更多推荐
所有评论(0)