hama源代码编译与调试

Hama是最近Apache开源项目中比较活跃的项目,目前刚刚成为Apache Top Level Project。本文主要讲述Hama开发和调试流程。

本文用到的Hama是0.5.0版、Maven是3.0.4版、Eclipse是Eclipse Eclipse Java EE Indigo 3.7.2、OS是Fedora 3.4.4-3.fc17.x86_64。

准备工作

Hama是Apache开源项目,可以通过svn或git获取开发中的源码。Hama项目组使用JIRA进行项目管理和协作、Maven进行源码级的项目管理和构建、Jenkins作为持续集成构建。 Hama的编程语言是java,IDE一般使用Eclipse。

Hama Source Code

Latest Source Code

# subversion
https://svn.apache.org/repos/asf/hama/trunk
 
# git
git://git.apache.org/hama.git

Latest Released Source Code

Download Source Code

我们这里通过SVN获取Hama最新源开发中代码,直接把代码放在Eclipse的Workspace下,如:/home/micle/workpace

$ pwd
/home/micle/workspace
 
### check out
$ svn checkout  https://svn.apache.org/repos/asf/hama/trunk hama-trunk
# or
$ svn co  https://svn.apache.org/repos/asf/hama/trunk hama-trunk
 
### update
$ svn update  https://svn.apache.org/repos/asf/hama/trunk hama-trunk

Maven

Hama项目组使用 Maven对Hama进行管理和构建。Apache Maven的角色类似于make和ant,是个项目构建和管理工具,但它更强大、更易于使用。

下载Maven: http://maven.apache.org/download.html,文章发表时Maven最新版是3.0.4,下载apache-maven-3.0.4-bin.tar.gz。

$ sudo tar zxvf apache-maven-3.0.4-bin.tar.gz -C /usr/local/public/develop/eclipse/
 
# Maven环境变量,并添加到PATH中
# /etc/profile
Maven='/usr/local/public/develop/eclipse/apache-maven-3.0.4/bin'
export PATH=$PATH:$Maven

Eclipse

下载Eclipse IDE for Java Developers即可。

Hama Development

Eclipse工程

configure-workspace

$ mvn -Declipse.workspace="/home/micle/workspace/" eclipse:configure-workspace

请将/home/micle/workspace/替换成你自己的Eclipse工作区。
使用mvn时,需要联网,用于下载相应的Plugin。

Terminal Output

检查M2_REPO变量是否已经添加到build的classpath中,如果有则说明成功:

Select Window > Preferences
Select Java > Build Path > Classpath Variables

Maven构建

Maven构建包括Hama所有组件的构建和测试,目的在于确保当前源码工作正常,以便于在此基础上进行开发。

$ mvn install
 
# mvn install failed, such as
# [ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.6:
# test (default-test) on project hama-core: 
#         There are test failures.
# 原因:可能是Maven与maven-surefire-plugin的版本不匹配造成的,可以尝试修改POM.xml中maven-surefire-plugin版本。
# 解决:Maven 3.0.4在maven-surefire-plugin版本2.6时会报上面的错,而2.7则测试正常。
 
# 或者可以跳过测试:
# $ mvn clean install package -DskipTests
Terminal Output

当然也可以与官方的测试报告和构建输出进行对比:

生成Eclipse工程文件

$ mvn eclipse:eclipse

如果一切正常,会在Hama的每个部分,如core,生成Eclipse工程文件,包括: .classpath, .project, .setting

现在可以在Eclipse中导入Hama工程了:

File -> Import -> Existing Projects into Workspace -> 
Choose your workspace as the root directory and import the hama-* projects.

Hama Debug

使用Local 模式

一般使用Local模式对Hama进行调试。Hama默认模式即是Local模式,当然也可以在程序中设置conf变量,conf.set(“bsp.master.address”, “local”)。

使用Hama Log

Hama使用日志库Apache log4j的LOG来记录输出信息。LOG按等级从低到高OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL,Hama默认的LOG等级是INFO,也就是说只有FATAL、ERROR、WARN、INFO才会输出,因此调试时,使用INFO这一级的日志输出。Apache log4j的配置文件是$HAMA_HOME/conf/log4j.properties。

LOG.info("INFO: This is a test!");

开始调试

下面以修改core/src/main/java/org/apache/hama/bsp/BSPJobClient.java为例,我们在606行添加了一个LOG:

602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
public boolean monitorAndPrintJob(BSPJob job, RunningJob info)
      throws IOException, InterruptedException {
    String lastReport = null;
    LOG.info("Running job: " + info.getID());
    LOG.info("INFO: This is a debug hoho test!");
 
    int eventCounter = 0;
 
    while (!job.isComplete()) {
      Thread.sleep(3000);
      long step = job.progress();
      String report = "";
 
      report = "Current supersteps number: " + step;
 
      if (!report.equals(lastReport)) {
        LOG.info(report);
        lastReport = report;
      }
 
      TaskCompletionEvent[] events = info.getTaskCompletionEvents(eventCounter);
      eventCounter += events.length;
 
      for (TaskCompletionEvent event : events) {
        if (event.getTaskStatus() == TaskCompletionEvent.Status.FAILED) {
 
          // Displaying the task logs
          displayTaskLogs(event.getTaskAttemptId(), event.getGroomServerInfo());
        }
      }
    }
 
    if (job.isSuccessful()) {
      LOG.info("The total number of supersteps: " + info.getSuperstepCount());
      info.getStatus()
          .getCounter()
          .incrCounter(BSPPeerImpl.PeerCounter.SUPERSTEPS,
              info.getSuperstepCount());
      info.getStatus().getCounter().log(LOG);
    } else {
      LOG.info("Job failed.");
    }
 
    return job.isSuccessful();
}

完成修改后,添加测试用例,这里使用:core/src/test/java/org/apache/hama/bsp/TestLocalRunner.java,然后使用Eclipse的Debugger进行调试:

Run --> Debug As --> JUnit Test

即可马上看到调试结果了。

Debug Hama in Eclipse

Debug Hama in Eclipse

Hama重新构建

在对Hama作了修改之后,如果需要发布对应的jar包,则需要重新构建已修改的那个component,这里重新构建core:

$ cd core
# ignore tests
$ mvn package -DskipTests

重新构建好的jar包在core/target目录中。

参考

[1] Hama Developers Guide: http://hama.apache.org/developers.html
[2] Hama HowToContribute: http://wiki.apache.org/hama/HowToContribute
[3] Hama集群配置与测试: http://www.oriovo.com/cloud/hama-cluster.html


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值