首先~先祝大家2013新年快樂唷!!~,接下來要進入第五章囉,接下來是進行開發MapReduce程式,大致上都得先在local端使用部分資料測試,也就是所謂的單機測試,測試完後再放上叢集跑,通常這樣能夠消除大多數的bug,但是通過單機測試不代表放上叢集不會出錯,故Hadoop就提供一些小工具來協助debug的動作,像是使用Counter或是IsolationRunner等工具,在撰寫MapReduce前必須先了解一些組態的設定。

- 5.1 Configuration的設定是玩Hadoop的必經過程,使用者必須知道如何設定組態(configuration),來達到基本或是更進階的功能,Hadoop Definitive Guide edition2中範例5-1的例子可以看說如何來設定name-value的組態(xml檔),那麼這裡我就抄個例子來讓各位看官看一下吧。

configuration-1.xml

<?xml version="1.0"?>

<configuration>

    <property>

        <name>color</name>

        <value>yellow</value>

    </property>

    <property>

        <name>size</name>

        <value>10</value>

    </property>

</configuration>

- 5.2 那麼大家應該會有疑問?這個要怎麼來使用,請參照下面的程式碼,將此程式碼build好之後使用單機或是叢集的hadoop來執行,下述紅色部分就是GenericOptionsParser設定組態的部分,在使用的時候請用hadoop jar的方式來執行,切勿用java -jar的方式,因為你在叢集上改好的組態是由hadoop jar來吃,如果你使用java -jar會一直得到default的結果。

import java.io.IOException;
import java.util.Map.Entry;
 
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;
public class MapReducePractice_ConfigurationAPI extends Configured implements Tool{
    static {
        Configuration.addDefaultResource("hdfs-default.xml");
        Configuration.addDefaultResource("hdfs-site.xml");
        Configuration.addDefaultResource("mapred-default.xml");
        Configuration.addDefaultResource("mapred-site.xml");
        Configuration.addDefaultResource("configuration-1.xml");
    }
    @Override
    public int run(String[] arg0) throws Exception {
        Configuration conf = getConf();
        for (Entry<String, String> entry: conf) {
            System.out.printf("%s=%s\n", entry.getKey(), entry.getValue());
        }
        return 0;
    }
    public static void main(String[] args) throws Exception {
        int exitCode = ToolRunner.run(new MapReducePractice_ConfigurationAPI(), args);
        System.exit(exitCode);
    }
}
 
hadoop jar MapReducePractice_ConfigurationAPI.jar | grep color 可得到 color=yellow
hadoop jar MapReducePractice_ConfigurationAPI.jar -D color=blue | grep color 可得到 color=blue
hadoop jar MapReducePractice_ConfigurationAPI.jar | grep size 可得到 size=10
hadoop jar MapReducePractice_ConfigurationAPI.jar -D size=50 | grep size 可得到 size=50
 
- 5.3、5.4合併說明著使用單機環境來做MapReduce的做法,這裡其實很簡單,主要就是你要會架單機的環境來執行MapReduce,當需要開發MapReduce時最好是可以先在單機的環境下使用逐步trace的方式來trace你的MapReduce的code,如此一來可以解掉大部分的Bug,本人是使用ubuntu安裝hadoop及Eclipse來達到單機trace code的方式,因為我的環境還是在window,ubuntu的機器是使用公司的^^",所以我還是會研究一下如何在window的環境下來做單機trace的方法,因為這樣也比較方便拉^.^。
 
- 5.5 主要是說如何在叢集上執行,拜託各位看倌,如果你要實做的話千萬千萬一定要使用IDE來寫MapReduce程式,不管你是用NetBeans or Eclipse ...whatever,不要傻傻的用command line來打包jar檔...這樣不會比較厲害QQ",而且你這樣也只是淪為打字的機器而已~"~更不用說要Debug了...,OK~前面的廢話只是一些心得。
    - 5.5.1 打包jar檔,如上述請使用IDE來做打包的動作。
    - 5.5.2 啟動MapReduce作業,啟動的方法太多樣化了,可以下hadoop jar查看一下,會看到 RunJar jarFile [mainClass] args...,這是最基本的用法,執行hadoop jar xxx.jar args0 args1 args2 ...argsN,args0~argsN表示你傳進去的參數個數,
    - 5.5.3 網頁查詢,請至host:50030查看,可以看到粉多東西。
    - 5.5.4 擷取結果,當你執行完後可以在HDFS上找到。如果你只有執行map那麼檔案會被命名成part-m-00000,如果有執行reduce那麼檔案會被命名成part-r-00000。
    - 5.5.5 對作業偵錯的方式不外乎就是"印log",但是在叢集上要"印log"來看是非常不容易被查覺得,因為你哪知道是哪一台在印,故hadoop在偵錯這裡有兩種方式,第一種就是使用計數器(counter),第二種則是使用IsolationRunner來做,第二種會再5.5.6來說明,在甚麼環境下會用到偵錯呢?當你在parse一log的時候,或許某些log的格式出乎你意料之外,那麼你就可以使用counter來計數看看有多少log是出乎你意料之外的囉^^~。(注意 Hadoop Definitive Guide edition2的code是for舊版的,而本人的版本為1.0.3版,所以略有不同)。
 
    public static class MyMap extends Mapper<LongWritable, Text, Text, Text> {
        public static enum InputCount {
            Count_input
        }
        public static String outKey;
        // To declare method
        public void map(LongWritable key, Text value, Context context)
            throws IOException, InterruptedException {
            context.setStatus("InputCount");
            context.getCounter(InputCount.Count_input).increment(1);
            context.write( new Text("1"), value );
        }
    }
使用的方式就是紅色的部分,跑完之後要如何查看可以看書上說明。
    - 5.5.6 使用遠端偵錯,在這一節中書上說明的實在是有夠有夠少...,這一節中主要闡明著當單機可以run MapReduce,但是放上叢集之後還是會出錯時,如何使用IsolationRunner來做debug的方法,這裡我尚未實做完成,等實作完成後再上來與大家分享。
- 5.6 作業調教(tuning)的部分就是為了讓MapReduce可以更快的執行完畢,結合前幾章的觀念,書上竟然已經幫我們整理好了一個調教清單,讓小弟我來抄一下,紅色的部分就是我們之前有說過的部分,而剩下的部分可以參閱書籍或是等後面章節的介紹。
    a. Mapper的數量    
    b. Reducer的數量     
    c. Combiner的設置  
    d. 壓縮                     
    e. 客制序列化             
    f. Shuffle
    - 5.6.1 分析任務,這裡主要說明你對程式碼的調教對最佳化上是有幫助的,目前在第二版的書上是使用HPROF來做分析,目前這個部分我也尚未實做Orz...,請有興趣的同學可以研究研究^^~。
- 5.7 MapReduce 工作流程,在這裡有說明到一個重點,就經驗法則來看"增加作業數"會比"增加作業複雜度"來的好。
    - 5.7.1 如何把問題拆成MapReduce,這個問題非常重要,其實大家都有自己的想法,我覺得這個問題是用經驗累積的,故我就不再這邊說明了。
    - 5.7.2 相依作業的執行,目前這裡沒甚麼好說的,Oozie大概就是未來的首選吧。
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 TonyMoMo 的頭像
    TonyMoMo

    TonyMoMo的部落格

    TonyMoMo 發表在 痞客邦 留言(0) 人氣()