So verwenden Sie Spark und Scala zum Analysieren von Apache-Zugriffsprotokollen

So verwenden Sie Spark und Scala zum Analysieren von Apache-Zugriffsprotokollen

Installieren

Zuerst müssen Sie Java und Scala installieren, dann Spark herunterladen und installieren, sicherstellen, dass PATH und JAVA_HOME festgelegt sind, und dann müssen Sie Scalas SBT verwenden, um Spark wie folgt zu erstellen:

$ sbt/sbt-Baugruppe

Die Bauzeit ist relativ lang. Sobald der Build abgeschlossen ist, überprüfen Sie, ob die Installation erfolgreich war, indem Sie Folgendes ausführen:

$ ./bin/spark-shell
scala> val textFile = sc.textFile("README.md") // Erstelle eine Referenz auf README.md scala> textFile.count // Zähle die Anzahl der Zeilen in dieser Datei scala> textFile.first // Drucke die erste Zeile

Apache-Zugriffsprotokoll-Analysator

Zuerst müssen wir Scala verwenden, um einen Analysator für Apache-Zugriffsprotokolle zu schreiben. Glücklicherweise hat das schon jemand geschrieben. Laden Sie den Code des Apache-Protokolldatei-Parsers herunter. Verwenden Sie SBT zum Kompilieren und Verpacken von:

sbt kompilieren
SBT-Test
sbt-Paket

Der Paketname wird als AlsApacheLogParser.jar angenommen.
Starten Sie dann Spark in der Linux-Befehlszeile:

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

Bei Spark 0.9 funktionieren einige Methoden nicht:

// funktioniert nicht
$ MASTER=local[4] ADD_JARS=AlsApacheLogParser.jar ./bin/spark-shell
// funktioniert nicht
spark> :cp AlsApacheLogParser.jar

Erstellen Sie nach erfolgreichem Upload eine AccessLogParser-Instanz im Spark REPL:

importiere com.alvinalexander.accesslogparser._
val p = neuer AccessLogParser

Jetzt können Sie das Apache-Zugriffsprotokoll accesslog.small genauso lesen, wie Sie zuvor readme.cmd gelesen haben:

scala> val log = sc.textFile("accesslog.small")
14/03/09 11:25:23 INFO MemoryStore: EnsureFreeSpace(32856) aufgerufen mit curMem=0, maxMem=309225062
14.03.09 11:25:23 INFO MemoryStore: Block broadcast_0 als Werte im Speicher abgelegt (geschätzte Größe 32,1 KB, frei 294,9 MB)
log: org.apache.spark.rdd.RDD[String] = MappedRDD[1] bei Textdatei bei <Konsole>:15
scala> log.Anzahl
(viel Ausgabe hier)
res0: Lang = 100000

Analysieren von Apache-Protokollen

Wir können analysieren, wie viele 404-Fehler es im Apache-Protokoll gibt. Die Erstellungsmethode ist wie folgt:

def getStatusCode(Zeile: Option[AccessLogRecord]) = {
 Zeilenübereinstimmung {
  Fall Some(l) => l.httpStatusCode
  Fall Keine => "0"
 }
}

Option[AccessLogRecord] ist der Rückgabewert des Analysators.

Verwenden Sie es dann in der Spark-Befehlszeile wie folgt:

log.filter(Zeile => getStatusCode(p.parseRecord(Zeile)) == "404").Anzahl

Diese Statistik gibt die Anzahl der Zeilen zurück, deren httpStatusCode 404 ist.

Tiefer graben

Wenn wir nun wissen möchten, welche URLs problematisch sind, z. B. ein Leerzeichen in der URL, das einen 404-Fehler verursacht, sind offensichtlich die folgenden Schritte erforderlich:

  1. Alle 404-Einträge herausfiltern
  2. Holen Sie sich das Anforderungsfeld aus jedem 404-Datensatz (ob die vom Analysator angeforderte URL-Zeichenfolge Leerzeichen usw. enthält).
  3. Keine doppelten Datensätze zurückgeben

Erstellen Sie die folgende Methode:

// Holen Sie sich das Feld „Anforderung“ aus einem Zugriffsprotokolldatensatz
def getRequest(rawAccessLogString: String): Option[String] = {
 val accessLogRecordOption = p.parseRecord(rawAccessLogString)
 accessLogRecordOption-Übereinstimmung {
  Fall Einige(rec) => Einige(rec.request)
  Fall Keine => Keine
 }
}

Fügen Sie diesen Code in Spark REPL ein und führen Sie den folgenden Code aus:

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

Zusammenfassen

Für die einfache Analyse von Zugriffsprotokollen ist grep natürlich die bessere Wahl, für komplexere Abfragen ist jedoch Spark erforderlich. Es ist schwierig, die Leistung von Spark auf einem einzelnen System zu beurteilen. Dies liegt daran, dass Spark für verteilte Systeme mit großen Dateien entwickelt wurde.

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird.

Das könnte Sie auch interessieren:
  • Was sind die neuen Funktionen von Apache Spark 2.4, das 2018 veröffentlicht wird?
  • Apache Spark 2.0-Jobs brauchen lange, bis sie abgeschlossen sind

<<:  So konfigurieren Sie SSL für den Koa2-Dienst

>>:  Grafisches Tutorial zur Installation und Konfiguration der Mysql5.7.17 winx64.zip-Dekomprimierungsversion

Artikel empfehlen

Tutorial zum Bereitstellen von LNMP und Aktivieren des HTTPS-Dienstes

Was ist LNMP: Linux+Nginx+Mysql+(php-fpm,php-mysq...

So legen Sie den Fokus auf HTML-Elemente fest

Code kopieren Der Code lautet wie folgt: <Körp...

Tutorial zur Installation der komprimierten MySQL8-Paketversion unter Win10

1 Laden Sie MySQL8 von der offiziellen Website he...

Detaillierte Erläuterung der Hochverfügbarkeitskonfiguration von Docker

Docker Compose Docker Compose unterteilt die verw...

So installieren Sie Mysql5.7 in Centos6

Umfeld Centos 6.6 MySQL 5.7 Installieren Falls da...

js native Karussell-Plugin-Produktion

In diesem Artikel wird der spezifische Code für d...

Aufbau einer Zookeeper-Standalone-Umgebung und einer Clusterumgebung

1. Aufbau einer Einzelmaschinenumgebung# 1.1 Heru...

So verwenden Sie einen Docker-Container für den Zugriff auf das Host-Netzwerk

Vor Kurzem wurde ein System bereitgestellt, das n...

Vue.js implementiert eine Bildwechselfunktion

In diesem Artikel wird der spezifische Code von V...

Connector-Konfiguration in Tomcat

JBoss verwendet Tomcat als Webcontainer. Die Konf...

CSS3-Implementierungscode für einfaches Karussellbildschneiden

Umsetzungsideen Erstellen Sie zunächst einen über...

MySQL-Vorkompilierung in einem Artikel verstehen

1. Vorteile der Vorkompilierung Wir haben alle di...

So verschieben Sie ein rotes Rechteck mit der Maus im Linux-Zeichenterminal

Alles ist eine Datei! UNIX hat es bereits gesagt....

Beispiel für die Mosaikierung eines Bildes mit js

Dieser Artikel stellt hauptsächlich ein Beispiel ...