详解如何使用Spark和Scala分析Apache访问日志

安装

首先需要安装好Java和Scala,然后下载Spark安装,确保PATH 和JAVA_HOME 已经设置,然后需要使用Scala的SBT构建Spark如下:

$ sbt/sbt assembly

构建时间比较长。构建完成后,通过运行下面命令确证安装成功:

$ ./bin/spark-shell
scala> val textFile = sc.textFile("README.md") // 创建一个指向 README.md 引用
scala> textFile.count // 对这个文件内容行数进行计数
scala> textFile.first // 打印出第一行

Apache访问日志分析器

首先我们需要使用Scala编写一个对Apache访问日志的分析器,所幸已经有人编写完成,下载Apache logfile parser code。使用SBT进行编译打包:

sbt compile
sbt test
sbt package

打包名称假设为AlsApacheLogParser.jar。
然后在Linux命令行启动Spark:

// this works
$ MASTER=local[4] SPARK_CLASSPATH=AlsApacheLogParser.jar ./bin/spark-shell

对于Spark 0.9,有些方式并不起效:

// does not work
$ MASTER=local[4] ADD_JARS=AlsApacheLogParser.jar ./bin/spark-shell
// does not work
spark> :cp AlsApacheLogParser.jar

上传成功后,在Spark REPL创建AccessLogParser 实例:

import com.alvinalexander.accesslogparser._
val p = new AccessLogParser

现在就可以像之前读取readme.cmd一样读取apache访问日志accesslog.small:

scala> val log = sc.textFile("accesslog.small")
14/03/09 11:25:23 INFO MemoryStore: ensureFreeSpace(32856) called with curMem=0, maxMem=309225062
14/03/09 11:25:23 INFO MemoryStore: Block broadcast_0 stored as values to memory (estimated size 32.1 KB, free 294.9 MB)
log: org.apache.spark.rdd.RDD[String] = MappedRDD[1] at textFile at <console>:15
scala> log.count
(a lot of output here)
res0: Long = 100000

分析Apache日志

我们可以分析Apache日志中404有多少个,创建方法如下:

def getStatusCode(line: Option[AccessLogRecord]) = {
 line match {
  case Some(l) => l.httpStatusCode
  case None => "0"
 }
}

其中Option[AccessLogRecord]是分析器的返回值。

然后在Spark命令行使用如下:

log.filter(line => getStatusCode(p.parseRecord(line)) == "404").count

这个统计将返回httpStatusCode是404的行数。

深入挖掘

下面如果我们想知道哪些URL是有问题的,比如URL中有一个空格等导致404错误,显然需要下面步骤:

  1. 过滤出所有 404 记录
  2. 从每个404记录得到request字段(分析器请求的URL字符串是否有空格等)
  3. 不要返回重复的记录

创建下面方法:

// get the `request` field from an access log record
def getRequest(rawAccessLogString: String): Option[String] = {
 val accessLogRecordOption = p.parseRecord(rawAccessLogString)
 accessLogRecordOption match {
  case Some(rec) => Some(rec.request)
  case None => None
 }
}

将这些代码贴入Spark REPL,再运行如下代码:

log.filter(line => getStatusCode(p.parseRecord(line)) == "404").map(getRequest(_)).count
val recs = log.filter(line => getStatusCode(p.parseRecord(line)) == "404").map(getRequest(_))
val distinctRecs = log.filter(line => getStatusCode(p.parseRecord(line)) == "404").map(getRequest(_)).distinct
distinctRecs.foreach(println)

总结

对于访问日志简单分析当然是要grep比较好,但是更复杂的查询就需要Spark了。很难判断 Spark在单个系统上的性能。这是因为Spark是针对分布式系统大文件。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 限制 Apache日志文件大小的方法

    通常我们是在{$apache}/conf/httpd.conf中设置Apache的参数,然而我们并没有发现可以设置日志文件大小的配置指令,通过参考http://httpd.apache.org/docs/2.0/programs/rotatelogs.html,可以用apache 自己的程序 rotatelogs.exe(位于 {$apache}/bin/目录下),来限制日志文件的大小. Usage: rotatelogs [-l] [offset minutes from UTC] or Ad

  • 使用apachetop实时监控日志、动态分析服务器运行状态

    我们经常会需要知道服务器的实时监测服务器的运行状况,比如哪些 URL 的访问量最大,服务器每秒的请求数,哪个搜索引擎正在抓取我们网站?面对这些问题,我们虽然可以去分析查看统计访问日志文件,但是却不能让我们实时统计,不能给我们直观的统计数据.现在好了,apachetop这个工具就可以实时的跟踪log的变化,能查看访问者正在查看哪些文件,和访问者IP等信息. 1. apachetop安装 复制代码 代码如下: # rpm -ivh http://mirrors.hustunique.com/epel

  • Apache日志管理和统计分析知识

    对于所有公司或icp来说,在保证网站稳定正常运行外,还需要了解网站访问量和分析报表,这对于了解和监控网站的运行状态,对于提高网站的服务能力和服务水平似乎必不可少的.通过对web服务器的日志文件进行分析和统计,能够有效的掌握系统运行的情况及站点内容的被访问情况,加强对整个站及其内容的维护与管理: Apache服务器具备强大的日志功能,管理员可以方便.准备.及时地了解服务器状况:可以更好地防范黑客的攻击. Apache规定了4类日志,分别为:错误日志.访问日志.传输日志以及Cookie日志.其中Ap

  • apache日志文件详解和实用分析命令

    一.日志分析 如果apache的安装时采用默认的配置,那么在/logs目录下就会生成两个文件,分别是access_log和error_log 1).access_log access_log为访问日志,记录所有对apache服务器进行请求的访问,它的位置和内容由CustomLog指令控制,LogFormat指令可以用来简化该日志的内容和格式 例如,我的其中一台服务器配置如下: 复制代码 代码如下: CustomLog "| /usr/sbin/rotatelogs /var/log/apache

  • apache使用日志分割模块rotatelogs分割日志详解

    rotatelogs 是 Apache 2.2 中自带的管道日志程序 语法 复制代码 代码如下: rotatelogs [ -l ] logfile [ rotationtime [ offset ]] | [ filesizeM ] 选项-l使用本地时间代替GMT时间作为时间基准.注意:在一个改变GMT偏移量(比如夏令时)的环境中使用-l会导致不可预料的结果. logfile它加上基准名就是日志文件名.如果logfile中包含"%",则它会被视为用于strftime()的格式字符串:

  • apache日志配置一例

    1.vim /usr/local/apache2/conf/extra/httpd-vhosts.conf 添加或修改为: 复制代码 代码如下: ErrorLog "logs/www.7755gg.com-error_log"ErrorLog "/data/home/777logs/www.7755gg.com-error_log"CustomLog "logs/www.7755gg.com-access_log" commonCustomLog

  • apache 配置成滚动日志的方法

    下面配置配置成每24小时产生1个新的日志文件: #先搭建1个很简单网站进行访问 DocumentRoot E:/ApacheTestWeb <Directory E:/ApacheTestWeb> AllowOverride None Allow from all </Directory> #修改如下配置: CustomLog "|D:/Apache2.2/bin/rotatelogs.exe D:/Apache2.2/logs/access.log 86400"

  • 使用apache的rotatelogs命令实现WebLogic启动命令的nohup的日志回滚

    每天写一个日志: 复制代码 代码如下: nohup ./startWebLogic.sh | /apache/bin/rotatelogs ./logs/nohuplog 86400 & 每200M写一个日志: 复制代码 代码如下: nohup ./startWebLogic.sh | /apache/bin/rotatelogs ./logs/nohuplog 200M & 每200M写一个日志,按时间日期命令名: 复制代码 代码如下: nohup ./startWebLogic.sh

  • 详解如何使用Spark和Scala分析Apache访问日志

    安装 首先需要安装好Java和Scala,然后下载Spark安装,确保PATH 和JAVA_HOME 已经设置,然后需要使用Scala的SBT构建Spark如下: $ sbt/sbt assembly 构建时间比较长.构建完成后,通过运行下面命令确证安装成功: $ ./bin/spark-shell scala> val textFile = sc.textFile("README.md") // 创建一个指向 README.md 引用 scala> textFile.co

  • python分析apache访问日志脚本分享

    #!/usr/bin/env python # coding=utf-8 #------------------------------------------------------ # Name: Apache 日志分析脚本 # Purpose: 此脚本只用来分析Apache的访问日志 # Version: 2.0 # Author: LEO # Created: 2013-4-26 # Modified: 2013-5-4 # Copyright: (c) LEO 2013 #------

  • 详解java JDK 动态代理类分析(java.lang.reflect.Proxy)

    详解java JDK 动态代理类分析(java.lang.reflect.Proxy) /** * JDK 动态代理类分析(java.lang.reflect.Proxy使用) * * @author 张明学 * */ public class ProxyStudy { @SuppressWarnings("unchecked") public static void main(String[] args) throws Exception { // 动态代理类:通用指定类加载器,和接

  • 详解R语言中的PCA分析与可视化

    1. 常用术语 (1)标准化(Scale) 如果不对数据进行scale处理,本身数值大的基因对主成分的贡献会大.如果关注的是变量的相对大小对样品分类的贡献,则应SCALE,以防数值高的变量导入的大方差引入的偏见.但是定标(scale)可能会有一些负面效果,因为定标后变量之间的权重就是变得相同.如果我们的变量中有噪音的话,我们就在无形中把噪音和信息的权重变得相同,但PCA本身无法区分信号和噪音.在这样的情形下,我们就不必做定标. (2)特征值 (eigen value) 特征值与特征向量均为矩阵分

  • 详解SSM框架下结合log4j、slf4j打印日志

    本文主要介绍了详解SSM框架下结合log4j.slf4j打印日志,分享给大家,具体如下: 首先加入log4j和slf4j的jar包 <!-- 日志处理 <!-- slf4j日志包--> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.21</version> </dep

  • Node.js API详解之 util模块用法实例分析

    本文实例讲述了Node.js API详解之 util模块用法.分享给大家供大家参考,具体如下: Node.js API详解之 util util 模块主要用于支持 Node.js 内部 API 的需求.提供了大部分实用工具. 通过 const util = require('util'); 的方式引用util模块 util.callbackify(original) 说明: original:传递一个 async 函数,或者是一个返回Promise的异步函数. callbackify会返回一个方

  • Node.js API详解之 timer模块用法实例分析

    本文实例讲述了Node.js API详解之 timer模块用法.分享给大家供大家参考,具体如下: Node.js API详解之 timer timer 模块暴露了一个全局的 API,用于在某个未来时间段调用调度函数. 因为定时器函数是全局的,所以使用该 API 无需调用 require('timers'). Node.js 中的计时器函数实现了与 Web 浏览器提供的定时器类似的 API, 它使用了一个不同的内部实现,它是基于 Node.js 事件循环构建的. setImmediate(call

  • Node.js API详解之 os模块用法实例分析

    本文实例讲述了Node.js API详解之 os模块用法.分享给大家供大家参考,具体如下: os是Node的一个基础模块,提供了一些操作系统相关的属性接口. 通过 const os = require('os'); 的方式引用os模块,我们接着看下os都有哪些功能 说明: 一个字符串常量,定义操作系统相关的行末标志:POSIX 系统上值为\n,Windows下的值为\r\n demo: console.log('abc'+ os.EOL +'123'); //abc //123 os.arch(

  • Node.js API详解之 dgram模块用法实例分析

    本文实例讲述了Node.js API详解之 dgram模块用法.分享给大家供大家参考,具体如下: Node.js API详解之 dgram dgram模块提供了 UDP 数据包 socket 的实现. 使用以下方式引用: const dgram = require('dgram'); dgram.createSocket(options[, callback]) 说明: 创建一个 dgram.Socket 对象. 一旦创建了套接字,调用 socket.bind() 会指示套接字开始监听数据报消息

  • Node.js API详解之 V8模块用法实例分析

    本文实例讲述了Node.js API详解之 V8模块用法.分享给大家供大家参考,具体如下: Node.js API详解之 V8 v8 模块暴露了特定于V8版本内置到 Node.js 二进制文件中的API. 通过以下方式使用: const v8 = require('v8'); 注意: APIs 和实现可能在任何时间变动. v8.cachedDataVersionTag() 说明: 返回一个表示从V8版本,命令行标志和已检测到的CPU功能派生的"version tag"的整数. 这对于判

随机推荐