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

  


  

  

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

        sbt美元/sbt大会      

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

        美元/bin/spark-shell   之前            scala>val文本文件=sc.textFile (README.md)//创建一个指向README。md引用   scala>文本文件。//计数对这个文件内容行数进行计数   scala>文本文件。第一//打印出第一行   之前      


  

  

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

        sbt编译   sbt测试   sbt包   之前      

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

     //这是   $主=当地[4]SPARK_CLASSPATH=AlsApacheLogParser。jar/bin/spark-shell   之前      0.9

对于火花,有些方式并不起效:
  

     //不工作   $主=当地[4]ADD_JARS=AlsApacheLogParser。jar/bin/spark-shell//不工作   spark>:cp AlsApacheLogParser.jar   之前      

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

        进口com.alvinalexander.accesslogparser._   新AccessLogParser val p=之前      

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

        scala>val日志=sc.textFile (“accesslog.small”)   14/03/09 11:25:23信息MemoryStore: ensureFreeSpace curMem=0(32856)称,maxMem=309225062   14/03/09 11:25:23信息MemoryStore: broadcast_0作为值存储内存块(约32.1 KB大小,免费294.9 MB)   日志:org.apache.spark.rdd。抽样[String]=MappedRDD[1]在文本文件& lt; console>: 15   scala>log.count   (大量的输出)   res0:长=100000   之前      


  

  

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

        def getStatusCode(线:选择[AccessLogRecord])={   {是否相符   一些(l)=比;l.httpStatusCode   情况下没有=比;“0”   }   }   之前      

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

  

然后在火花命令行使用如下:
  

        日志。过滤器(行=比;getStatusCode (p.parseRecord(线)).count==" 404 ")   之前      

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

  

  

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

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

创建下面方法:
  

     //得到“请求”字段的访问日志记录   def getRequest (rawAccessLogString: String):选择[String]={   val accessLogRecordOption=p.parseRecord (rawAccessLogString)   {accessLogRecordOption匹配   一些(rec)=比;一些(rec.request)   情况下没有=比;没有一个   }   }   之前      

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

        日志。过滤器(行=比;getStatusCode (p.parseRecord(线))==" 404 "). map (getRequest (_)) .count   val recs=日志。过滤器(行=比;getStatusCode (p.parseRecord(线))==" 404 "). map (getRequest (_))   val distinctRecs=日志。过滤器(行=比;getStatusCode (p.parseRecord(线))==" 404 "). map (getRequest (_)) .distinct   distinctRecs.foreach println ()   之前      


  

  

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

  

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

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