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

Vollständiger Schrittbericht zur Vue-Kapselung allgemeiner Tabellenkomponenten

Inhaltsverzeichnis Vorwort Warum müssen wir die T...

Einführung in den Swap-Speicher des Linux-Systems

Swap-Speicher ist heutzutage ein gängiger Aspekt ...

Detaillierte Erklärung des JavaScript-Timer-Prinzips

Inhaltsverzeichnis 1. setTimeout()-Timer 2. Stopp...

Detaillierter Installationsprozess und Prinzip des Vue-Routers

Inhaltsverzeichnis 1. Implementierungsprinzip des...

CSS3 realisiert Partikelanimationseffekte beim Matching von Königen

Beim Codieren werden Sie feststellen, dass viele ...

CSS3 realisiert verschiedene grafische Effekte kleiner Pfeile

Es ist großartig, CSS zu verwenden, um verschiede...

Was sind die Unterschiede zwischen var let const in JavaScript

Inhaltsverzeichnis 1. Wiederholte Erklärung 1,1 v...

Der Unterschied zwischen ${param} und #{param} in MySQL

Der von ${param} übergebene Parameter wird als Te...

Schriftreferenzen und Übergangseffekte außerhalb des Systems

Code kopieren Der Code lautet wie folgt: <span...