首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 开源软件 >

替HBase-0.90.2构建Hadoop-0.20.X

2012-08-07 
为HBase-0.90.2构建Hadoop-0.20.X以下翻译自《Building an Hadoop 0.20.x version for HBase 0.90.2》(2011

为HBase-0.90.2构建Hadoop-0.20.X

以下翻译自《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.总结

?

$ 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-appendBranch 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-hbaseproject.version=${version}hadoop.version=${version}hadoop-core.version=${version}hadoop-hdfs.version=${version}hadoop-mapred.version=${version}

?

$ 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?

?

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 secCaused an ERRORNo 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.jarhadoop-test-0.20-append-for-hbase.jar      --> hadoop-0.20-append-for-hbase-test.jarhadoop-tools-0.20-append-for-hbase.jar     --> hadoop-0.20-append-for-hbase-tools.jarhadoop-streaming-0.20-append-for-hbase.jar --> hadoop-0.20-append-for-hbase-streaming.jarhadoop-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文件。

?

?

# 在下一步之前,确保我们是在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

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

热点排行