[[PageOutline]] = Map Reduce in Hadoop/HBase Manual (開發手冊) = = 一、介紹 = Title: 雲端技術開發[[BR]] Research Group : NCHC Cloud Technique Development Group[[BR]] Editor : Waue Chen、Sunny、Chwhs、Zsjheng[[BR]] == 1.1 簡介 == * 近來雲端技術這個名詞由Google、Yahoo這兩個網路龍頭的推波助瀾而颳起旋風,連微軟也宣稱下一代的作業系統為"雲端系統",因此雲端技術勢必為新的趨勢。國網中心為台灣重要的電腦技術研究中心,因此成立團隊開啟雲端技術的研究。[[BR]] * 本篇文章探討開源碼專案Hadoop以及HBase,第一章從概念開始介紹起,並在第二、三章詳細的說明如何安裝、設定及運行;第四章探討此系統的效能測試;前一部分介紹如何使用,後一部分開始偏重如何編寫Map Reduce的程式,因此在第五章介紹如何透過Eclipse建立起編程環境;第六章探討Map-Reduce的範例程式碼,最後附上相關連結。 == 1.2 雲端運算 == 雲端運算(cloud computing),分散式運算技術的一種,其最基本的概念,是透過網路將龐大的運算處理程序自動分拆成無數個較小的子程序,再交由多部伺服器所組成的龐大系統經搜尋、運算分析之後將處理結果回傳給用戶。透過這項技術,網路服務提供者可以在數秒之內,達成處理數以千萬計甚至億計的資訊,達到和「超級電腦」同樣強大效能的網路服務。[[BR]] 最簡單的雲端運算技術在網路服務中已經隨處可見,例如搜尋引擎,使用者只要輸入簡單指令即能得到大量資訊。 然而大規模分散式運算技術即為「雲端運算」的概念起源,未來如手機、GPS等行動裝置都可以透過雲端運算技術,發展出更多的應用服務。 進一步的雲端運算不僅只做資料搜尋、分析的功能,未來如分析DNA結構、基因圖譜定序、解析癌症細胞等,都可以透過這項技術輕易達成。 [http://zh.wikipedia.org/wiki/%E9%9B%B2%E7%AB%AF%E9%81%8B%E7%AE%97 copied by wikipedia] == 1.3 Hadoop == 談到Hadoop就不得不提到Lucene和Nutch。首先,Lucene並不是一個應用程序,而是提供了一個純Java的高性能全文索引引擎工具包,它可以方便的嵌入到各種實際應用中實現全文搜索/索引功能。Nutch是一個應用程序,是一個以Lucene為基礎實現的搜索引擎應用,Lucene 為Nutch提供了文本搜索和索引的API,Nutch不光有搜索的功能,還有數據抓取的功能。在nutch0.8.0版本之前,Hadoop還屬於 Nutch的一部分,而從nutch0.8.0開始,將其中實現的NDFS和!MapReduce剝離出來成立一個新的開源項目,這就是Hadoop,而 nutch0.8.0版本較之以前的Nutch在架構上有了根本性的變化,那就是完全構建在Hadoop的基礎之上了。在Hadoop中實現了 Google的GFS和!MapReduce算法,使Hadoop成為了一個分佈式的計算平台。[[BR]] 其實,Hadoop並不僅僅是一個用於存儲的分佈式文件系統,而是設計用來在由通用計算設備組成的大型集群上執行分佈式應用的框架。[[BR]] Hadoop包含兩個部分: * HDFS (Hadoop Distributed File System) (Hadoop分佈式文件系統) HDFS 具有高容錯性,並且可以被部署在低價的硬件設備之上。HDFS很適合那些有大數據集的應用,並且提供了對數據讀寫的高吞吐率。HDFS是一個 master/slave的結構,就通常的部署來說,在master上只運行一個Namenode,而在每一個slave上運行一個Datanode。[[BR]] HDFS 支持傳統的層次文件組織結構,同現有的一些文件系統在操作上很類似,比如你可以創建和刪除一個文件,把一個文件從一個目錄移到另一個目錄,重命名等等操作。Namenode管理著整個分佈式文件系統,對文件系統的操作(如建立、刪除文件和文件夾)都是通過Namenode來控制。 * !MapReduce的實現 !MapReduce是Google 的一項重要技術,它是一個編程模型,用以進行大數據量的計算。對於大數據量的計算,通常採用的處理手法就是並行計算。至少現階段而言,對許多開發人員來說,並行計算還是一個比較遙遠的東西。!MapReduce就是一種簡化並行計算的編程模型,它讓那些沒有多少並行計算經驗的開發人員也可以開發並行應用。[[BR]] !MapReduce的名字源於這個模型中的兩項核心操作:Map和 Reduce。也許熟悉Functional Programming(函數式編程)的人見到這兩個詞會倍感親切。簡單的說來,Map是把一組數據一對一的映射為另外的一組數據,其映射的規則由一個函數來指定,比如對[1, 2, 3, 4]進行乘2的映射就變成了[2, 4, 6, 8]。Reduce是對一組數據進行歸約,這個歸約的規則由一個函數指定,比如對[1, 2, 3, 4]進行求和的歸約得到結果是10,而對它進行求積的歸約結果是24。 [http://www.cnblogs.com/wayne1017/archive/2007/03/18/668768.html copied from Hadoop學習筆記一簡要介紹] == 1.4 HBase == HBase是Hadoop中的一個簡單數據庫。它與Google的Bigtable特別相似。[[BR]] HBase數據庫使用了和Bigtable非常相似的數據模型。用戶在表格里存儲許多數據行。每個數據行都包括一個可排序的關鍵字,和任意數目的列。表格是稀疏的,所以同一個表格里的行可能有非常不同的列,只要用戶喜歡這樣做。[[BR]] 列名是「<族名>:<標籤>」形式,其中<族名 >和<標籤>可以是任意字符串。[[BR]] 一個表格的<族名>集合(又叫「列族」集合)是固定的,除非你使用管理員權限來改變表格的列族。不過你可以在任何時候添加新的<標籤>。HBase在磁盤上按照列族儲存數據,所以一個列族裡的所有項應該有相同的讀/寫方式。[[BR]] 寫操作是行鎖定的,你不能一次鎖定多行。所有對行的寫操作默認是原子的。[[BR]] 所有數據庫更新操作都有時間戳。HBase對每個數據單元,只存儲指定個數的最新版本。客戶端可以查詢「從某個時刻起的最新數據」,或者一次得到所有的數據版本。 [http://tech.ccidnet.com/art/5833/20080318/1393525_1.html copied from 詳細講解HBase] = 二、環境設定 = 所對應到的路徑為 || Name || Path || || Java Home || /usr/lib/jvm/java-6-sun || || Hadoop Home || /home/waue/workspace/hadoop/ || || Hbase Home || /home/waue/workspace/hbase/ || 節點 || node name || server || || cloud1 || v || || cloud2 || || || cloudn || || == 2.1 準備 == 系統 : * Ubuntu 7.10 * Hadoop 0.16 * Hbase 0.1.3 ps : 若要升級則需要兩者都升級 hbase 0.1.4 <--> hadoop 0.2.0 * Eclipse (3.2.2) {{{ $ apt-get install eclipse }}} java 6 {{{ $ apt-get install sun-java6-bin sun-java6-jdk sun-java6-jre sun-java6-plugin }}} 建議刪除原本的 「 gcj 」 {{{ $ apt-get purge java-gcj-compat }}} 加入以下內容到 /etc/bash.bashrc {{{ export JAVA_HOME=/usr/lib/jvm/java-6-sun export HADOOP_HOME=/home/waue/workspace/hadoop/ export HBASE_HOME=/home/waue/workspace/hbase/ export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar }}} == 2.2 Hadoop Setup == * Generate an SSH key for the user {{{ $ ssh-keygen -t rsa -P "" $ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys $ ssh cloud1 $ exit }}} * Installation Hadoop {{{ $ cd /home/waue/workspace $ sudo tar xzf hadoop-0.16.3.tar.gz $ sudo ln -sf hadoop-0.16.3 hadoop $ sudo chown -R waue:waue hadoop $ cd hadoop }}} * Configuration * 編輯 hadoop-env.sh ($HADOOP_HOME/conf/) Change {{{ # The java implementation to use. Required. # export JAVA_HOME=/usr/lib/j2sdk1.5-sun }}} to {{{ # The java implementation to use. Required. export JAVA_HOME=/usr/lib/jvm/java-6-sun export HADOOP_HOME=/home/waue/workspace/hadoop export HBASE_HOME=/home/waue/workspace/hbase export HADOOP_LOG_DIR=$HADOOP_HOME/logs export HADOOP_SLAVES=$HADOOP_HOME/conf/slaves export HADOOP_CLASSPATH= $HBASE_HOME/hbase-0.1.3.jar:$HBASE_HOME/conf }}} ps. HADOOP_CLASSPATH 要設hbase 的環境,而HBASE_CLASSPATH要設hadoop的環境, 有了這行可以解決編譯hbase 程式時出現run time error * hadoop-site.xml ($HADOOP_HOME/conf/)[[BR]] modify the contents of conf/hadoop-site.xml as below {{{ fs.default.name cloud1:9000 mapred.job.tracker cloud1:9001 dfs.replication 1 }}} * multi-nodes mode $ vim conf/master {{{ cloud1 }}} $ vim conf/slaves {{{ cloud1 cloud2 cloudn }}} == 2.3 Hbase Setup == * 編輯conf/hbase-env.sh檔案 {{{ $ cd /home/waue/workspace/hbase $ vi conf/hbase-env.sh export JAVA_HOME=/usr/lib/jvm/java-6-sun CLASSPATH=/home/waue/workspace/hadoop/conf }}} * 編輯 conf/hbase-site.xml檔案如下 {{{ hbase.master cloud1:60000 hbase.master.info.bindAddress cloud1 The address for the hbase master web UI hbase.regionserver.info.bindAddress cloud1 The address for the hbase regionserver web UI hbase.rootdir file:///tmp/hbase-${user.home}/hbase hdfs://cloud1:9000/hbase The directory shared by region servers. Should be fully-qualified to include the filesystem to use. }}} * 複製檔案 {{{ $ cd $HBASE_HOME/ $ cp hbase-0.1.3.jar $HADOOP_HOME/lib $ cp conf/hbase-site.xml $HADOOP_HOME/conf }}} * 多nodes模式,編輯 conf/regionservers檔案,如下 {{{ cloud1 cloud2 cloudn }}} == 2.4 其他nodes的設定 == * Method1: Copy configured data to all nodes * cloud1 --> cloud2 {{{ scp -r /home/waue/workspace/hadoop waue@cloud2:/home/waue/workspace/ scp -r /home/waue/workspace/hbase waue@cloud2:/home/waue/workspace/ scp -r /etc/hosts root@cloud2:/etc/ }}} * Method2: Use wonderful DRBL = 三、執行 = == 3.1 Start Up Hadoop == $ cd $HADOOP_HOME [[br]] $ bin/hadoop namenode -format [[br]] {{{ 08/05/23 14:52:16 INFO dfs.NameNode: STARTUP_MSG: /************************************************************ STARTUP_MSG: Starting NameNode STARTUP_MSG: host = Dx7200/127.0.1.1 STARTUP_MSG: args = [-format] STARTUP_MSG: version = 0.16.4 STARTUP_MSG: build = http://svn.apache.org/repos/asf/hadoop/core/branches/branch-0.16 -r 652614; compiled by 'hadoopqa' on Fri May 2 00:18:12 UTC 2008 ************************************************************/ 08/05/23 14:52:17 INFO fs.FSNamesystem: fsOwner=waue,waue,adm,dialout,cdrom,floppy,audio,dip,video,plugdev,staff,scanner,lpadmin,admin,netdev,powerdev,vboxusers 08/05/23 14:52:17 INFO fs.FSNamesystem: supergroup=supergroup 08/05/23 14:52:17 INFO fs.FSNamesystem: isPermissionEnabled=true 08/05/23 14:52:17 INFO dfs.Storage: Storage directory /tmp/hadoop-waue/dfs/name has been successfully formatted. 08/05/23 14:52:17 INFO dfs.NameNode: SHUTDOWN_MSG: /************************************************************ SHUTDOWN_MSG: Shutting down NameNode at Dx7200/127.0.1.1 ************************************************************/ }}} $ /bin/start-all.sh [[br]] {{{ starting namenode, logging to /home/waue/workspace/hadoop/logs/hadoop-waue-namenode-Dx7200.out cloud1: starting datanode, logging to /home/waue/workspace/hadoop/logs/hadoop-waue-datanode-Dx7200.out cloud1: starting secondarynamenode, logging to /home/waue/workspace/hadoop/logs/hadoop-waue-secondarynamenode-Dx7200.out starting jobtracker, logging to /home/waue/workspace/hadoop/logs/hadoop-waue-jobtracker-Dx7200.out cloud1: starting tasktracker, logging to /home/waue/workspace/hadoop/logs/hadoop-waue-tasktracker-Dx7200.out }}} * Then make sure http://cloud1:50030/ by your explorer is on going. [[br]] * Ps : if your system had error after restart, you could do there for resolving and renewing one. And repeat to 「4. start up Hadoop」 {{{ $ cd $HADOOP_HOME $ bin/stop-all.sh $ rm -rf /tmp/* $ rm -rf logs/* }}} == 3.2 Start Up Hbase == {{{ cd $HBASE_HOME $ bin/start-hbase.sh }}} * 可以在預設的logs/目錄下看到不少logs檔案 * 可以執行以下指令進到HQL指令模式,可以試試看 {{{ $ bin/hbase shell Hbase Shell, 0.0.2 version. Copyright (c) 2007 by udanax, licensed to Apache Software Foundation. Type 'help;' for usage. hql > }}} * 要結束hbase server 可用以下指令,而避免使用kill pid指令來殺掉pid,尤其是恐怖的指令kill -9 pid {{{ $ bin/stop-hbase.sh }}} * 解釋: kill -9 是當 kill -15 砍不掉的時候 才用,kill -15 會去幫你注意檔案或裝置讀寫有沒有關起來,kill -9 就不管,直接停掉process (reference from sunny) = 四、效能測試 = {{{ [stack@aa0-000-12 ~]$ ./hadoop-trunk/src/contrib/hbase/bin/hbase org.apache.hadoop.hbase.PerformanceEvaluation Usage: java org.apache.hadoop.hbase.PerformanceEvaluation[--master=host:port] [--miniCluster] Options: master Specify host and port of HBase cluster master. If not present, address is read from configuration miniCluster Run the test on an HBaseMiniCluster Command: randomRead Run random read test randomReadMem Run random read test where table is in memory randomWrite Run random write test sequentialRead Run sequential read test sequentialWrite Run sequential write test scan Run scan test Args: nclients Integer. Required. Total number of clients (and HRegionServers) running: 1 <= value <= 500 Examples: To run a single evaluation client: $ bin/hbase org.apache.hadoop.hbase.PerformanceEvaluation sequentialWrite 1 }}} (from [http://wiki.apache.org/hadoop/Hbase/PerformanceEvaluation#0_1_2 http://wiki.apache.org/hadoop/Hbase/PerformanceEvaluation#0_1_2 ]) = 五、開發程式 = * [http://trac.nchc.org.tw/cloud/browser/hadoop-eclipse.pdf 可以參考Programming hadoop in Eclipse .pdf] == 5.1 install IBM !MapReduce tool == 1. Download the IBM !MapReduce Tools zip file and extract to /tmp/. [[br]] 2. Make sure Eclipse is closed and ... [[br]] {{{ $ cd /tmp/ $ unzip mapreduce_tools.zip $ mv plugins/com.ibm.hipods.mapreduce* /usr/lib/eclipse/plugins/ }}} 3. Restart Eclipse [[br]] Check IBM !MapReduce Tools plugin installing well [[br]] {{{ Eclipse File > New > Project see MapReduce category }}} == 5.2 Eclipse configure == {{{ Eclipse Window > Preferences > java> compiler set compiler compliance level to 5.0 }}} * Some eclipse-plugin may exhaust much resource, you may happen to 「out of memory error」. We suggest to execute eclipse with some parameters as that : {{{ $ eclipse -vmargs -Xmx 512m }}} == 5.3. Run on Eclipse == === 5.3.1 map-reduce sample code === {{{ Eclipse File > new > project > map-reduce project > next > project name : sample use default location : V use default Hadoop : V > Finish }}} * at 「Project explorer」, you will see 「sample」 tree. Now, you should create a sample code. {{{ Eclipse right click sample > new > file > file name : WordCount.java }}} * the sample code is here [http://trac.nchc.org.tw/cloud/attachment/wiki/hadoop-sample-code/WordCount.java] * paste the contents to your new adding file 「!WordCount.java」 === 5.3.2. Connect to Hadoop File System === * Enable the !MapReduce servers window {{{ Eclipse Window > Show View > Other... > MapReduce Tools > MapReduce Servers }}} * At the bottom of your window, you should have a "!MapReduce Servers" tab. If not, see second bullet above. Switch to that tab. * At the top right edge of the tab, you should see a little blue elephant icons. {{{ Eclipse Click blue elephant to add a new MapReduce server location. Server name : any_you_want Hostname : cloud1 Installation directory: /home/waue/workspace/nutch/ Username : waue }}} * If any password prompt, please input the password which you login to local * It should show up under a little elephant icon in the Project Explorer (on the left side of Eclipse). * ps : Pleast make sure your Hadoop is working on local system. If not, please refer 「session 2 Hadoop Setup」 for debuging, or you can not pass through. {{{ $ cd /home/waue/workspace/hadoop/ [[br]] $ wget http://www.gutenberg.org/etext/132/132.txt [[br]] $ bin/hadoop dfs -mkdir input [[br]] $ bin/hadoop dfs -ls [[br]] Found 1 items /user/waue/input 2008-05-23 15:15 rwxr-xr-x waue supergroup }}} $ bin/hadoop dfs -put 132.txt input [[br]] === 5.3.3 Run === {{{ Eclipse sample > right click WordCount.java > run as ... > run on Hadoop > choose an existing server from the list below > finish }}} * A 「console」 tag will show beside 「!MapReduce Server」 tag. * While Map Reduce is running, you can visit http://cloud1:50030/ to view that Hadoop is dispatching jobs by Map Reduce. * After finish, you can go to http://cloud1:50060/ to see the result. = 六、範例教學 = * [wiki:HBaseRecordPro] * [wiki:LogParser] = 七、Reference = * [http://code.google.com/edu/parallel/mapreduce-tutorial.html Introduction to Parallel Programming and MapReduce] = 八、相關網址 = * [wiki:Hadoop_Eclipse Hadoop Eclipse 開發手冊] * [http://mypaper.pchome.com.tw/news/chris0426/3/1311004270/20081103154837/ Hbase 的簡易安裝手冊] * [http://mypaper.pchome.com.tw/news/chris0426/3/1311000464/20081103020601/ Hadoop 中的 HDFS 介紹] * [http://blog.yam.com/hn12303158/article/18720967 Hadoop起步教學]