2012年2月20日 星期一

Hadoop-0.20.x 本機測試

由於最近takeshi的專案主要是基於Hadoop和HBase平台上開發應用,所以不免俗地,我們需要對我們的應用作功能性上的測試;要執行我們的測試程式,必須要有以下步驟...

1. 必須要在環境中架一個Hadoop + HBase的cluster
2. 並且要在此cluster倒入事先定義好的測試資料
3. 接著在我們專案的maven pom檔中,把相關參數(Zookeeper的IP和port)設定好
4. 執行測試(也就是執行mvn clean verify)
5. 之後maven會幫我們執行所有的單元測試和整合測試,可以經過驗證輸出的值(assertion),來確認程式運作是否合乎我們預期

上述流程跑起來還算順暢,但仍有以下幾點會造成我們的困擾

1. 當其他團隊要參與我們的專案時,必須要跟我們索取測試資料(20GB... XD),並倒在HBase裡

2. 測試程式出錯時,很難debug!因為程式會被copy到參與工作的遠端節點再執行(分散式運算);所以developer在IDE中,對於想要debug的程式主要邏輯區塊下中斷點(breakpoint)時,往往都攔截不到執行緒(running thread),因為這些程式主要邏輯區塊都是在遠端節點執行的!

上述的第2點,是我們非常頭痛的issue,因為專案的商業邏輯越來越複雜,假如不能對這些程式主要邏輯區塊作debug的話,之後會嚴重拖慢開發進度>"<

也因此takeshi花了不少時間,看了相關書籍和網站,最後終於找到解法了!原來不論是Hadoop或是HBase,他們自己在開發的時候,也有相關的困擾,所以寫了一些類別,來專門在測試程式中起在本機跑的mini-cluster,因為是在同一個VM的instance,所以developer也有辦法對Hadoop或是HBase的cluster作debug囉!

不過這次takeshi先分享Hadoop的部分,之後再分享HBase的部分囉~

前提
1. 我們專案使用的環境是Hadoop-0.20.203.0
2. 本解法參考自書籍 Hadoop: The Definitive Guide, Second Edition,作者Tom White的sample code在這裡

準備工作
1.如果是windows環境的朋友,要請你們先安裝cygwin,載點在這裡
1.1 安裝完畢後,必須要把%CYGWIN_HOME% \bin路徑,加到PATH環境變數中
1.2 因為hadoop主要還是在unix-like的環境上執行,所以必須要在wnidows上模擬unix-like環境

2. 把作者的sample code import到IDE中(takeshi使用的是eclipse),並且把以下jar檔加入到build path裡

hadoop-0.20.2
hadoop-0.20.2-ant.jar
hadoop-0.20.2-core.jar
hadoop-0.20.2-examples.jar
hadoop-0.20.2-test.jar
hadoop-0.20.2-tools.jar

lib\commons-cli-1.2.jar
lib\commons-codec-1.3.jar
lib\commons-el-1.0.jar
lib\commons-httpclient-3.0.1.jar
lib\commons-logging-1.0.4.jar
lib\commons-logging-api-1.0.4.jar
lib\commons-net-1.4.1.jar
lib\core-3.1.1.jar
lib\hsqldb-1.8.0.10.jar
lib\jasper-compiler-5.5.12.jar
lib\jasper-runtime-5.5.12.jar
lib\jets3t-0.6.1.jar
lib\jetty-6.1.14.jar
lib\jetty-util-6.1.14.jar
lib\junit-3.8.1.jar
lib\kfs-0.2.2.jar
lib\log4j-1.2.15.jar
lib\mockito-all-1.8.0.jar
lib\oro-2.0.8.jar
lib\servlet-api-2.5-6.1.14.jar
lib\slf4j-api-1.4.3.jar
lib\slf4j-log4j12-1.4.3.jar
lib\xmlenc-0.52.jar

apache-tomcat-6.0.32
lib\jsp-api.jar
lib\servlet-api.jar

hamcrest-1.3.0RC2
hamcrest-all-1.3.0RC2.jar

以上的jar檔應該還可以再作刪減,或是應該可以再整理成maven pom檔, 但 takeshi很懶沒有做這個動作啦:p

眼明的朋友應該發現到為啥takeshi include的jar檔是hadoop-0.20.2,而不是hadoop-0.20.203.0,因為203的版本在windows上跑mini-cluster會出錯誤(不過討論網頁的連結在哪takeshi突然找不到了XD),所以takeshi是使用0.20.2來跑mini-cluster的;如果朋友們有其他的解,也請教一下takeshi喔

MiniDFSCluster
可以在本機起HDFS的mini-cluster instance,方便developer作本機debug,API doc在這邊,接著看看剛剛import的sample code專案中的ch03/src/main/java/路徑的CoherencyModelTest.java檔案,使用以下方式來啟動MiniDFSCluster類別

public class CoherencyModelTest {
  // use an in-process HDFS cluster for testing
  private MiniDFSCluster cluster;

  private FileSystem fs;

  @Before
  public void setUp() throws IOException {
    Configuration conf = new Configuration();
    //config parameters setting for test
    if (System.getProperty("test.build.data") == null) {
      System.setProperty("test.build.data", "/tmp");
    }
    cluster = new MiniDFSCluster(conf, 1, true, null);
    fs = cluster.getFileSystem();
  }
  
  @After
  public void tearDown() throws IOException {
    fs.close();
    //shutdown HDFS cluster
    cluster.shutdown();
  }

  //put your test codes below...

}


ClusterMapReduceTestCase
它是一個抽象測試類別,使用JUnit3的架構來啟動(當然JUnit4也可以使用囉),它預設會在本機起一個包含兩個節點的mini-cluster instance,方便developer作本機mapReduce 測試和debug,API doc在這邊,接著看看剛剛import的sample code專案中的ch05/src/main/java/v3/路徑的ClusterMapReduceTestCase.java檔案,使用以下方式來啟動此測試類別


// A test for MaxTemperatureDriver that runs in a "mini" HDFS and MapReduce cluster
public class MaxTemperatureDriverMiniTest extends ClusterMapReduceTestCase {
  
  @Override
  protected void setUp() throws Exception {
    //config setting for testcase
    if (System.getProperty("test.build.data") == null) {
      System.setProperty("test.build.data", "/tmp");
    }
    if (System.getProperty("hadoop.log.dir") == null) {
     System.setProperty("hadoop.log.dir", "/build/test/logs");
   }
    super.setUp();
  }

  //no need to extends the tearDown method due to the super-class handles it for you
  //protected void tearDown() throws Exception


  // Not marked with @Test since ClusterMapReduceTestCase is a JUnit 3 test case
  public void test() throws Exception {
    //...put your test code here
  }
}

細節的部分就請各位朋友去參考程式碼和書籍囉~

以下影片是takeshi在自己本機跑mini-cluster的情形,供大家參考囉~


最後takeshi在專案中採用的是使用HBase的解法(打算下一篇會寫),所以hadoop的source code就沒特別整理了,不過直接使用Tom White的source code,takeshi相信對大家的幫助更大唄~

沒有留言:

張貼留言