为HBase-0.90.2构建Hadoop-0.20.X

本文介绍如何构建兼容HBase-0.90.2的Hadoop-0.20.X版本,解决两者间的数据丢失风险问题。通过使用branch-0.20-append分支,用户可以在生产环境中稳定运行HBase。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以下翻译自《Building an Hadoop 0.20.x version for HBase 0.90.2》(2011年10月20日),作者是Michael G. Noll,原文地址:

http://www.michael-noll.com/blog/2011/04/14/building-an-hadoop-0-20-x-version-for-hbase-0-90-2/

 

目前,Hadoop-0.20.2是Apache Hadoop发布的最新的稳定版本,可用于生产环境的版本(0.12或者0.22都不是)。不幸的是,Hadoop-0.20.2和最新的HBase稳定版本是不兼容的:如果你在Hadoop-0.20.2之上运行HBase,你会有丢失数据的风险!因此,HBase用户需要构建他们自己的Hadoop-0.20.X版本,如果他们想要在生产集群上运行HBase。这篇文章里,我将描述如何构建兼容HBase-0.90.2的为生产环境准备的Hadoop-0.20.X版本。

 

目录:

1.开始之前

      1.1.使用git(而不是SVN)

      1.2.Hadoop 0.20.2与0.20.203.0

      1.3.讨论了Hadoop,那HBase呢?

      1.4.这篇文章中使用的Hadoop-0.20-append版本

2.背景

      2.1.Hadoop和HBase:选择哪个版本用于生产集群?

      2.2.替代方案

3.一句小心和感谢的话

4.从branch-0.20-append构建Hadoop-0.20-append

      4.1.检索Hadoop-0.20-append源代码

      4.2.Hadoop-0.20.2与Hadoop-0.20-append的比较

      4.3.构建过程

            4.3.1.构建命令

            4.3.2.构建测试失败,怎么办?

            4.3.3.找到构建输出(Hadoop Jar文件)

      4.4.安装Hadoop-0.20-append到你的Hadoop集群

            4.4.1.如果你运行Hadoop-0.20.2,重命名构建的Jar文件

5.维护你自己的Hadoop-0.20-append版本

6.总结

 

2011年10月17日更新: 对于Hadoop-0.20.205.0版本(beta测试版),Hadoop已经支持HDFS的append/hsynch/hflush,因此兼容HBase-0.90.X版本。你仍然可以按照这篇文章里描述的指令构建你自己的Hadoop版本。
 

1.开始之前

1.1.使用git(而不是SVN)

在接下来的章节,我将使用git作为版本控制系统,来操作Hadoop源代码。为何?因为在我看来git比SVN好用的多,所以请谅解。

如果你使用SVN,欢迎修改以下描述的git命令。你可以为本文撰写关于SVN使用经验的评论,以便其他SVN用户也能从中获益。

 

1.2.Hadoop 0.20.2与0.20.203.0

2011年6月11日更新:在这篇文章发表后的几个星期,Hadoop-0.20.203.0和HBase-0.90.3就发布了。虽然文章里说的主要是Hadoop-0.20.2,构建指令应该同样适用于Hadoop-0.20.203.0,但我还没时间亲自验证这一点。如果你在构建过程中遇到了任何问题,欢迎在文章最后留下评论。

 

1.3.讨论了Hadoop,那HBase呢?

在这篇文章里,我集中在构建兼容HBase-0.90.2的Hadoop-0.20-X版本中(参见下文的阴影部分)。在稍后的文章里,我将描述如何在本文构建的Hadoop-0.20.X版本基础上,正确的安装和配置HBase-0.90.2。

 

1.4.这篇文章中使用的Hadoop-0.20-append版本

以下指令使用的是最新的branch-0.20-append。撰写本文时,git的最新提交是df0d79cc,而SVN的是1057313。作为参考,对应的提交信息是“HDFS-1554。支持recoverLease的新的语义。由Hairong Kuang提交。”在2011年1月10日。

commit df0d79cc2b09438c079fdf10b913936492117917
Author: Hairong Kuang
Date: Mon Jan 10 19:01:36 2011 +0000

HDFS-1554. New semantics for recoverLease. Contributed by Hairong Kuang.

git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/branches/branch-0.20-append@1057313 13f79535-47bb-0310-9956-ffa450edef68

这就是说,构建步骤在branch-0.20-append之后的任何版本都应该有效。

 

2.背景

2.1.Hadoop和HBase:选择哪个版本用于生产集群?

Hadoop-0.20.2是Apache Hadoop发布的最新的稳定版本,可用于生产环境的版本。不幸的是,Hadoop-0.20.2和最新的HBase稳定版本是不兼容的,比如HBase-0.90.2:如果你在未修改的Hadoop-0.20.2之上运行HBase-0.90.2,你很有可能丢失数据!

以下内容摘自HBase的文档,略有改动:

HBase-0.90.2只能在Hadoop 0.20.X之上运行。它无法在Hadoop-0.21.x (0.22.x也不行)上运行。HBase会丢失数据,除非它运行在拥有持久化同步(durable sync)的HDFS之上。当前只有branch-0.20-append拥有此属性。目前官方没有发布任何此分支的版本,因此你必须在这个分支的顶端构建你自己的Hadoop。

这里是快速总览:

Hadoop版本HBase版本兼容?
0.20.2版本0.90.2
0.20-append0.90.2
0.21.0版本0.90.2
0.22.X开发中0.90.2

 

说实话,在为Hadoop-0.20.X和HBase-0.90.2联姻的过程中,我花了相当长的时间在要求、依赖关系、工程状态等方面加快速度。因此我想通过这篇文章来回馈Hadoop和HBase社区。

 

2.2.替代方案

使HBase在Hadoop上运行的另一种方式——而不是通过构建自己的Hadoop-0.20-append——是使用Cloudera的CDH3。CDH3包含了Hadoop-0.20-append需要的持久化同步补丁,即可让Hadoop-0.20.X和HBase-0.90.2兼容。

 

3.一句警告和感谢的话

首先,警告:虽然在以下章节中我已经非常谨慎的编写和描述构建步骤,我还是不能给你任何保证。如果有疑问,通过HBase的邮箱列表加入我们的讨论。

第二,这里我只是将碎片拼凑在了一起,主要任务是由他人完成的。因此,我想感谢St.Ack,由于他在我准备这篇文章时候的重要反馈,也感谢来自他和所有邮箱列表中的HBase开发者们的帮助。非常感谢!

 

4.从branch-0.20-append构建Hadoop-0.20-append

4.1.检索Hadoop-0.20-append源代码

Hadoop-0.20.X没有像0.21.0以及之后的版本那样,拆分为Common、HDFS和MapReduce的组件。因而在Hadoop的公共代码库中你可以找到所有需要的代码。

所以第一步是检出Hadoop的公共代码库。

 

$ git clone http://git.apache.org/hadoop-common.git
$ cd hadoop-common
  

然而,git指令只检出了最新的Hadoop Common,即Hadoop Common开发的前沿。而我们只对代码树的Hadoop-0.20-append感兴趣,即分支branch-0.20-append。因为git默认不会从一个复制的代码库下载远端的分支,我们必须明确的指示它这样做:

 

# 检出Hadoop-0.20-append分支
# 只检出master tree (SVN的命令是trunk).
$ git checkout -t origin/branch-0.20-append
Branch branch-0.20-append set up to track remote branch branch-0.20-append from origin.
Switched to a new branch 'branch-0.20-append'
  

4.2.Hadoop-0.20.2与Hadoop-0.20-append的比较

到现在为止,你也许会问自己Hadoop的0.20.2版本和它的扩展分支到底有何分别。这就是答案:Hadoop-0.20-append分支实际上是Hadoop-0.20.2的超集。换句话说,Hadoop-0.20.2版本中没有哪一个“真正的”提交不在Hadoop-0.20-append里。这意味着Hadoop-0.20-append支持所有Hadoop-0.20.2版本的特性,棒极了!

运行以下git命令来验证这一点:

 

$ git show-branch release-0.20.2 branch-0.20-append
! [release-0.20.2] Hadoop 0.20.2 release
 * [branch-0.20-append] HDFS-1554. New semantics for recoverLease. Contributed by Hairong Kuang.
--
 * [branch-0.20-append] HDFS-1554. New semantics for recoverLease. Contributed by Hairong Kuang.
 * [branch-0.20-append^] HDFS-1555. Disallow pipelien recovery if a file is already being lease recovered. Contributed by Hairong Kuang.
 * [branch-0.20-append~2] Revert the change made to HDFS-1555: merge -c -1056483 https://svn.apache.org/repos/asf/hadoop/common/branches/branch-0.20-append
 * [branch-0.20-append~3] HDFS-1555. Disallow pipeline recovery if a file is already being lease recovered. Contributed by Hairong Kuang.
[...]
 * [branch-0.20-append~50] JDiff output for release 0.20.2
 * [branch-0.20-append~51] HADOOP-1849. Merge -r 916528:916529 from trunk to branch-0.20.
+  [release-0.20.2] Hadoop 0.20.2 release
+  [release-0.20.2^] Hadoop 0.20.2-rc4
+* [branch-0.20-append~52] Prepare for 0.20.2-rc4
 

如你所见,Hadoop-0.20.2版本只有两个提交不在branch-0.20-append,分别叫做“Hadoop 0.20.2 release”和“Hadoop 0.20.2-rc4”。这两个提交都是简单的提交标记,即它们只是用作版本管理,而不会对Hadoop的源代码进行任何改动。

 

4.3.构建过程

4.3.1.构建命令

首先,我们要创建build.properties文件(见完整说明)。

这是我的文件的内容:

 

#这个很重要
resolvers=internal
#可以修改这个为你认为合适的数值
version=0.20-append-for-hbase
project.version=${version}
hadoop.version=${version}
hadoop-core.version=${version}
hadoop-hdfs.version=${version}
hadoop-mapred.version=${version}

 

build.properties文件中的“version”键同样决定着生成的Hadoop Jar文件的名称。如果,你设置“version”为“0.20-append-for-hbase”,构建流程将生成名称为hadoop-core-0.20-append-for-hbase.jar的文件。基本上,你可以使用任何你喜欢的版本标记(当然如果它有意义的话更有帮助)。
  

build.properties文件必须被放在(或者可见)hadoop-common顶层目录下,类似/hadoop-common/build.properties。你既可以直接放置文件,也可以按照建议的方法,你将文件放置在一个父文件夹,然后创建一个它的快捷方式。后者更加方便,当你同样检出了Hadoop的子项目hadoop-hdfs和hadoop-mapreduce的代码库,因而想为这三个子项目使用同一个build.properties文件的时候。

 

$ pwd
/your/path/to/hadoop-common

# 创建和编辑build.properties文件
$ vi ../build.properties

# 创建它的系统链接
$ ln -s ../build.properties build.properties
 

现在我们已经准备好用ant从源代码编译Hadoop了。 我用的是Git And Hadoop中描述的ant mvn-install命令。构建本身应该只需要几分钟的时间。但是一定要运行ant test(或者仅仅是ant test-core,如果你很懒)需要注意的是测试需要相当长的时间(2小时,以我3年使用时间的MacBook Pro为例)。

 

# 明确你检出的是branch-0.20-append的源代码
$ git checkout branch-0.20-append

# 执行构建过程
$ ant mvn-install

# 可选:执行完全测试,或者仅执行核心测试
$ ant test
$ ant test-core 

 


如果你想重新运行构建或者构建测试:默认的,ant mvn-install输出构建结果到$HOME/.m2/repository。你重新编译的时候可能想删除$HOME/.m2/repository下上次的构建结果,例如通过rm -rf $HOME/.m2/repository。你可能还想执行ant clean-cache。从 Git And Hadoop了解更多细节。
 

 

4.3.2.构建测试失败,怎么办?

现在到了更加细致的部分:如果你通过ant test执行构建测试,你会发现构建测试总是失败!一致的错误报告是TestFileAppend4,且被记录到build/test/TEST-org.apache.hadoop.hdfs.TestFileAppend4.txt文件中。下面是测试输出的简短摘录:

 

2011-04-06 09:40:28,666 INFO  ipc.Server (Server.java:run(970)) - IPC Server handler 5 on 47574, call append(/bbw.test, DFSClient_1066000827) from 127.0.0.1:45323: error: org.apache.hadoop.hdfs.protocol.AlreadyBeingCreatedException: failed to create file /bbw.test for DFSClient_1066000827 on client 127.0.0.1, because this file is already being created by DFSClient_-95621936 on 127.0.0.1
        at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.recoverLeaseInternal(FSNamesystem.java:1202)
        at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.startFileInternal(FSNamesystem.java:1054)
        at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.appendFile(FSNamesystem.java:1221)
        at org.apache.hadoop.hdfs.server.namenode.NameNode.append(NameNode.java:396)
        [...]
        at org.apache.hadoop.ipc.Server$Handler.run(Server.java:955)
2011-04-06 09:40:28,667 INFO  hdfs.TestFileAppend4 (TestFileAppend4.java:recoverFile(161)) - Failed open for append, waiting on lease recovery

[...]
Testcase: testRecoverFinalizedBlock took 5.555 sec
	Caused an ERROR
No lease on /testRecoverFinalized File is not open for writing. Holder DFSClient_1816717192 does not have any open files.
org.apache.hadoop.hdfs.server.namenode.LeaseExpiredException: No lease on /testRecoverFinalized File is not open for writing. Holder DFSClient_1816717192 does not have any open files.
	at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.checkLease(FSNamesystem.java:1439)
        [...]
	at org.apache.hadoop.hdfs.TestFileAppend4$1.run(TestFileAppend4.java:636)

 

万幸的是,这个错误并不意味着构建无法执行。我们知道这是branch-0.20-append单元测试的问题(见St.Ack对HBASE-3258的评论)。换句话说,这是个人所共知的测试错误,我们可以忽略它。咻!

偶然的,你可能发生构建失败或者构建错误。在我的机器上,举例来说,我也见过以下测试失败:

 

  • org.apache.hadoop.hdfs.server.namenode.TestEditLogRace查看
  • org.apache.hadoop.hdfs.TestMultiThreadedSync查看

我不知道什么会导致这些偶然错误——可能是由于我的机器的问题。仍然在用它。

坦白的讲,我上面的话可能听着不舒服。至少是发生在我身上的。尽管如此,我从HBase邮箱列表收到的反馈说,Hadoop-0.20-append的以上构建过程需要被修正。

 

4.3.3.找到构建输出(Hadoop Jar文件)

默认的,通过ant mvn-install构建的Hadoop Jar文件被放置于$HOME/.m2/repository目录。你可以用以下命令找到Jar文件:

 

$ find $HOME/.m2/repository -name "hadoop-*.jar"

.../repository/org/apache/hadoop/hadoop-examples/0.20-append-for-hbase/hadoop-examples-0.20-append-for-hbase.jar
.../repository/org/apache/hadoop/hadoop-test/0.20-append-for-hbase/hadoop-test-0.20-append-for-hbase.jar
.../repository/org/apache/hadoop/hadoop-tools/0.20-append-for-hbase/hadoop-tools-0.20-append-for-hbase.jar
.../repository/org/apache/hadoop/hadoop-streaming/0.20-append-for-hbase/hadoop-streaming-0.20-append-for-hbase.jar
.../repository/org/apache/hadoop/hadoop-core/0.20-append-for-hbase/hadoop-core-0.20-append-for-hbase.jar

 

4.4.安装Hadoop-0.20-append到你的Hadoop集群

现在剩下的唯一一件事情,就是安装构建的Hadoop-0.20-append到你的集群。这一步非常简单:在你的Hadoop-0.20.2版本安装目录下,用以上创建的文件直接替换Hadoop Jar文件。你还需要在HBase-0.90.2安装目录下,用你创建的文件(如果你按照以上步骤创建,文件名是hadoop-core-0.20-append-for-hbase.jar)替换Hadoop core Jar文件($HBASE_HOME/lib/hadoop-core-0.20-append-r1056497.jar)。

 

因为这一步很重要,这里我再次强调:Hadoop所使用的Hadoop Jar文件和HBase使用的Hadoop jar文件必须匹配!

 

4.4.1.如果你运行Hadoop-0.20.2,重命名构建的Jar文件

2011年6月11日更新:如果你使用的是Hadoop-0.20.203.0版本,这一章节的指令不是必须执行的。

Hadoop-0.20.2版本Jar文件的命名规则是hadoop-VERSION-PACKAGE.jar,如hadoop-0.20.2-examples.jar。以上的构建过程采用不同的命名规则hadoop-PACKAGE-VERSION.jar,如hadoop-examples-0.20-append-for-hbase.jar。因此你可能想重命名以上章节构建的Jar文件,以符合Hadoop-0.20.2版本的命名规则(否则/bin/hadoop脚本无法添加Hadoop core Jar文件到它的CLASSPATH,同时那些Hadoop文档中的命令,如hadoop、jar、hadoop-*-examples.jar、pi 50 1000等也都无法执行)。

 

# 当你在Hadoop安装路径下替换Hadoop Jar文件,
# 你可能想要像这样重命名你的Hadoop-0.20-append Jar文件。
hadoop-examples-0.20-append-for-hbase.jar  --> hadoop-0.20-append-for-hbase-examples.jar
hadoop-test-0.20-append-for-hbase.jar      --> hadoop-0.20-append-for-hbase-test.jar
hadoop-tools-0.20-append-for-hbase.jar     --> hadoop-0.20-append-for-hbase-tools.jar
hadoop-streaming-0.20-append-for-hbase.jar --> hadoop-0.20-append-for-hbase-streaming.jar
hadoop-core-0.20-append-for-hbase.jar      --> hadoop-0.20-append-for-hbase-core.jar

 

与之相反,HBase采用hadoop-PACKAGE-VERSION.jar的规则。因此,当你在$HBASE_HOME/lib目录替换HBase附带的Hadoop core Jar文件时,你可以选择不修改新构建的Hadoop core Jar文件。

 

 

运行HBase-0.90.0或者0.90.1的用户注意:我们创建的Hadoop-0.20-append Jar文件是在 branch-0.20-append的基础上,因此使用的RPC版本是43。这在HBase-0.90.2是可用的,但在HBase-0.90.0和0.90.1将出问题。查看 HBASE-3520或者St.Ack的评论以获取更多信息。

 

 

5.维护你自己的Hadoop-0.20-append版本

如果你必须将一些额外的补丁集成到Hadoop-0.20.2或者Hadoop-0.20.append(通常是以Hadoop-0.21或者0.22的补丁的形式),你可以创建一个基于你感兴趣的Hadoop版本的本地分支。是的这是以你的名义做出的努力,所以你必须务必权衡利弊这样做。

想象一下,举例来说,你使用基于branch-0.20-append的Hadoop-0.20-append,因为你也想在你的Hadoop集群运行最新稳定版本的HBase。当对你的集群执行基准测试和压力测试的时候,不幸的是你发现一个问题,你可以追踪HDFS-611。有一个可用的补丁(你可能要做一些backport改动),但不是在你运行的Hadoop版本内,即该补丁不包含在branch-0.20-append代码库。

你可以做的是创建一个本地的基于你的Hadoop版本(这里是:branch-0.20-append)的git分支,你就可以集成和测试任何你需要的补丁。清理解,这里我仅描述基本的过程——我不会赘述在你遵照以下步骤的时候,如何才能确保和跟进的Hadoop版本的任何更新保持同步。有许多好用的git介绍,如Git Community Book,可以解释的比我透彻的多。

 

# 在下一步之前,确保我们是在branch-0.20-append的基础上
$ git checkout branch-0.20-append

# 在官方最新版本的branch-0.20-append的基础上创建你的本地分支
$ git checkout -b branch-0.20-append-yourbranch

 

 

确保当前的两个append分支是一致的:

 

# 检验你本地的分支和官方的分支是一致的
$ git show-branch branch-0.20-append branch-0.20-append-yourbranch
! [branch-0.20-append] HDFS-1554. New semantics for recoverLease. Contributed by Hairong Kuang.
 * [branch-0.20-append-yourbranch] HDFS-1554. New semantics for recoverLease. Contributed by Hairong Kuang.
--
+* [branch-0.20-append] HDFS-1554. New semantics for recoverLease. Contributed by Hairong Kuang.

# 还好,它们是一致的

 

 

将补丁应用到你的分支。在下面的例子中,我使用HDFS-611.branch-0.20-append.v1.patch文件,应用HDFS-611补丁的backport到branch-0.20-append。注意这个backport在HDFS-611页面是不存在的——我在HDFS-611的Hadoop-0.20.2版本补丁的基础上创建了它(HDFS-611.branch-20.v6.patch)。

# 应用补丁到你的分支
$ patch -p1 < HDFS-611.branch-0.20-append.v1.patch

# 从补丁添加任何改动或者新增文件到git索引
$ git add src/hdfs/org/apache/hadoop/hdfs/protocol/FSConstants.java \
         src/hdfs/org/apache/hadoop/hdfs/server/datanode/FSDataset.java \
         src/hdfs/org/apache/hadoop/hdfs/server/datanode/FSDatasetAsyncDiskService.java \
         src/test/org/apache/hadoop/hdfs/TestDFSRemove.java

# 从索引提交改动到代码库
$ git commit -m "HDFS-611: Backport of HDFS-611 patch for Hadoop 0.20.2 release"

 

确认你打过补丁的分支比原本的append分支多一次提交:

# 比较你本地append分支和远端分支的历史记录
$ git show-branch branch-0.20-append branch-0.20-append-yourbranch
! [branch-0.20-append] HDFS-1554. New semantics for recoverLease. Contributed by Hairong Kuang.
 * [branch-0.20-append-yourbranch] HDFS-611: Backport of HDFS-611 patch for Hadoop 0.20.2 release
--
 * [branch-0.20-append-yourbranch] HDFS-611: Backport of HDFS-611 patch for Hadoop 0.20.2 release
+* [branch-0.20-append] HDFS-1554. New semantics for recoverLease. Contributed by Hairong Kuang.

# 没错,只是多了一步提交

 

顺便说一句,如果你想看看Hadoop-0.20.2版本,官方branch-0.20-append和你自己打过补丁的branch-0.20-append-yourbranch之间的区别,执行以下git指令:

$ git show-branch release-0.20.2 branch-0.20-append branch-0.20-append-yourbranch

 

6.总结

我希望这篇文章能帮助你构建能在生产环境运行HBase-0.90.2的Hadoop-0.20.X版本。一如既往欢迎你的反馈和评论。

 

*****************

南邮福富实验室

wuxiaochao@live.com

*****************

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值