近日,有人和我说分析log日志。

之前,就写过,但是忘了总结了,找了半天也没有找到,看了以后要将东西整理了。

无奈,在网上收拾,看到这个人写的,索性,就搬过来,待我找到我写的,在一块补充一下!

所有网站的服务器上都会保留访问的log日志。这些log日志记录的其他机器访问服务器的ip,时间,http协议,状态码等信息。

比如这样:

 

image.png

大型网站的服务器往往会产生海量的log日志,用hadoop来分析log日志,也是一个很好的练手的机会。

下面写一个例子,通过分析服务器的log日志,统计访问服务器的ip地址和访问的次数。

map函数
public class worldcount extends Mapper<LongWritable,Text,Text,IntWritable>{
//重载Mapper类的map方法
// 这里的key是读取文件的行号,value是对应行号的文本
protected void map(LongWritable key,Text value,Context context) throws IOException, InterruptedException{
//将这一行转化为string
String line=value.toString();
//以空格切分
String [] linewords = line.split(" ");
//获得ip
String ip=linewords[0]; // 所以在context里面写的内容就是 key:ip ,value 是1
context.write(new Text(ip), new IntWritable(1));
}
}

<br />

reduce 函数
public class worldcountreduce extends  Reducer <Text,IntWritable,Text,IntWritable> {
// 一组相同的key,调用一次reduce
//相当于调用一次 ,计算一个key对应的个数
protected void reduce (Text key,Iterable<IntWritable> values,Context context) throws IOException, InterruptedException{
//统计单词数
int count=0;
for(IntWritable value :values){
count=count+value.get();
}
//将输出的结果放到context 里面
context.write(key,new IntWritable(count));
}
}

<br />

Main 函数
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 对应的实现类
job.setMapperClass(worldcount.class);
job.setReducerClass(worldcountreduce.class);
//告知输入,和输出的数据结构的类型
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class); job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class); //告知mrappmaster 我们启动的reduce tash的数量
//启动maptask 的数量 是yarn 会自动的计算
job.setNumReduceTasks(3); //指定一个目录而不是文件
FileInputFormat.setInputPaths(job, new Path("hdfs://localhost:9000/kpi/"));
FileOutputFormat.setOutputPath(job,new Path("hdfs://localhost:9000/kpi/output/"));
// job.submit()
//这个要比job.submit 要好,因为这个client并不会在提交任务之后,就退出,而是创建一个线程去监控 map和reduce的运行
boolean res=job.waitForCompletion(true);
// 执行成功 状态吗 是0,执行失败 状态码是100
// 通过echo $? 显示状态码
System.out.println("wakakka ");
System.exit(res?0:100);
}
}

这里的输入是一个目录,可以把输入的文件放到这个目录里面就好。比如这里,我把access.log.10文件放在kpi目录下面。

 

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

然后将代码打包为一个jar包,使用hadoo命令执行这个jar包。(执行这条命令必须在jar包所在的目录下面执行)

 

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

程序运行的结果是在输出的目录里面:

 

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

查看一个文件,就是程序的运行结果:

 

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

关于代码的一些小结:

  1. hadoop经常启动失败,或者出现访问失败的情况。
  2. 在写代码之前,一定要把所有的关于hadoop,mapreduce的包导入。
  3. 将代码打包为一个jar包。

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

作者:sexycoder
链接:https://www.jianshu.com/p/f0b7e273539d

 
 
 
 
 
放一段事例,待用:

194.237.142.21 - - [/Sep/::: +] "GET /wp-content/uploads/2013/07/rstudio-git3.png HTTP/1.1"   "-" "Mozilla/4.0 (compatible;)"
183.49.46.228 - - [/Sep/::: +] "-" "-" "-"
163.177.71.12 - - [/Sep/::: +] "HEAD / HTTP/1.1" "-" "DNSPod-Monitor/1.0"
163.177.71.12 - - [/Sep/::: +] "HEAD / HTTP/1.1" "-" "DNSPod-Monitor/1.0"
101.226.68.137 - - [/Sep/::: +] "HEAD / HTTP/1.1" "-" "DNSPod-Monitor/1.0"
101.226.68.137 - - [/Sep/::: +] "HEAD / HTTP/1.1" "-" "DNSPod-Monitor/1.0"
60.208.6.156 - - [/Sep/::: +] "GET /wp-content/uploads/2013/07/rcassandra.png HTTP/1.0" "http://cos.name/category/software/packages/" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.66 Safari/537.36"
222.68.172.190 - - [/Sep/::: +] "GET /images/my.jpg HTTP/1.1" "http://www.angularjs.cn/A00n" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.66 Safari/537.36"
222.68.172.190 - - [/Sep/::: +] "-" "-" "-"
183.195.232.138 - - [/Sep/::: +] "HEAD / HTTP/1.1" "-" "DNSPod-Monitor/1.0"
183.195.232.138 - - [/Sep/::: +] "HEAD / HTTP/1.1" "-" "DNSPod-Monitor/1.0"
66.249.66.84 - - [/Sep/::: +] "GET /page/6/ HTTP/1.1" "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
221.130.41.168 - - [/Sep/::: +] "GET /feed/ HTTP/1.1" "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.66 Safari/537.36"
157.55.35.40 - - [/Sep/::: +] "GET /robots.txt HTTP/1.1" "-" "Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)"
50.116.27.194 - - [/Sep/::: +] "POST /wp-cron.php?doing_wp_cron=1379487095.2510800361633300781250 HTTP/1.0" "-" "WordPress/3.6; http://blog.fens.me"
58.215.204.118 - - [/Sep/::: +] "GET /nodejs-socketio-chat/ HTTP/1.1" "http://www.google.com/url?sa=t&rct=j&q=nodejs%20%E5%BC%82%E6%AD%A5%E5%B9%BF%E6%92%AD&source=web&cd=1&cad=rja&ved=0CCgQFjAA&url=%68%74%74%70%3a%2f%2f%62%6c%6f%67%2e%66%65%6e%73%2e%6d%65%2f%6e%6f%64%65%6a%73%2d%73%6f%63%6b%65%74%69%6f%2d%63%68%61%74%2f&ei=rko5UrylAefOiAe7_IGQBw&usg=AFQjCNG6YWoZsJ_bSj8kTnMHcH51hYQkAA&bvm=bv.52288139,d.aGc" "Mozilla/5.0 (Windows NT 5.1; rv:23.0) Gecko/20100101 Firefox/23.0"
58.215.204.118 - - [/Sep/::: +] "GET /wp-includes/js/jquery/jquery-migrate.min.js?ver=1.2.1 HTTP/1.1" "http://blog.fens.me/nodejs-socketio-chat/" "Mozilla/5.0 (Windows NT 5.1; rv:23.0) Gecko/20100101 Firefox/23.0"
58.215.204.118 - - [/Sep/::: +] "GET /wp-includes/js/jquery/jquery.js?ver=1.10.2 HTTP/1.1" "http://blog.fens.me/nodejs-socketio-chat/" "Mozilla/5.0 (Windows NT 5.1; rv:23.0) Gecko/20100101 Firefox/23.0"
58.215.204.118 - - [/Sep/::: +] "GET /wp-includes/js/comment-reply.min.js?ver=3.6 HTTP/1.1" "http://blog.fens.me/nodejs-socketio-chat/" "Mozilla/5.0 (Windows NT 5.1; rv:23.0) Gecko/20100101 Firefox/23.0"
58.215.204.118 - - [/Sep/::: +] "GET /wp-content/uploads/2013/08/chat.png HTTP/1.1" "http://blog.fens.me/nodejs-socketio-chat/" "Mozilla/5.0 (Windows NT 5.1; rv:23.0) Gecko/20100101 Firefox/23.0"
58.215.204.118 - - [/Sep/::: +] "GET /wp-content/uploads/2013/08/chat2.png HTTP/1.1" "http://blog.fens.me/nodejs-socketio-chat/" "Mozilla/5.0 (Windows NT 5.1; rv:23.0) Gecko/20100101 Firefox/23.0"
58.215.204.118 - - [/Sep/::: +] "GET /wp-content/uploads/2013/08/socketio.png HTTP/1.1" "http://blog.fens.me/nodejs-socketio-chat/" "Mozilla/5.0 (Windows NT 5.1; rv:23.0) Gecko/20100101 Firefox/23.0"
58.248.178.212 - - [/Sep/::: +] "GET /nodejs-grunt-intro/ HTTP/1.1" "http://blog.fens.me/series-nodejs/" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; MDDR; InfoPath.2; .NET4.0C)"
58.248.178.212 - - [/Sep/::: +] "GET /wp-includes/js/jquery/jquery-migrate.min.js?ver=1.2.1 HTTP/1.1" "http://blog.fens.me/nodejs-grunt-intro/" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; MDDR; InfoPath.2; .NET4.0C)"
58.248.178.212 - - [/Sep/::: +] "GET /wp-includes/js/comment-reply.min.js?ver=3.6 HTTP/1.1" "http://blog.fens.me/nodejs-grunt-intro/" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; MDDR; InfoPath.2; .NET4.0C)"
58.248.178.212 - - [/Sep/::: +] "GET /wp-includes/js/jquery/jquery.js?ver=1.10.2 HTTP/1.1" "http://blog.fens.me/nodejs-grunt-intro/" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; MDDR; InfoPath.2; .NET4.0C)"
58.248.178.212 - - [/Sep/::: +] "GET /wp-includes/js/jquery/jquery.js?ver=1.10.2 HTTP/1.1" "http://blog.fens.me/nodejs-grunt-intro/" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; MDDR; InfoPath.2; .NET4.0C)"
58.248.178.212 - - [/Sep/::: +] "GET /wp-includes/js/comment-reply.min.js?ver=3.6 HTTP/1.1" "http://blog.fens.me/nodejs-grunt-intro/" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; MDDR; InfoPath.2; .NET4.0C)"

使用mapreduce来分析网站的log日志的更多相关文章

  1. 分析nginx access log日志的命令

    统计访问最多的ip 1. tail -n 10000 xxaccess_log | cut -d " " -f 1 |sort|uniq -c|sort -rn|head -10 ...

  2. shell分析nginx access log日志

    统计访问最多的ip1. tail -n 10000 xxaccess_log | cut -d " " -f 1 |sort|uniq -c|sort -rn|head -10 | ...

  3. [日志分析] Access Log 日志分析

    0x00.前言: 如何知道自己所在的公司或单位是否被入侵了?是没人来“黑”,还是因自身感知能力不足,暂时还没发现?入侵检测是每个安全运维人员都要面临的严峻挑战.安全无小事,一旦入侵成功,后果不堪设想. ...

  4. Android中对Log日志文件的分析[转]

    一,Bug出现了, 需要“干掉”它 bug一听挺吓人的,但是只要你懂了,android里的bug是很好解决的,因为android里提供了LOG机制,具体的底层代码,以后在来分析,只要你会看bug, a ...

  5. java OOM还在看log日志,兄弟你错的的很严重,正确方式是分析dump文件

    目录 OOM异常--intsmaze 正确姿势dump文件分析--intsmaze 正确的姿势--intsmaze dump丢失打印--intsmaze 哪些内存溢出会产生dump文件--intsma ...

  6. Android log 日志分析

    一. Log 日志中 Bug 类型 程序异常强制关闭: Force Close ,Fatal 程序无响应: Application Not Response , ANR(应用无响应).一般是主线程超时 ...

  7. (转)DB2 db2diag.log 日志分析

    DB2 db2diag.log 日志分析 原文:http://blog.csdn.net/lyjiau/article/details/52129997 db2diag.log是用来记录DB2数据库运 ...

  8. 如何分析和研究Log文件 ,如何看日志信息

    如何分析和研究Log文件 ,如何看日志信息 . Log 在android中的地位非常重要,要是作为一个android程序员不能过分析log这关,算是android没有入门吧 . 下面我们就来说说如何处 ...

  9. 【Hadoop离线基础总结】流量日志分析网站整体架构模块开发

    目录 数据仓库设计 维度建模概述 维度建模的三种模式 本项目中数据仓库的设计 ETL开发 创建ODS层数据表 导入ODS层数据 生成ODS层明细宽表 统计分析开发 流量分析 受访分析 访客visit分 ...

随机推荐

  1. window.name实现的跨域数据传输 JavaScript跨域总结与解决办法

    原文地址:  http://www.cnblogs.com/rainman/archive/2011/02/20/1959325.html#m4 什么是跨域 1.document.domain+ifr ...

  2. iOS:通过Self-Sizing Cells新特性自动计算cell的高度

    iOS8 新特性Self-Sizing Cells,自动计算cell的高度 一.简单介绍 UITableView是iOS开发最常用的一个控件,通过代理和数据源方法,几乎能实现各种各样的列表功能.在这里 ...

  3. iOS:在tableView中通过Masonry使用autolayout在iOS7系统出现约束崩溃

    一.出现崩溃情景: 给tableView创建一个头视图,也即tableHeaderView,然后使用Masonry并切换到iOS7/7.1系统给tableHeaderView中的所有子视图添加约束,此 ...

  4. Python Configparser模块读取、写入配置文件

    写代码中需要用到读取配置,最近在写python,记录一下. 如下,假设有这样的配置. [db] db_host=127.0.0.1 db_port=3306 db_user=root db_pass= ...

  5. Html.AntiForgeryToken() 防止CSRF攻击 的AJaX应用

    有关Html.AntiForgeryToken()的使用其实网上的说明很多了,比如http://blog.csdn.net/cpytiger/article/details/8781457 那么我们写 ...

  6. Win7局域网打印机共享设置(详细图文流程)

    本文将向读者说明在Win7下如何实现同个局域网内共享打印机.经过测试,Win7之间和Win7与XP之间均可正常连接. 第一步:取消禁用Guest用户 1. 点击[开始]按钮,在[计算机]上右键,选择[ ...

  7. Search Insert Position leetcode java

    Given a sorted array and a target value, return the index if the target is found. If not, return the ...

  8. Neo4j 2.0 生产环境集群搭建

    一.在windows上搭建Neo4j ha cluster的配置方法: 例如:建立集群的三台机器的ip分别为:10.230.9.91,10.230.9.92,10.230.9.93. 10.230.9 ...

  9. Android利用RecognizerIntent识别语音并简单实现打电话动作

    关于Android利用RecognizerIntent识别语音并简单实现打电话,详细看实现代码例如以下: package com.example.recognizerintentactivity; i ...

  10. Log4net的不能产生Log文件的问题

    [问题] 用如下的步骤应用了Log4Net: 建立了一个公用的项目, 在里面引入了Log4net的Nuget package. 在公用的项目中建立了一个类,加上了Log4net的attribute. ...