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

js+canvas realisiert Code-Regeneffekt

In diesem Artikel wird der spezifische Code des j...

Detaillierte Schritte zum Bereitstellen von Microsoft SQL Server mit Docker

Inhaltsverzeichnis 1 Hintergrund 2 Erstellen Sie ...

Lösungen für MySQL-Batch-Insert- und eindeutige Indexprobleme

MySQL-Batch-Einfügeproblem Da bei der Entwicklung...

Beispiel für den Aufbau eines Jenkins-Dienstes mit Docker

Ziehen Sie das Bild root@EricZhou-MateBookProX: D...

Detaillierte Erklärung zu Padding und Abkürzungen im CSS-Boxmodell

Wie oben gezeigt, sind Füllwerte zusammengesetzte...

Zusammenfassung der Anwendung von Übergangskomponenten in Vue-Projekten

​Transtion in Vue ist eine Kapselungskomponente f...

Implementieren Sie eine einfache Suchmaschine auf Basis von MySQL

Inhaltsverzeichnis Implementierung einer Suchmasc...

Wissen Sie, warum Vue-Daten eine Funktion sind?

Erklärung auf der offiziellen Website: Wenn eine ...

Probleme und Lösungen bei der Verwendung der jsx-Syntax in React-vscode

Problembeschreibung Nach der Installation des Plu...

Detaillierte Einführung in den HTML-Head-Tag

Der HTML-Kopfteil enthält viele Tags und Elemente,...