使用Eclipse開發!MapReduce程式
|  作者  |  公司  |  日期 
 | 
|  陳威宇  |  國家高速網路中心  |  2009/02/02 
 | 
一、準備
- 系統 : 
- Ubuntu 8.10
 - Hadoop 0.18.3 
 
 
|    |  指令  |  註解 
 | 
|  $  |  apt-get install eclipse  |  安裝eclipse 
 | 
|    |  指令  |  註解 
 | 
|  $  |   sudo apt-get purge java-gcj-compat  |  由於版權關係,ubuntu預設安裝的gcj為java的模擬軟體,請移除 
 | 
|  $  |   sudo apt-get install sun-java6-bin sun-java6-jdk sun-java6-jre sun-java6-plugin  |  安裝 Sun版Java 
 | 
|  Name  |  Path 
 | 
|  Hadoop Home  |  /opt/hadoop/ 
 | 
|  Java Home  |  /usr/lib/jvm/java-6-sun 
 | 
二、安裝與設定 Hadoop
Hadoop 是Apache所維護的自由軟體專案,而HDFS (Hadoop Distributed File System)是指Hadoop檔案系統,因此安裝的時候我們安裝配置了Hadoop專案,但操作時,尤其指Hadoop系統操作,我們會用HDFS來稱呼。因此,整個邏輯可以看成,我們在Linux系統內安裝配置了Hadoop,執行之後,它會產生一個新的分散式的磁碟系統,也就是HDFS,架構在Linux之內。由於是分散式系統,意味著他可以橫跨多台Linux所形成的叢集系統,並聯其磁碟空間。不過此篇的目的為撰寫MapReduce程式,所以在此示範的設定為HDFS運作於單一的本機系統內。
2.1 幫User產生ssh金鑰
|   |  指令  |  註解 
 | 
| $ |  ssh-keygen -t rsa -P ""  |  產生免密碼的ssh金鑰 
 | 
| $ |  cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys  |  匯入免檢查名單 
 | 
| $ |  ssh localhost  |  測試登入是否不用密碼 
 | 
| $ |  exit  |  完成離開 
 | 
2.2 安裝 Hadoop
2.3 設定
- 修改 hadoop-env.sh 檔 ($ gedit /opt/hadoop/conf/hadoop-env.sh )
- 修改內容:
  
    
      - 
        
        
        
        
          
            
            
              
              
                
                  | 
                    
                      old
                   | 
                  
                    
                      new
                   | 
                    | 
                
              
            
          
          
            
              
                 
                  
                      
                      
                        
                        
                          | 8 | 8 | # The java implementation to use.  Required. | 
                        
                      
                    
                  
                
                
                
                
              
            
              
                
                
                
                 
                  
                    
                    
                      
                      
                        | 9 |   | # export JAVA_HOME=/usr/lib/j2sdk1.5-sun | 
                      
                      
                      
                        |   | 9 | export JAVA_HOME=/usr/lib/jvm/java-6-sun | 
                      
                        |   | 10 | export HADOOP_HOME=/opt/hadoop | 
                      
                        |   | 11 | export HADOOP_LOG_DIR=$HADOOP_HOME/logs | 
                      
                        |   | 12 | export HADOOP_SLAVES=$HADOOP_HOME/conf/slaves | 
                      
                    
                  
                
              
            
            
          
        
       
    
  
  
 
- 修改 hadoop-site.xml 檔($ gedit HADOOP_HOME/conf/hadoop-site.xml)
- 整段貼上:
<configuration>
<property>
  <name>fs.default.name</name>
  <value>hdfs://localhost:9000/</value>
  <description>
  </description>
</property>
<property>
  <name>mapred.job.tracker</name>
  <value>hdfs://localhost:9001/</value>
  <description>
  </description>
</property>
<property>
  <name>mapred.map.tasks</name>
  <value>1</value>
  <description>
    define mapred.map tasks to be number of slave hosts
  </description>
</property>
<property>
  <name>mapred.reduce.tasks</name>
  <value>1</value>
  <description>
    define mapred.reduce tasks to be number of slave hosts
  </description>
</property>
<property>
  <name>dfs.replication</name>
  <value>1</value>
</property>
</configuration>
 
 
2.4 啟動 HDFS
- 格式化HDFS (Hadoop Distributed File System)
 
|   |  指令 
 | 
|  $  |  cd $HADOOP_HOME 
 | 
|  $  |  bin/hadoop namenode -format 
 | 
- 執行結果:
09/02/03 18:08:59 INFO dfs.NameNode: STARTUP_MSG: 
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG:   host = vPro/140.110.138.193
STARTUP_MSG:   args = [-format]
STARTUP_MSG:   version = 0.18.3
STARTUP_MSG:   build = https://svn.apache.org/repos/asf/hadoop/core/branches/branch-0.18 -r 736250; compiled by 'ndaley' on Thu Jan 22 23:12:08 UTC 2009
************************************************************/
09/02/03 18:08:59 INFO fs.FSNamesystem: fsOwner=waue,waue,adm,dialout,cdrom,floppy,audio,dip,video,plugdev,fuse,lpadmin,admin,sambashare
09/02/03 18:08:59 INFO fs.FSNamesystem: supergroup=supergroup
09/02/03 18:08:59 INFO fs.FSNamesystem: isPermissionEnabled=true
09/02/03 18:08:59 INFO dfs.Storage: Image file of size 78 saved in 0 seconds.
09/02/03 18:08:59 INFO dfs.Storage: Storage directory /tmp/hadoop-waue/dfs/name has been successfully formatted.
09/02/03 18:08:59 INFO dfs.NameNode: SHUTDOWN_MSG: 
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at vPro/140.110.138.193
************************************************************/
 
- 執行結果:
starting namenode, logging to /opt/hadoop/logs/hadoop-waue-namenode-vPro.out
localhost: starting datanode, logging to /opt/hadoop/logs/hadoop-waue-datanode-vPro.out
localhost: starting secondarynamenode, logging to /opt/hadoop/logs/hadoop-waue-secondarynamenode-vPro.out
starting jobtracker, logging to /opt/hadoop/logs/hadoop-waue-jobtracker-vPro.out
localhost: starting tasktracker, logging to /opt/hadoop/logs/hadoop-waue-tasktracker-vPro.out
 
- 在瀏覽器URL列輸入以下三個網址,若都有畫面則成功啟動
 
2.5 除錯
- 如果你的系統在啟動的時候有錯誤發生,則請停止Hadoop並完全移除Hadoop產生的中間資料,再重新開始
 
|   |  指令 
 | 
|  $  |  cd $HADOOP_HOME 
 | 
|  $  |  bin/stop-all.sh 
 | 
|  $  |  rm -rf /tmp/* 
 | 
|   |   檢查 2.3 內容,重新執行2.4內容 
 | 
三、 Hadoop的Eclipse-Plugin安裝與操作
Elipse是Sun公司所開發,是個很知名的Java程式語言開發程式,雖然Hadoop也是用java所開發,但要讓eclipse認得Hadoop的API、編譯器、並執行程式,需要調校的地方很多,步驟也很繁瑣。IBM發佈了一個Eclipse插件-IBM MapReduce Tools for Eclipse,通過該插件,開發者可以在Eclipse上創建MapReduce應用程序。以下我們就來示範如何安裝這個Hadoop的eclipse-plugin。
3.1 eclipse 3.3 以上版本(有bug)
|   |  指令 
 | 
|  $  |  sudo cp /opt/hadoop-0.18.3/contrib/eclipse-plugin/hadoop-0.18.3-eclipse-plugin.jar /usr/lib/eclipse/plugins/ 
 | 
ps : 上述的方法需eclipse 3.3 以上 搭配 hadoop 0.17 以上版本。
|  視窗操作  |  介面中設定  |  註解 
 | 
|  File > New > Project  |  看到 MapReduce category  |  檢查是否安裝IBM MapReduce tool成功 
 | 
|  Window > Preferences > java> compiler  | 設定 compiler compliance level 為 1.6   |  更改java編譯器為1.6 以上,否則會出現一堆error
 | 
|  視窗操作  |  介面中設定  |  註解 
 | 
|  File > new > Map/Reduce? Project>next  |  Project name:sample   Configure Hadoop install directory => /opt/hadoop   |  設定專案名稱及hadoop的家目錄 
 | 
- 完成後 Project Explorer可以看到 sample的專案列出
 
|  視窗操作  |  介面中設定  |  註解 
 | 
|  Window > Show View > Other... > MapReduce Tools   |  MapReduce locations  |  開啟MapReduce編譯環境,完成後右下方視窗會多一個藍色的大象圖示 
 | 
|  點選右下藍色大象圖示  |  location name : test   Host:localhost   M/R Master: Port:9001   DFS Master: Use Use M/R Master host:V   Port:9000 |  設定對應到 hadoop-site.xml檔 
 | 
- mapred.job.tracker 的設定若為 hdfs://ubuntu:9010/ ,則M/R Master的設定為 host:ubuntu , Port:9010 ,DFS Master的設定則對應到 fs.default.name
 - 注意 hdfs必須已經啟動,否則無法點選finish鍵
 - 完成後在Project Explorer可以看到DFS Locations出現
 
3.2 eclipse 3.2 以下版本
eclipse 3.2 以前的版本必須要去IBM官方網站下載mapReduce_tools.zip,解壓縮後將資料夾複製到$eclipse/plugins/才可以運作
|  視窗操作  |  介面中設定  |  註解 
 | 
|  File > New > Project  |  看到 MapReduce category  |  檢查是否安裝IBM MapReduce tool成功 
 | 
|  Window > Preferences > java> compiler  | 設定 compiler compliance level 為 5.0   |  更改java編譯器為5.0以上,否則會出現一堆error
 | 
|  視窗操作  |  介面中設定  |  註解 
 | 
|  File > new > project >  map-reduce project > next >  |  project name : sample   use default location : V    use default Hadoop : V    > Finish     |  設定專案預設值 
 | 
|  視窗操作  |  介面中設定  |  註解 
 | 
|  Window > Show View > Other... > MapReduce Tools > MapReduce Servers  |  MapReduce Servers  |  開啟MapReduce編譯環境,完成後右下方視窗會多一個藍色的大象圖示 
 | 
|  點選藍色大象圖示  |  Server name : any_you_want   Hostname : localhost    Installation directory: /opt/hadoop/    Username : waue     |  開啟Hadoop伺服器,若有任何的密碼提示對話框出現,請填入登入Linux的系統使用者之密碼 
 | 
四、用Eclipse編譯!MapReduce範例程式
在這個範例中,我們先上傳一個純文字檔到HDFS內,這個檔案的副檔名為何不重要,只要內文為純文字檔即可,簡單的可以直接把Readme檔上傳上去,但為了突顯MapReduce的威力,當然是放越大的檔案上去給Hadoop操一下越好囉!接著示範如何用Eclipse來編寫!MapReduce的程式,並執行編譯的動作。
1. 上傳字典檔,以供!WordCount程序作字數統計的來源檔
|   |  指令 
 | 
|  $  |  cd /opt/hadoop/ 
 | 
|  $  |  wget xxx/132.txt  
 | 
|  $  |  bin/hadoop dfs -mkdir input 
 | 
|  $  |  bin/hadoop dfs -put 132.txt input 
 | 
|  $  |  bin/hadoop dfs -ls 
 | 
Found 1 items
/user/waue/input        <dir>           2008-05-23 15:15        rwxr-xr-x      waue     supergroup
2. 在eclipse中新增程式碼 
於Eclipse左邊的Project explorer內,我們可以看到剛剛設定的工作目錄sample。 我們新增一個範例程式:
|  視窗操作  |  介面中設定  |  註解 
 | 
|  Project explorer內,右鍵點選 sample> new > file  |  file name :  WordCount.java  |  新增一個WordCount.java檔案 
 | 
3. 撰寫程式
貼上 WordCount.java 的內容。
4. 執行 
|  視窗操作  |  介面中設定  |  註解 
 | 
|  Project explorer內,右鍵點選 WordCount.java > run as ... > choose an existing server from the list below  |  finish  |  執行MapReduce 
 | 
5. 執行畫面會出現在右下方的視窗:console 
6. Hadoop的運算結果置於HDFS內的檔案中,要觀看結果內容,有以下三種方法 
- 用指令將輸出結果從HDFS內複製到本機資料夾內再觀看
 
7. 執行期間或執行結束,都可以到以下網址來看執行過程及結果 
五、 參考
- NCHC Cloud Technique Develop Group 
 - IBM Map-Reduce 
 - Cloud9 
 - Runing Hadoop