標籤:加油 介面 測試的 調用 network 綜合 功能 本質 靜態
一、問題背景
實際業務的需要,比如以移動為例,河南的使用者去了北京上網,那麼他的上網資訊預設儲存在了北京的基站,那麼我們想要查詢北京地區的上網日誌資訊預設也包含了其他地區使用者的在本區的上網資訊,否則只能掃描日誌找到北京,很慢,所以分區很需要。
二、資料集分析
1363157985066 1372623050300-FD-07-A4-72-B8:CMCC120.196.100.82i02.c.aliimg.com24272481246812001363157995052 138265441015C-0E-8B-C7-F1-E0:CMCC120.197.40.44026402001363157991076 1392643565620-10-7A-28-CC-0A:CMCC120.196.100.992413215122001363154400022 139262511065C-0E-8B-8B-B1-50:CMCC120.197.40.44024002001363157993044 1821157596194-71-AC-CD-E6-18:CMCC-EASY120.196.100.99iface.qiyi.com視頻網站1512152721062001363157995074 841384135C-0E-8B-8C-E8-20:7DaysInn120.197.40.4122.72.52.122016411614322001363157993055 13560439658C4-17-FE-BA-DE-D9:CMCC120.196.100.99181511169542001363157995033 159201332575C-0E-8B-C7-BA-20:CMCC120.197.40.4sug.so.360.cn資訊安全20203156293620013631579830191371919941968-A1-B7-03-07-B1:CMCC-EASY120.196.100.824024002001363157984041 136605779915C-0E-8B-92-5C-20:CMCC-EASY120.197.40.4s19.cnzz.com網站統計24969606902001363157973098 150136858585C-0E-8B-C7-F7-90:CMCC120.197.40.4rank.ie.sogou.com搜尋引擎2827365935382001363157986029 15989002119E8-99-C4-4E-93-E0:CMCC-EASY120.196.100.99www.umeng.com網站統計3319381802001363157992093 13560439658C4-17-FE-BA-DE-D9:CMCC120.196.100.9915991849382001363157986041 134802531045C-0E-8B-C7-FC-80:CMCC-EASY120.197.40.4331801802001363157984040 136028465655C-0E-8B-8B-B6-00:CMCC120.197.40.42052.flash2-http.qq.com綜合門戶1512193829102001363157995093 1392231446600-FD-07-A2-EC-BA:CMCC120.196.100.82img.qfc.cn1212300837202001363157982040 135024688235C-0A-5B-6A-0B-D4:CMCC-EASY120.196.100.99y0.ifengimg.com綜合門戶5710273351103492001363157986072 1832017338284-25-DB-4F-10-1A:CMCC-EASY120.196.100.99input.shouji.sogou.com搜尋引擎2118953124122001363157990043 1392505741300-1F-64-E1-E6-9A:CMCC120.196.100.55t3.baidu.com搜尋引擎696311058482432001363157988072 1376077871000-FD-07-A4-7B-08:CMCC120.196.100.82221201202001363157985066 1372623888800-FD-07-A4-72-B8:CMCC120.196.100.82i02.c.aliimg.com24272481246812001363157993055 13560436666C4-17-FE-BA-DE-D9:CMCC120.196.100.9918151116954200
查看電話號碼一列,看前三位分為移動、聯通和電信,不過還有以84開頭的同意歸屬為海外,那麼我們需要的共有4個reducer,那麼需要Partitioner裡面需要自己分為四類。
一個reducer對應一個結果檔案。
不能再本地運行,這樣的話只能一個map,一個reducer,無論設定。
三、理論準備3.1 抽象類別與介面
我們都知道在物件導向的領域一切都是對象,同時所有的對象都是通過類來描述的,但是並不是所有的類都是來描述對象的。如果一個類沒有足夠的資訊來描述一個具體的對象,而需要其他具體的類來支撐它,那麼這樣的類我們稱它為抽象類別。比如new Animal(),我們都知道這個是產生一個動物Animal對象,但是這個Animal具體長成什麼樣子我們並不知道,它沒有一個具體動物的概念,所以他就是一個抽象類別,需要一個具體的動物,如狗、貓來對它進行特定的描述,我們才知道它長成啥樣。
抽象類別和普通類的區別是強制讓子類去重寫弗雷的方法。
public abstract class Animal { public abstract void cry(); } public class Cat extends Animal{ @Override public void cry() { System.out.println("貓叫:喵喵..."); } } public class Dog extends Animal{ @Override public void cry() { System.out.println("狗叫:汪汪..."); } } public class Test { public static void main(String[] args) { Animal a1 = new Cat(); Animal a2 = new Dog(); a1.cry(); a2.cry(); } } -------------------------------------------------------------------- Output: 貓叫:喵喵... 狗叫:汪汪... 其實抽象類別就是一個規範,譬如印表機肯定有列印功能,但是具體列印彩色還是黑白就由具體的印表機去實現,強制其他印表機實現發音方法,但是普通類並沒有這樣的要求,可能出錯。
抽象層次不同。抽象類別是對類抽象,而介面是對行為的抽象。抽象類別是對整個類整體進行抽象,包括屬性、行為,但是介面卻是對類局部(行為)進行抽象。
抽象類別所跨域的是具有相似特點的類,而介面卻可以跨域不同的類。我們知道抽象類別是從子類中發現公用部分,然後泛化成抽象類別,子類繼承該父類即可,但是介面不同。實現它的子類可以不存在任何關係,共同之處。例如貓、狗可以抽象成一個動物類抽象類別,具備叫的方法。鳥、飛機可以實現飛Fly介面,具備飛的行為,這裡我們總不能將鳥、飛機共用一個父類吧!所以說抽象類別所體現的是一種繼承關係,要想使得繼承關係合理,父類和衍生類別之間必須存在"is-a" 關係,即父類和衍生類別在概念本質上應該是相同的。對於介面則不然,並不要求介面的實現者和介面定義在概念本質上是一致的, 僅僅是實現了介面定義的契約而已。
java本身不支援多繼承,通過實現多個介面來達到多繼承的目的。3.2 static塊與單例
static塊會在執行個體初始化之前執行,所以你可以在方法調用之前進行一些初始化操作,
單例是擷取對象的一種方式而已,保證只有一個實作類別,
實際開發中幾乎用不到,單例spring提供有實現,static在測試的時候可能會用到,還有載入一些系統設定檔的時候可能會把載入寫在static塊中。
四、代碼實現
//Partitioner是map執行完成後reduce還沒執行,所以他的類型是map的輸出類型public class DataCountPartitioner extends Partitioner<Text,DataBean> {//沒執行一次變讀取一次資料庫很不好,可以做緩衝,或者搞成單利,//為了簡單直接搞一個static塊private static Map<String , Integer> dataCountMap = new HashMap<String , Integer>();static {//靜態從上往下執行,也就是先執行上面的datacoutnMap,否則靜態塊裡//網datacountmap裡棉放東西dataCountMap.put("135",1);dataCountMap.put("136",1);dataCountMap.put("137",1);dataCountMap.put("138",1);dataCountMap.put("139",1);dataCountMap.put("150",2);dataCountMap.put("159",2);dataCountMap.put("182",2);dataCountMap.put("183",2);}//int表示分區號//numPartitions:幾個reducer就有幾個這個值@Overridepublic int getPartition(Text key, DataBean value, int numPartitions) {// TODO Auto-generated method stubString telNo = key.toString();//從0開始取3位String subTelNo = telNo.substring(0, 3);Integer code = dataCountMap.get(subTelNo);//186 843等開頭的預設是國外if(null==code) {code = 0;}return code;}}
五、結果分析5.1 _SUCCESS
這個沒啥用,mapreduce內建的,不過如果你的程式有多部mapreduce,肯定會有中間結果,那麼倒是可以這個_success來判斷是否執行了上個步驟,也就是說在補資料的時候,如果發現某一步_success了 那麼就說明上一步不用補跑mapreduce,直接執行下面的程式.
5.2 結果
查看結果發現0裡面是134和841開頭的,達到預期,1和2分別是聯通,3是空的,為什麼呢?因為partitioner裡面的分類設定類3個,而reducer個數是4個,其中一個reducer沒有資料粉發過去所以就是空的。
那如果reducer個數小於partitioner個數呢,我發現輸出檔案加油,也沒報錯,就是空檔案夾。
MapReduce實現手機上網日誌分析(分區)