Changes between Version 8 and Version 9 of waue/2009/0617


Ignore:
Timestamp:
Jun 17, 2009, 5:56:12 PM (15 years ago)
Author:
waue
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • waue/2009/0617

    v8 v9  
    1818 * hadoop 0.20.0
    1919 == 0.2 目錄說明 ==
     20 * 使用者:waue
     21 * 使用者家目錄: /home/waue
    2022 * 專案目錄 : /home/waue/workspace
    2123 * hadoop目錄: /opt/hadoop
    2224 = 一、安裝 =
    23  * 包含 java , hadoop , eclipse
     25 * 安裝的部份沒必要都一模一樣,僅提供參考,反正只要安裝好java , hadoop , eclipse,並清楚自己的路徑就可以了
    2426 == 1.1. 安裝java ==
    2527 * java 基本套件
     
    2931
    3032 == 1.1.1. 安裝sun-java6-doc ==
    31  1 將javadoc下載下來
     33 * 1 將javadoc下載下來
    3234 [https://cds.sun.com/is-bin/INTERSHOP.enfinity/WFS/CDS-CDS_Developer-Site/en_US/-/USD/ViewProductDetail-Start?ProductRef=jdk-6u10-docs-oth-JPR@CDS-CDS_Developer 下載點]
    33  2 放在 /tmp/ 下
    34  3 執行
     35 * 2 放在 /tmp/ 下
     36 * 3 執行
    3537{{{
    3638$ sudo apt-get install sun-java6-doc
    3739}}}
     40
     41 == 1.3. 安裝hadoop ==
     42 * 安裝hadoop0.20到/opt/並取目錄名為hadoop
     43
     44{{{
     45$ cd ~
     46$ wget http://apache.ntu.edu.tw/hadoop/core/hadoop-0.20.0/hadoop-0.20.0.tar.gz
     47$ tar zxvf hadoop-0.20.0.tar.gz
     48$ sudo mv hadoop-0.20.0 /opt/
     49$ sudo chown -R waue:waue /opt/hadoop-0.20.0
     50$ sudo ln -sf /opt/hadoop-0.20.0 /opt/hadoop
     51}}}
     52
     53 * 編輯 /opt/hadoop/conf/hadoop-env.sh
     54
     55{{{
     56#!sh
     57export JAVA_HOME=/usr/lib/jvm/java-6-sun
     58export HADOOP_HOME=/opt/hadoop
     59export PATH=$PATH:/opt/hadoop/bin
     60}}}
     61
     62 * 編輯 /opt/hadoop/conf/core-site.xml
     63
     64{{{
     65#!sh
     66<configuration>
     67  <property>
     68    <name>fs.default.name</name>
     69    <value>hdfs://localhost:9000</value>
     70  </property>
     71  <property>
     72    <name>hadoop.tmp.dir</name>
     73    <value>/tmp/hadoop/hadoop-${user.name}</value>
     74  </property>
     75</configuration>
     76
     77}}}
     78
     79 * 編輯 /opt/hadoop/conf/hdfs-site.xml
     80
     81{{{
     82#!sh
     83<configuration>
     84  <property>
     85    <name>dfs.replication</name>
     86    <value>1</value>
     87  </property>
     88</configuration>
     89}}}
     90
     91 * 編輯 /opt/hadoop/conf/mapred-site.xml
     92
     93{{{
     94#!sh
     95<configuration>
     96  <property>
     97    <name>mapred.job.tracker</name>
     98    <value>localhost:9001</value>
     99  </property>
     100</configuration>
     101}}}
     102
     103 * 啟動
     104{{{
     105$ cd /opt/hadoop
     106$ source /opt/hadoop/conf/hadoop-env.sh
     107$ hadoop namenode -format
     108$ start-all.sh
     109$ hadoop fs -put conf input
     110$ hadoop -ls
     111}}}
     112
     113 * 沒有錯誤訊息則代表無誤
     114
    38115 == 1.2. 安裝eclipse ==
    39  == 1.3. 安裝hadoop ==
    40  = 二、 設定 =
    41  = 三、 運作 =
     116 * 下載 [http://www.eclipse.org/downloads/download.php?file=/eclipse/downloads/drops/R-3.4.2-200902111700/eclipse-SDK-3.4.2-linux-gtk.tar.gz eclipse SDK 3.4.2 Classic]
     117 * 放這檔案到家目錄
     118{{{
     119$ cd ~
     120$ tar -zxvf eclipse-SDK-3.4.2-linux-gtk.tar.gz
     121$ sudo mv eclipse /opt
     122$ sudo ln -sf /opt/eclipse/bin/eclipse /usr/local/bin/
     123
     124}}}
     125
     126 * 建立連結 (圖形介面要重新啟動才有吧!)
     127
     128{{{
     129$ cat >> ~/.gnome2/panel2.d/default/launchers/eclipse.desktop << EOF
     130[Desktop Entry]
     131Encoding=UTF-8
     132Version=1.0
     133Type=Application
     134Terminal=false
     135Name[zh_TW]=eclipse
     136Exec=/usr/bin/eclipse
     137Name=eclipse
     138Icon[zh_TW]=/opt/eclipse/plugins/org.eclipse.platform_3.3.101.v200902111700/eclipse48.png
     139Icon=/opt/eclipse/plugins/org.eclipse.platform_3.3.101.v200902111700/eclipse48.png
     140EOF
     141}}}
     142
     143 = 二、 建立專案 =
     144
     145 * 匯入hadoop 0.20.0 eclipse plugin
     146{{{
     147$ cd /opt/hadoop
     148$ sudo cp /opt/hadoop/contrib/eclipse-plugin/hadoop-0.20.0-eclipse-plugin.jar /opt/eclipse/plugins
     149}}}
     150{{{
     151$ sudo vim /opt/eclipse/eclipse.ini
     152}}}
     153 * 可斟酌參考eclipse.ini內容(非必要)
     154{{{
     155#!sh
     156-startup
     157plugins/org.eclipse.equinox.launcher_1.0.101.R34x_v20081125.jar
     158--launcher.library
     159plugins/org.eclipse.equinox.launcher.gtk.linux.x86_1.0.101.R34x_v20080805
     160-showsplash
     161org.eclipse.platform
     162--launcher.XXMaxPermSize
     163512m
     164-vmargs
     165-Xms40m
     166-Xmx512m
     167}}}
     168
     169 * window -> open pers.. -> other.. -> map/reduce
     170 * file -> new -> project -> Map/Reduce -> Map/Reduce Project -> next
     171{{{
     172#!sh
     173project name-> 輸入 : icas (隨意)
     174use default hadoop -> Configur Hadoop install... -> 輸入: "/opt/hadoop" -> ok
     175Finish
     176}}}
     177 * Project -> properties ->
     178   * java Build Path -> Libraries -> hadoop-0.20.0-ant.jar
     179   * java Build Path -> Libraries -> hadoop-0.20.0-core.jar
     180   * java Build Path -> Libraries ->  hadoop-0.20.0-tools.jar
     181以 hadoop-0.20.0-core.jar 的設定內容如下,其他依此類推
     182{{{
     183#!sh
     184source ...-> 輸入:/opt/opt/hadoop-0.20.0/src/core
     185javadoc ...-> 輸入:file:/opt/hadoop/docs/api/
     186}}}
     187
     188 * Project -> properties
     189  * javadoc location -> 輸入:file:/usr/lib/jvm/java-6-sun/docs/api/
     190
     191 * 視窗右下角黃色大象圖示"Map/Reduce Locations tag" -> 點選齒輪右邊的藍色大象圖示:
     192{{{
     193Location Name -> 輸入:hadoop  (隨意)
     194Map/Reduce Master -> Host-> 輸入:localhost
     195Map/Reduce Master -> Port-> 輸入:9001
     196DFS Master -> Host-> 輸入:9000
     197Finish
     198}}}
     199
     200 = 三、 撰寫範例程式 =
     201
     202 * 之前在eclipse上已經開了個專案icas,因此這個目錄在:
     203   * /home/waue/workspace/icas
     204 * 在這個目錄內有兩個資料夾:
     205   * src : 用來裝程式原始碼
     206   * bin : 用來裝編譯後的class檔
     207 * 如此一來原始碼和編譯檔就不會混在一起,對之後產生jar檔會很有幫助
     208 
     209 == 3.1  我的第一隻程式 ==
     210 * File -> new -> mapper
     211{{{
     212source folder-> 輸入: icas/src
     213Package : Sample
     214Name -> : mapper
     215}}}
     216 * 編輯mapper.java
     217{{{
     218#!java
     219package Sample;
     220
     221import java.io.IOException;
     222import java.util.StringTokenizer;
     223
     224import org.apache.hadoop.io.IntWritable;
     225import org.apache.hadoop.io.Text;
     226import org.apache.hadoop.mapreduce.Mapper;
     227
     228public class mapper extends Mapper<Object, Text, Text, IntWritable> {
     229
     230        private final static IntWritable one = new IntWritable(1);
     231        private Text word = new Text();
     232
     233        public void map(Object key, Text value, Context context)
     234                        throws IOException, InterruptedException {
     235                StringTokenizer itr = new StringTokenizer(value.toString());
     236                while (itr.hasMoreTokens()) {
     237                        word.set(itr.nextToken());
     238                        context.write(word, one);
     239                }
     240        }
     241}
     242}}}
     243 * File -> new -> reducer
     244
     245{{{
     246source folder-> 輸入: icas/src
     247Package : Sample
     248Name -> : reducer
     249}}}
     250
     251{{{
     252#!java
     253package Sample;
     254
     255import java.io.IOException;
     256
     257import org.apache.hadoop.io.IntWritable;
     258import org.apache.hadoop.io.Text;
     259import org.apache.hadoop.mapreduce.Reducer;
     260
     261public class reducer extends Reducer<Text, IntWritable, Text, IntWritable> {
     262        private IntWritable result = new IntWritable();
     263
     264        public void reduce(Text key, Iterable<IntWritable> values, Context context)
     265                        throws IOException, InterruptedException {
     266                int sum = 0;
     267                for (IntWritable val : values) {
     268                        sum += val.get();
     269                }
     270                result.set(sum);
     271                context.write(key, result);
     272        }
     273}
     274}}}
     275
     276 * File -> new -> Map/Reduce Driver
     277
     278{{{
     279source folder-> 輸入: icas/src
     280Package : Sample
     281Name -> : WordCount.java
     282}}}
     283 * 編輯 WordCount.java 檔
     284{{{
     285#!java
     286package Sample;
     287
     288import org.apache.hadoop.conf.Configuration;
     289import org.apache.hadoop.fs.Path;
     290import org.apache.hadoop.io.IntWritable;
     291import org.apache.hadoop.io.Text;
     292import org.apache.hadoop.mapreduce.Job;
     293import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
     294import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
     295import org.apache.hadoop.util.GenericOptionsParser;
     296
     297public class WordCount {
     298
     299        public static void main(String[] args) throws Exception {
     300                Configuration conf = new Configuration();
     301                String[] otherArgs = new GenericOptionsParser(conf, args)
     302                                .getRemainingArgs();
     303                if (otherArgs.length != 2) {
     304                        System.err.println("Usage: wordcount <in> <out>");
     305                        System.exit(2);
     306                }
     307                Job job = new Job(conf, "word count");
     308                job.setJarByClass(WordCount.class);
     309                job.setMapperClass(mapper.class);
     310
     311                job.setCombinerClass(reducer.class);
     312                job.setReducerClass(reducer.class);
     313                job.setOutputKeyClass(Text.class);
     314                job.setOutputValueClass(IntWritable.class);
     315                FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
     316                FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));
     317                System.exit(job.waitForCompletion(true) ? 0 : 1);
     318        }
     319}
     320}}}
     321
     322 * 三個檔都存檔後,可以看到icas專案下的src,bin都有檔案產生
     323
     324{{{
     325$ cd workspace/icas
     326$ ls src/Sample/
     327mapper.java  reducer.java  WordCount.java
     328$ ls bin/Sample/
     329mapper.class  reducer.class  WordCount.class
     330}}}
     331
     332 = 四、編譯 =
     333 * 由於hadoop 0.20 此版本的eclipse-plugin依舊不完整,如:1. 齒輪圖示沒有作用 2. 右鍵點選WordCount.java -> run as -> run on Hadoop :沒有效果
     334 * 因此編譯hadoop程式就要靠指令來編輯,然而用一行一行指令來產生太沒效率,在此介紹用Makefile來編譯
     335
     336 == 4.1 產生Makefile ==
     337{{{
     338
     339$ cd /home/waue/workspace/icas/
     340$ gedit Makefile
     341}}}
     342
     343{{{
     344#!sh
     345
     346JarFile="sample-0.1.jar"
     347MainFunc="Sample.WordCount"
     348LocalOutDir="/tmp/output"
     349
     350all:help
     351jar:
     352        jar -cvf ${JarFile} -C bin/ .
     353
     354run:
     355        hadoop jar ${JarFile} ${MainFunc} input output
     356
     357clean:
     358        hadoop fs -rmr output
     359
     360output:
     361        rm -rf ${LocalOutDir}
     362        hadoop fs -get output ${LocalOutDir}
     363        gedit ${LocalOutDir}/part-r-00000 &
     364
     365help:
     366        @echo "Usage:"
     367        @echo " make jar     - Build Jar File."
     368        @echo " make clean   - Clean up Output directory on HDFS."
     369        @echo " make run     - Run your MapReduce code on Hadoop."
     370        @echo " make output  - Download and show output file"
     371        @echo " make help    - Show Makefile options."
     372        @echo " "
     373        @echo "Example:"
     374        @echo " make jar; make run; make output; make clean"
     375
     376}}}
     377
     378
     379 == 4.2. 執行 ==
     380{{{
     381$ cd /home/waue/workspace/icas/
     382$ make jar; make run; make output; make clean
     383}}}