一個典型的MapRuduce實例------webcount(網站統計訪客信息)

来源:http://www.cnblogs.com/learn21cn/archive/2016/12/05/6132528.html
-Advertisement-
Play Games

統計某一特定網站的某個時辰訪客人數 所用版本:hadoop2.6.5 數據樣式如下: 輔助類 mapper 映射特定年份中每月每天每個時辰的訪客數 reducer 彙總一個時辰內訪客人數 driver 配置信息,程式入口 command result ...


統計某一特定網站的某個時辰訪客人數

所用版本:hadoop2.6.5

數據樣式如下:

111.111.111.111 - - [16/Dec/2012:05:32:50 -0500] "GET / HTTP/1.1" 200 14791 "-" "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)"
111.111.111.111 - - [16/Dec/2012:05:33:50 -0500] "GET / HTTP/1.1" 200 14791 "-" "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)"
111.111.111.111 - - [16/Dec/2012:05:34:45 -0500] "GET / HTTP/1.1" 200 14791 "-" "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)"
111.111.111.111 - - [16/Dec/2012:05:34:50 -0500] "GET / HTTP/1.1" 200 14791 "-" "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)"
111.111.111.111 - - [16/Dec/2012:09:34:55 -0500] "GET / HTTP/1.1" 200 14791 "-" "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)"
111.111.111.111 - - [16/Dec/2012:10:23:30 -0500] "GET / HTTP/1.1" 200 14791 "-" "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)"
111.111.111.111 - - [16/Dec/2012:10:32:50 -0500] "GET / HTTP/1.1" 200 14791 "-" "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)"

輔助類

 1 package com.trendwise.software;
 2 
 3 import java.text.SimpleDateFormat; 
 4 import java.util.Date; 
 5 import java.io.DataInput; import java.io.DataOutput; 
 6 import java.io.IOException; 
 7 import org.apache.hadoop.io.WritableComparable; 
 8 
 9 public class DateWritable implements WritableComparable<DateWritable>{
10     private final static SimpleDateFormat formatter = new SimpleDateFormat( "yyyy-MM-dd' T 'HH:mm:ss.SSS" ); 
11     private Date date; 
12     public Date getDate() { 
13         return date; 
14     } 
15     public void setDate( Date date ) { 
16         this.date = date; 
17     } 
18 
19     @Override
20     public void readFields(DataInput in) throws IOException {
21         date = new Date( in.readLong() );         
22     }
23 
24     @Override
25     public void write(DataOutput out) throws IOException {
26         out.writeLong( date.getTime() );         
27     }
28 
29     @Override
30     public int compareTo(DateWritable o) {
31         return date.compareTo( o.getDate() ); 
32     }
33     
34     public String toString() { 
35         return formatter.format( date); 
36     }     
37 }

mapper 映射特定年份中每月每天每個時辰的訪客數

 1 package com.trendwise.software;
 2 
 3 import java.io.IOException;
 4 import java.util.Calendar;
 5 import org.apache.hadoop.io.IntWritable;
 6 import org.apache.hadoop.io.LongWritable;
 7 import org.apache.hadoop.io.Text;
 8 import org.apache.hadoop.mapreduce.Mapper;
 9 
10 public class LogMapper extends Mapper<LongWritable, Text, DateWritable, IntWritable> { 
11     public static DateWritable dates = new DateWritable(); 
12     public final static IntWritable two = new IntWritable(1); 
13     public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { 
14         String text = value.toString(); 
15         // Get the date and time 
16         int openBracket = text.indexOf( '[' ); 
17         int closeBracket = text.indexOf( ']' ); 
18         if( openBracket != -1 && closeBracket != -1 ) { 
19             // Read the date 
20             String dateString = text.substring( text.indexOf( '[' ) + 1, text. indexOf( ']' ) ); 
21             // Build a date object from a string of the form: 16/Dec/2012:05:32:50 -0500 
22             int index = 0; 
23             int nextIndex = dateString.indexOf( '/' ); 
24             int day = Integer.parseInt( dateString.substring(index, nextIndex) );
25             
26             index = nextIndex; nextIndex = dateString.indexOf( '/', index+1 ); 
27             String month = dateString.substring( index+1, nextIndex ); 
28             index = nextIndex; 
29             nextIndex = dateString.indexOf( ':', index ); 
30             int year = Integer.parseInt(dateString.substring(index + 1, nextIndex)); 
31             index = nextIndex; nextIndex = dateString.indexOf( ':', index+1 ); 
32             int hour = Integer.parseInt(dateString.substring(index + 1, nextIndex)); 
33             // Build a calendar object for this date 
34             Calendar calendar = Calendar.getInstance(); 
35             calendar.set( Calendar.DATE, day );
36             calendar.set( Calendar.YEAR, year ); 
37             calendar.set( Calendar.HOUR, hour ); 
38             calendar.set( Calendar.MINUTE, 0 ); 
39             calendar.set( Calendar.SECOND, 0 ); 
40             calendar.set( Calendar.MILLISECOND, 0 ); 
41             if( month.equalsIgnoreCase( "dec" ) ) { 
42                 calendar.set( Calendar.MONTH, Calendar.DECEMBER ); 
43             } 
44             else if( month.equalsIgnoreCase( "nov" ) ) { 
45                 calendar.set( Calendar.MONTH, Calendar.NOVEMBER ); 
46             } 
47             else if( month.equalsIgnoreCase( "oct" ) ) { 
48                 calendar.set( Calendar.MONTH, Calendar.OCTOBER ); 
49             }
50             else if( month.equalsIgnoreCase( "sep" ) ) { 
51                 calendar.set( Calendar.MONTH, Calendar.SEPTEMBER ); 
52             } 
53             else if( month.equalsIgnoreCase( "aug" ) ) { 
54                 calendar.set( Calendar.MONTH, Calendar.AUGUST ); 
55             } 
56             else if( month.equalsIgnoreCase( "jul" ) ) { 
57                 calendar.set( Calendar.MONTH, Calendar.JULY ); 
58             } 
59             else if( month.equalsIgnoreCase( "jun" ) ) {
60                 calendar.set( Calendar.MONTH, Calendar.JUNE ); 
61             } 
62             else if( month.equalsIgnoreCase( "may" ) ) {
63                 calendar.set( Calendar.MONTH, Calendar.MAY ); 
64             } 
65             else if( month.equalsIgnoreCase( "apr" ) ) { 
66                 calendar.set( Calendar.MONTH, Calendar.APRIL ); 
67             } 
68             else if( month.equalsIgnoreCase( "mar" ) ) { 
69                 calendar.set( Calendar.MONTH, Calendar.MARCH ); 
70             } 
71             else if( month.equalsIgnoreCase( "feb" ) ) { 
72                 calendar.set( Calendar.MONTH, Calendar.FEBRUARY ); 
73             } 
74             else if( month.equalsIgnoreCase( "jan" ) ) { 
75                 calendar.set( Calendar.MONTH, Calendar.JANUARY ); 
76             } 
77             
78             dates.setDate( calendar.getTime() ); 
79             context.write(dates, two); 
80             
81         }
82     }
83 }

reducer 彙總一個時辰內訪客人數

 1 package com.trendwise.software;
 2 
 3 import java.io.IOException;
 4 import org.apache.hadoop.io.IntWritable;
 5 import org.apache.hadoop.mapreduce.Reducer;
 6  
 7 public class  LogReducer extends Reducer<DateWritable, IntWritable, DateWritable, IntWritable> {
 8     @Override
 9     public void reduce( DateWritable key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { 
10     
11         int countn = 0; 
12         for(IntWritable v :values){ 
13             countn += v.get(); 
14         }     
15         context.write(key, new IntWritable( countn) ); 
16     } 
17 }

driver 配置信息,程式入口

 1 package com.trendwise.software;
 2 
 3 import java.io.IOException;
 4 import org.apache.hadoop.conf.Configuration;
 5 import org.apache.hadoop.fs.Path;
 6 import org.apache.hadoop.io.IntWritable;
 7 import org.apache.hadoop.mapreduce.Job;
 8 import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
 9 import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
10 
11 public class Driver {
12     
13     public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException { 
14                 
15         String in = args[0];
16         String out = args[1];
17         int unitmb =Integer.valueOf(args[2]);                
18         int nreducer = Integer.valueOf(args[3]);
19         
20         Configuration conf = new Configuration();                
21         conf.set("mapreduce.input.fileinputformat.split.maxsize", String.valueOf(unitmb * 1024 * 1024));
22         conf.set("mapred.min.split.size", String.valueOf(unitmb * 1024 * 1024));
23         conf.set("mapreduce.input.fileinputformat.split.minsize.per.node", String.valueOf(unitmb * 1024 * 1024));
24         conf.set("mapreduce.input.fileinputformat.split.minsize.per.rack", String.valueOf(unitmb * 1024 * 1024));
25                 
26         Job job = new Job(conf);        
27         FileInputFormat.addInputPath(job, new Path(in));
28         FileOutputFormat.setOutputPath(job, new Path(out));            
29         job.setMapperClass(LogMapper.class); 
30         job.setReducerClass(LogReducer.class); 
31         job.setCombinerClass(LogReducer.class); 
32         job.setNumReduceTasks(nreducer);
33         job.setMapOutputKeyClass(DateWritable.class);
34         job.setMapOutputValueClass(IntWritable.class);    
35         job.setOutputKeyClass(DateWritable.class); 
36         job.setOutputValueClass(IntWritable.class);
37         job.setJarByClass(Driver.class);
38         job.waitForCompletion(true);    
39                     
40     }     
41 }

command

result

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 當運行下一個活動時,上一個活動被K掉了,當我們返回上一個活動時,系統會重啟create一個活動,問題來了我們之前在保存的數據怎麼辦?onSaveInstanceState可以用這個方法來進行保存,鍵值對[ke,"value"],其實和Intent一樣,也是通過這樣保存。 ...
  • 今天碰到了在XML中應用以內部類形式定義的自定義view,結果遇到了一些坑。雖然通過看了一些前輩寫的文章解決了這個問題,但是我看到的幾篇都沒有完整說清楚why,於是決定做這個總結。 使用自定義內部類view的規則 本文主要是總結why,所以先把XML佈局文件中引用內部類的自定義view的做法擺出來, ...
  • 三級緩存的提出就是為了提升用戶體驗。當我們第一次打開應用獲取圖片時,先到網路去下載圖片,然後依次存入記憶體緩存,磁碟緩存,當我們再一次需要用到剛纔下載的這張圖片時,就不需要再重覆的到網路上去下載,直接可以從記憶體緩存和磁碟緩存中找,由於記憶體緩存速度較快,我們優先到記憶體緩存中尋找該圖片,如果找到則運用,如 ...
  • 最近解決了一個Android APP的bug,發現APP在被後臺清理後,會自動重啟。現象很奇怪,有的手機(HTC)後臺清理後,程式會再次重啟,而有的手機(小米)則不會。猜想可能是小米手機內部做了處理,當執行後臺清理後,對應的APP不會再重啟了。 Debug後發現,APP內部有一個Service,在S ...
  • 散列表的具體實現就不多做介紹了,就是一個數組,每個下標存儲的是碰撞的元素的鏈表頭指針,如下圖所示: 下麵直接研究對用鏈接法散列的分析: 給定一個能存放n個元素的、具有m個槽位的散列表T,定義T的裝載因數α為n/m,即一個鏈中平均存儲的元素數。 用鏈接法散列的最壞情況性能很差:所有的n個關鍵字都散列到 ...
  • 之前關於如何實現屏幕頁面切換,寫過一篇博文《Android中使用ViewFlipper實現屏幕切換》,相比ViewFlipper,ViewPager更適用複雜的視圖切換,而且Viewpager有自己的adapter,這也讓其適應複雜對象,實現數據的動態載入。 ViewPager是谷歌官方給我們提供的 ...
  • 一、分析目的 為企業戰略決策、投資決策、營銷決策提供依據 二、分析思路 三、分析方法——廚藝大比拼 數據分析的過程 對比 分類 相關:相關分析研究的是事物間的某種聯繫,最常見的聯繫就是因果分析。 分佈:分佈分析就是集中和離散趨勢。 四、分析應用 巨集觀環境:PEST分析——政治(Political)環 ...
  • 我們在數據分析之前需要進行數據處理、數據錄入並把數據清洗乾凈,做好數據的加工和描述工作。 【參考文獻】《數據分析:企業的賢內助》 陳哲 著 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...