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

Fehler MySQL-Tabelle 'performance_schema...Lösung

Die Testumgebung ist mit MariaDB 5.7 eingerichtet...

Analyse impliziter Fehler bei der gleichzeitigen Replikation von MySQL 5.7

Vorwort Die meisten unserer MySQL-Onlineumgebunge...

Details zu benutzerdefinierten Vue3-Anweisungen

Inhaltsverzeichnis 1. Benutzerdefinierte Anweisun...

jQuery implementiert Akkordeoneffekte

Dieser Artikel gibt Ihnen den spezifischen Code v...

Schritte zum Erstellen des Projekts vite+vue3+element-plus

Verwenden Sie vite, um ein vue3-Projekt zu erstel...

Implementierung des CSS-Quellcodes für herzförmige Ladeanimationen

Lassen Sie mich Ihnen ohne weitere Umschweife den...

So implementieren Sie verschiebbare Komponenten in Vue

In diesem Artikel erfahren Sie, wie Sie ziehbare ...

Linux verwendet NetworkManager, um Ihre MAC-Adresse zufällig zu generieren

Egal, ob Sie zu Hause auf dem Sofa oder draußen i...

Installations-Tutorial zur MySQL 5.7.17 Zip-Paketversion unter Win10

Das Installationstutorial für mysql5.7.17 wird Ih...

Details zur MySQL-Datenbankarchitektur

Inhaltsverzeichnis 1. MySQL-Architektur 2. Netzwe...