• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    详解如何使用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是针对分布式系统大文件。

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

    上一篇:Nginx日志自定义记录以及启用日志缓冲区详解
    下一篇:Nginx下升级https的方法步骤
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

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