[[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]
 = 二、環境設定 = 
 == 2.1 Prepare == 
System : 
 * Ubuntu 7.10
 * Hadoop 0.16
 * Requirement : 
 * 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
}}}
suggest to remove the default java compiler “ gcj ”
{{{
$ apt-get purge java-gcj-compat
}}}
Append two codes to /etc/bash.bashrc to setup Java Class path
{{{
export JAVA_HOME=/usr/lib/jvm/java-6-sun
export HADOOP_HOME=/home/waue/workspace/hadoop/
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
}}}
Building UP Path
 || Name || Path || 
 || Hadoop Home || /home/waue/workspace/hadoop/ || 
 || Java Home || /usr/lib/jvm/java-6-sun || 
 == 2.2 Hadoop Setup == 
 === 2.2.1. Generate an SSH key for the user === 
{{{
$ ssh-keygen -t rsa -P ""
$ cat ~/.ssh/id_rsa.pub >> ~.ssh/authorized_keys
$ ssh localhost
$ exit
}}}
 === 2.2.2. Installation Hadoop === 
{{{
 $ cd /home/waue/workspace
 $ sudo tar xzf hadoop-0.16.0.tar.gz
 $ sudo mv hadoop-0.16.0 hadoop
 $ sudo chown -R waue:waue hadoop
 $ cd hadoop
}}}
 === 2.2.3. Configuration === 
 1. hadoop-env.sh    ($HADOOP_HOME/conf/) [[BR]]
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 HADOOP_LOG_DIR=$HADOOP_HOME/logs
export HADOOP_SLAVES=$HADOOP_HOME/conf/slaves
}}}
 2. hadoop-site.xml  ($HADOOP_HOME/conf/)[[BR]]
modify the contents of conf/hadoop-site.xml as below
{{{
  fs.default.name
  localhost:9000
  
  
  mapred.job.tracker
  localhost:9001
  
  
  mapred.map.tasks
  1
  
    define mapred.map tasks to be number of slave hosts
  
  mapred.reduce.tasks
  1
  
    define mapred.reduce tasks to be number of slave hosts
  
  dfs.replication
  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
localhost: starting datanode, logging to /home/waue/workspace/hadoop/logs/hadoop-waue-datanode-Dx7200.out
localhost: 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
localhost: starting tasktracker, logging to /home/waue/workspace/hadoop/logs/hadoop-waue-tasktracker-Dx7200.out
}}}
 * Then make sure http://localhost: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/*
}}}
 = 四、效能測試 = 
 = 五、開發程式 = 
 == 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 : localhost 
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://localhost:50030/ to 
view that Hadoop is dispatching jobs by Map Reduce.
 * After finish, you can go to http://localhost:50060/ to see the result.
 = 六、範例教學 = 
 = Reference =