Changes between Version 26 and Version 27 of LogParser


Ignore:
Timestamp:
Jul 8, 2008, 2:44:12 PM (16 years ago)
Author:
waue
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • LogParser

    v26 v27  
    140140        }
    141141}}}
    142 這段function code中,[http://hadoop.apache.org/core/docs/r0.16.4/api/org/apache/hadoop/fs/Path.html Path] 是宣告檔案路徑的類別,可以把Path想做是標準JAVA IO的File類別,用來定義檔案路徑。[ http://hadoop.apache.org/core/docs/r0.16.4/api/org/apache/hadoop/fs/FileSystem.html FileSystem] 的物件生成方式不是用new的方式,而是用get(JobConf) 的方法,裡面填的變數是之前宣告過的全域變數HBase的設定參數conf。[[br]][[br]]
    143 後面的參數jobConf 則是重要的map reduce 設定檔,由於其生命週期只在此function,因此並不用移到外面作全域變數。[[br]]
    144 JobConf的建構子有很多種型態,詳細可以看[http://hadoop.apache.org/core/docs/r0.16.4/api/org/apache/hadoop/mapred/JobConf.html JobConf官網API] ,一般較基本的範例程式都是用JobConf(Class exampleClass)  即可,但此範例用JobConf(Configuration conf, Class exampleClass) ,是因有個HBaseConfiguration 的conf,HBaseConfiguration為Configuration的子類別,因此conf可以放入JonConf當其設定元素,因此用'''JobConf jobConf = new JobConf(conf, LogParserGo.class);''' 。[[br]][[br]]
    145 接著看到jobConf.set(TABLE, table); jobConf並沒有set的方法,而是其父類別 org.apache.hadoop.conf.Configuration 有,因此用set將環境參數設定進去,按照格式設定table 的名稱。
    146  || jobConf.set|| (TABLE || table) ||
     142這段function code中,[http://hadoop.apache.org/core/docs/r0.16.4/api/org/apache/hadoop/fs/Path.html Path] 是宣告檔案路徑的類別,可以把Path想做是標準JAVA IO的File類別,用來定義檔案路徑。[http://hadoop.apache.org/core/docs/r0.16.4/api/org/apache/hadoop/fs/FileSystem.html FileSystem] 的物件生成方式不是用new的方式,而是用get(!JobConf) 的方法,裡面填的變數是之前宣告過的全域變數HBase的設定參數conf。[[br]][[br]]
     143後面的參數!JobConf 則是重要的map reduce 設定檔,由於其生命週期只在此function,因此並不用移到外面作全域變數。[[br]]
     144!JobConf的建構子有很多種型態,詳細可以看[http://hadoop.apache.org/core/docs/r0.16.4/api/org/apache/hadoop/mapred/JobConf.html JobConf官網API] ,一般較基本的範例程式都是用!JobConf(Class exampleClass)  即可,但此範例用!JobConf(Configuration conf, Class exampleClass) ,是因有個HBaseConfiguration 的conf,HBaseConfiguration為Configuration的子類別,因此conf可以放入JonConf當其設定元素,因此用'''!JobConf !JobConf = new !JobConf(conf, !LogParserGo.class);''' 。[[br]][[br]]
     145接著看到!JobConf.set(TABLE, table); !JobConf並沒有set的方法,而是其父類別 org.apache.hadoop.conf.Configuration 有,因此用set將環境參數設定進去,按照格式設定table 的名稱。
     146 || !JobConf.set|| (TABLE || table) ||
    147147 ||  || name property || value ||
    148148 ||  || table.name || table_name ||
    149149
    150 接下來一整段,都是在設定放在hdfs內要parser的log的檔案路徑。listPaths 這個函數原本在 FileSystem 是有定義的,但hadoop 0.16 API已經predecated,而Hadoop 0.17 API已經徹底拿掉,為了消錯也為了日後升級方便,因此在這類別裡寫了listPaths來用,其功能主要是將 path 裡的檔案或路徑都回傳紀錄到path [] 陣列。因此 isFile() 函數用來判斷是否為檔案,若不是檔案則為目錄,setInputPath 可以設定一個輸入路徑,但若有很多個路徑要加入,則可以用addInputPath[[br]][[br]]
     150接下來一整段,都是在設定放在hdfs內要parser的log的檔案路徑。listPaths 這個函數原本在 !FileSystem 是有定義的,但hadoop 0.16 API已經predecated,而Hadoop 0.17 API已經徹底拿掉,為了消錯也為了日後升級方便,因此在這類別裡寫了listPaths來用,其功能主要是將 path 裡的檔案或路徑都回傳紀錄到path [] 陣列。因此 isFile() 函數用來判斷是否為檔案,若不是檔案則為目錄,setInputPath 可以設定一個輸入路徑,但若有很多個路徑要加入,則可以用addInputPath[[br]][[br]]
    151151
    152152output目錄只是中間的暫時產物,因此當程式跑到最後就 fs.delete 來刪除之。[[br]][[br]]
     
    154154client.getClusterStatus(); 此段程式碼是取得環境中有多少個nodes可以使用,並設到設定參數中。[[br]][[br]]
    155155
    156 怎麼知道程式跑完map-reduce ,JobClient.runJob() 則是 hadoop 呼叫開始跑map reduce的,如同thread 的run() 相似。
     156怎麼知道程式跑完map-reduce ,!JobClient.runJob() 則是 hadoop 呼叫開始跑map reduce的,如同thread 的run() 相似。
    157157
    158158[[br]][[br]]
    159159
    160 jobConf.setMapperClass(MapClass.class); 是用來設定 mapClass 如何運作,也就是下一段就會介紹到的內部類別 MapClass.class,而像此程式沒有用到reduce,因此不用設定;而若map 或 reduce 其中有一個沒用到其功能的話,也可以設定基本元件 IdentityReducer、IdentityMapper來取代。
     160!JobConf.setMapperClass(!MapClass.class); 是用來設定 !MapClass 如何運作,也就是下一段就會介紹到的內部類別 !MapClass.class,而像此程式沒有用到reduce,因此不用設定;而若map 或 reduce 其中有一個沒用到其功能的話,也可以設定基本元件!IdentityReducer、!IdentityMapper來取代。
    161161
    162162
     
    203203變數key為hbase中的row key,value則為值,output 可以透過collect() 功能將值寫入hbase的table中。但在此範例中,
    204204並沒有用到 output的寫入方式,reporter也沒有用到。[[br]]
    205 此方法因為有IO的存取,因此要宣告trows !IOException, 且用try來起始。[[br]][[br]]
     205此方法因為有IO的存取,因此要宣告trows IOException, 且用try來起始。[[br]][[br]]
    206206首先!LogParser log = new !LogParser(value.toString()); value的值為要parser的內容的某一行,因為基於hdfs的map-reduce架構上,hadoop會幫我們把資料整合起來,因此程式的邏輯只要處理好這一行即可。!LogParser 在下面會介紹到,目前只要知道log物件是原始資料value透過 !LogParser 處理過的產物。透過log物件的方法getIP,getProtocol(),...等,我們可以輕易取得需要的資料,用table.put( Row_Key , Column_Qualify_Name , Value) 方法將Value值填入Row_Key中的Column_Qualify_Name欄位中。接著研究table物件。[[br]]
    207207table是全域變數之一,由 [http://hadoop.apache.org/hbase/docs/current/api/org/apache/hadoop/hbase/HTable.html org.apache.hadoop.hbase.HTable] 類別定義。產生出HTable物件'''必定要'''給兩個初始化的值,一個是另一個全域變數也是重要的Hbase設定檔conf,另一個是tableName也就是資料表的名稱,當HTable 的 table 物件產生出來之後,我們就可以利用put來放入資料。然而一個新的資料表,要如何給他row_key呢?
     
    213213table.commit(lockId, log.getTimestamp()),將log內取得的時間update到整個row去。[[br]][[br]]
    214214
    215 configure(!JobConf conf) 此為override org.apache.hadoop.mapred.MapReduceBase.configure(!JobConf )
     215configure(!JobConf conf) 此為override org.apache.hadoop.mapred.!MapReduceBase.configure(!JobConf )
    216216內容只是取得並回傳Table的名字而已
    217217
     
    234234
    235235
    236  = LogParser.java =
     236 = !LogParser.java =
    237237這個java檔的任務是分析log檔案中的每行資訊
    238238