使用mapreduce來分析網(wǎng)站的log日志

所有網(wǎng)站的服務(wù)器上都會(huì)保留訪問的log日志水由。這些log日志記錄的其他機(jī)器訪問服務(wù)器的ip欲主,時(shí)間募疮,http協(xié)議芍锚,狀態(tài)碼等信息昔园。

比如這樣:


image.png

大型網(wǎng)站的服務(wù)器往往會(huì)產(chǎn)生海量的log日志,用hadoop來分析log日志并炮,也是一個(gè)很好的練手的機(jī)會(huì)潘拱。

下面寫一個(gè)例子屋吨,通過分析服務(wù)器的log日志,統(tǒng)計(jì)訪問服務(wù)器的ip地址和訪問的次數(shù)。

map函數(shù)
public class worldcount extends Mapper<LongWritable,Text,Text,IntWritable>{
    //重載Mapper類的map方法
    // 這里的key是讀取文件的行號(hào)呛占,value是對(duì)應(yīng)行號(hào)的文本
    protected void map(LongWritable key,Text value,Context context) throws IOException, InterruptedException{
        //將這一行轉(zhuǎn)化為string
        String line=value.toString();
        //以空格切分
        String [] linewords = line.split(" ");
        //獲得ip
        String ip=linewords[0];
        
        // 所以在context里面寫的內(nèi)容就是 key:ip ,value 是1
        context.write(new Text(ip), new IntWritable(1));
    }
}

<br />

reduce 函數(shù)
public class worldcountreduce extends  Reducer <Text,IntWritable,Text,IntWritable> {
    // 一組相同的key叽掘,調(diào)用一次reduce
    //相當(dāng)于調(diào)用一次 蚣抗,計(jì)算一個(gè)key對(duì)應(yīng)的個(gè)數(shù)
    protected void reduce (Text key,Iterable<IntWritable> values,Context context) throws IOException, InterruptedException{
        //統(tǒng)計(jì)單詞數(shù)
        int count=0;
        for(IntWritable value :values){
            count=count+value.get();
        }   
        //將輸出的結(jié)果放到context 里面
        context.write(key,new IntWritable(count));
    }
}

<br />

Main 函數(shù)
public class jobclient {
    public static void main(String []args) throws IOException, ReflectiveOperationException, InterruptedException{
        Configuration conf=new Configuration();
        //conf.set("yarn.resoucemanager.hostname", value);  
        Job job=Job.getInstance(conf);
        //job.setJar("~/code/WordCount.jar");
        //告知客戶端的提交器 mr程序所在的jar包
        //這樣就不必使用setjar 這樣的方法了
        job.setJarByClass(jobclient.class);
        // 告知mrapp master ,map 和reduce 對(duì)應(yīng)的實(shí)現(xiàn)類
        job.setMapperClass(worldcount.class);
        job.setReducerClass(worldcountreduce.class);
        //告知輸入癌瘾,和輸出的數(shù)據(jù)結(jié)構(gòu)的類型
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(IntWritable.class);
        
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);
        
        //告知mrappmaster 我們啟動(dòng)的reduce tash的數(shù)量
        //啟動(dòng)maptask 的數(shù)量 是yarn 會(huì)自動(dòng)的計(jì)算
        job.setNumReduceTasks(3);
        
        //指定一個(gè)目錄而不是文件
        FileInputFormat.setInputPaths(job, new Path("hdfs://localhost:9000/kpi/"));
        FileOutputFormat.setOutputPath(job,new Path("hdfs://localhost:9000/kpi/output/"));
        // job.submit()
        //這個(gè)要比job.submit 要好觅丰,因?yàn)檫@個(gè)client并不會(huì)在提交任務(wù)之后,就退出妨退,而是創(chuàng)建一個(gè)線程去監(jiān)控 map和reduce的運(yùn)行
        boolean res=job.waitForCompletion(true);
        // 執(zhí)行成功 狀態(tài)嗎 是0妇萄,執(zhí)行失敗 狀態(tài)碼是100
        // 通過echo $? 顯示狀態(tài)碼
        System.out.println("wakakka ");
        System.exit(res?0:100);
    }
}

這里的輸入是一個(gè)目錄,可以把輸入的文件放到這個(gè)目錄里面就好碧注。比如這里嚣伐,我把a(bǔ)ccess.log.10文件放在kpi目錄下面。


2017-03-24 22-56-13屏幕截圖.png

然后將代碼打包為一個(gè)jar包萍丐,使用hadoo命令執(zhí)行這個(gè)jar包轩端。(執(zhí)行這條命令必須在jar包所在的目錄下面執(zhí)行)


2017-03-24 22-57-33屏幕截圖.png

程序運(yùn)行的結(jié)果是在輸出的目錄里面:

2017-03-25 09-38-29屏幕截圖.png

查看一個(gè)文件,就是程序的運(yùn)行結(jié)果:

2017-03-25 09-41-36屏幕截圖.png

關(guān)于代碼的一些小結(jié):

  1. hadoop經(jīng)常啟動(dòng)失敗逝变,或者出現(xiàn)訪問失敗的情況基茵。
  2. 在寫代碼之前拱层,一定要把所有的關(guān)于hadoop根灯,mapreduce的包導(dǎo)入纳猪。
  3. 將代碼打包為一個(gè)jar包氏堤。

github地址:
https://github.com/zhaozhengcoder/hadoop/tree/master/mapreduce_kpi

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末星著,一起剝皮案震驚了整個(gè)濱河市强饮,隨后出現(xiàn)的幾起案子邮丰,更是在濱河造成了極大的恐慌剪廉,老刑警劉巖捌斧,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異姓迅,居然都是意外死亡肩杈,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來索守,“玉大人,你說我怎么就攤上這事敞斋。” “怎么了焰枢?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)荐绝。 經(jīng)常有香客問我低滩,道長(zhǎng),這世上最難降的妖魔是什么婶溯? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮死讹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘愧旦。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布峦睡。 她就那樣靜靜地躺著弊知,像睡著了一般。 火紅的嫁衣襯著肌膚如雪秩彤。 梳的紋絲不亂的頭發(fā)上叔扼,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音漫雷,去河邊找鬼瓜富。 笑死,一個(gè)胖子當(dāng)著我的面吹牛降盹,可吹牛的內(nèi)容都是我干的与柑。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼价捧!你這毒婦竟也來了丑念?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤结蟋,失蹤者是張志新(化名)和其女友劉穎脯倚,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嵌屎,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡推正,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了宝惰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片植榕。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖尼夺,靈堂內(nèi)的尸體忽然破棺而出尊残,到底是詐尸還是另有隱情,我是刑警寧澤淤堵,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布夜郁,位于F島的核電站,受9級(jí)特大地震影響粘勒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜屎即,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一庙睡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧技俐,春花似錦乘陪、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至井赌,卻和暖如春谤逼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背仇穗。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來泰國(guó)打工流部, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人纹坐。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓枝冀,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子果漾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容