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相信對大家的幫助更大唄~
沒有留言:
張貼留言