Spark と Scala を使用して Apache アクセス ログを分析する方法

Spark と Scala を使用して Apache アクセス ログを分析する方法

インストール

まず、Java と Scala をインストールし、次に Spark をダウンロードしてインストールし、PATH と JAVA_HOME が設定されていることを確認してから、Scala の SBT を使用して次のように Spark をビルドする必要があります。

$ sbt/sbt アセンブリ

ビルド時間は比較的長くなります。ビルドが完了したら、次のコマンドを実行してインストールが成功したことを確認します。

$ ./bin/spark-shell
scala> val textFile = sc.textFile("README.md") // README.md への参照を作成します scala> textFile.count // このファイルの行数をカウントします scala> textFile.first // 最初の行を出力します

Apache アクセス ログ アナライザー

まず、Scala を使用して Apache アクセス ログのアナライザーを作成する必要があります。幸いなことに、すでに誰かが作成しています。Apache ログファイル パーサー コードをダウンロードしてください。 SBT を使用してコンパイルおよびパッケージ化します。

sbt コンパイル
sbt テスト
sbt パッケージ

パッケージ名は AlsApacheLogParser.jar であると想定されます。
次に、Linux コマンドラインで Spark を起動します。

// これは動作します
$ MASTER=local[4] SPARK_CLASSPATH=AlsApacheLogParser.jar ./bin/spark-shell

Spark 0.9 では、いくつかのメソッドが機能しません。

// 動作しません
$ MASTER=local[4] ADD_JARS=AlsApacheLogParser.jar ./bin/spark-shell
// 動作しません
spark> :cp AlsApacheLogParser.jar

アップロードが成功したら、Spark REPL で AccessLogParser インスタンスを作成します。

com.alvinalexander.accesslogparser._ をインポートします。
val p = 新しい AccessLogParser

これで、以前の readme.cmd を読むのと同じように、Apache アクセス ログ accesslog.small を読むことができます。

scala> val log = sc.textFile("accesslog.small")
14/03/09 11:25:23 INFO MemoryStore: curMem=0、maxMem=309225062 で EnsureFreeSpace(32856) が呼び出されました
14/03/09 11:25:23 INFO MemoryStore: ブロックbroadcast_0が値としてメモリに保存されました (推定サイズ 32.1 KB、空き容量 294.9 MB)
ログ: org.apache.spark.rdd.RDD[String] = MappedRDD[1]、textFile、<console>:15
scala> log.count
(ここには大量の出力があります)
res0: ロング = 100000

Apache ログの分析

Apache ログに 404 がいくつあるかを分析できます。作成方法は次のとおりです。

def getStatusCode(行: Option[AccessLogRecord]) = {
 行一致 {
  ケース Some(l) => l.httpStatusCode
  なしの場合 => "0"
 }
}

Option[AccessLogRecord]はアナライザーの戻り値です。

次に、Spark コマンドラインで次のように使用します。

log.filter(line => getStatusCode(p.parseRecord(line)) == "404").count

この統計は、httpStatusCode が 404 である行の数を返します。

さらに深く掘り下げる

ここで、URL 内のスペースによって 404 エラーが発生するなど、どの URL に問題があるのか​​を知りたい場合は、当然次の手順が必要です。

  1. すべての404レコードを除外する
  2. 各 404 レコードからリクエスト フィールドを取得します (アナライザーによって要求された URL 文字列にスペースが含まれているかどうかなど)
  3. 重複レコードを返さない

次のメソッドを作成します。

// アクセスログレコードから `request` フィールドを取得します
def getRequest(rawAccessLogString: String): オプション[String] = {
 val accessLogRecordOption = p.parseRecord(rawAccessLogString)
 accessLogRecordOption 一致 {
  ケース Some(rec) => Some(rec.request)
  ケースなし => なし
 }
}

このコードを Spark REPL に貼り付けて、次のコードを実行します。

log.filter(line => getStatusCode(p.parseRecord(line)) == "404").map(getRequest(_)).count
val recs = log.filter(line => getStatusCode(p.parseRecord(line)) == "404").map(getRequest(_))
val distinctiveRecs = log.filter(line => getStatusCode(p.parseRecord(line)) == "404").map(getRequest(_)).distinct
個別のRecs.foreach(println)

要約する

アクセス ログの単純な分析には、もちろん grep の方が適していますが、より複雑なクエリには Spark が必要です。単一のシステム上で Spark のパフォーマンスを判断するのは困難です。これは、Spark が大きなファイルを扱う分散システム向けに設計されているためです。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • 2018 年にリリースされる Apache Spark 2.4 の新機能は何ですか?
  • Apache Spark 2.0ジョブは完了するまでに長い時間がかかります

<<:  koa2 サービスに SSL を設定する方法

>>:  Mysql5.7.17 winx64.zip 解凍バージョンのインストールと設定のグラフィックチュートリアル

推薦する

MySQL 5.7.9 シャットダウン構文例の詳細な説明

mysql-5.7.9 では、ついにシャットダウン構文が提供されます。以前は、MySQL データベー...

Tomcat の文字化けしたコードとポート占有の解決方法について簡単に説明します

Tomcat サーバーは、無料でオープン ソースの Web アプリケーション サーバーです。軽量のア...

XshellがvirtualBox仮想マシンに接続できない問題の解決策

まず、VirtualBox仮想マシンのネットワーク設定モードについて説明します。NAT+ホストオンリ...

Nginx 構成 PC サイトとモバイル サイトの分離によるリダイレクトの実現

PCサイトとモバイルサイトの分離設定にはnginxを使います。私のPCサイトとモバイルサイトは、SE...

Vue プロジェクトで垂直テーブルを 2 つの方法で実装するアイデアの分析

問題の説明私たちのプロジェクトでは、水平方向のテーブルが一般的ですが、必要に応じて垂直方向のテーブル...

Nginx ロケーション設定のチュートリアル (ゼロから)

基礎位置の一致順序は、「最初に正規表現に一致し、次に共通表現に一致」です。実際のロケーションの一致順...

Windows での MySQL のダウンロード、インストール、設定、使用に関するチュートリアル

MySQLの概要MySQL はリレーショナル データベース管理システムです。データベースは構造化され...

一般的な XHTML タグの使用方法の紹介

XHTML には多くのタグがありますが、頻繁に使用されるのはごくわずかであり、習得する必要があるのは...

Ubuntu 18.04 Server バージョンのインストールと使用方法 (画像とテキスト)

1 システムのインストール手順OSバージョン:1804イメージのダウンロード: http://cd...

スライダー間隔コンポーネントのネイティブ js 実装

この記事の例では、スライダー間隔コンポーネントを実装するためのjsの具体的なコードを参考までに共有し...

DockerコンテナにRedisをデプロイする手順の紹介

目次1 つの Redis 設定ファイル2 Dockerコマンドの開始3 docker-compose...

MySQL テーブルの読み取り、書き込み、インデックス作成、その他の操作の SQL ステートメントの効率最適化の問題を分析します。

前回は、Explain 実行プランの表示、インデックスの分析など、MySQL での SQL クエリの...

Linux で特定の時間にコマンドを実行する方法

先日、rsync を使用して LAN 上の別のシステムに大きなファイルを転送していました。非常に大き...

Vue3 における親コンポーネントと子コンポーネント間の値の転送の詳細な説明

vue3 が誕生してからかなり時間が経ち、筆者も最近になって vue3 を学び始めました。 vue2...

フォント宝庫 50 種類の素晴らしい無料英語フォントリソース パート 2

デザイナーは独自のフォント ライブラリを持っているため、プロジェクトの設計時にすぐに使用できます。今...