Fluentdを使ってETLを構築し、データ分析を効率化しよう|東京のWEB制作会社・ホームページ制作会社|株式会社GIG

Fluentdを使ってETLを構築し、データ分析を効率化しよう

2023-06-07 制作・開発

こんにちは、LeadGrid事業部でプロダクト開発をしている福田です。

プロダクトやサービスの開発では日々の改善が重要ですが、その際には現状のデータを分析し、改善に活かしていく必要があります。

そんなデータ分析の場面で活用できるのが、データ処理プラットフォームである『Fluentd』を使ったETLの構築です。

今回は、Fluentdを用いたETLの構築方法をご紹介します。


Fluentdとは?

Fluentdとは、ログデータを収集し、統合して扱いやすい形にするためのデータ処理プラットフォームです。

さまざまなシステムで管理されている大量のログデータを集約して分析できるため、データ分析の利便性向上に役立ちます。

また、各種データの外部出力も可能なほか、プラットフォームとしての拡張性も高く、柔軟な運用が可能な点も特徴です。

こうした点から、後で詳しく触れるETLの構築・運用に適したツールとして知られています。


ETLとは?

ETLとは、Extract(抽出)、Transform(変換)、Load(ロード)の頭文字を取った言葉で、データウェアハウスやデータ分析を効率的に行うためのプロセスのことです。

このプロセスを使って、さまざまなデータソースから情報を取り出し、それを適切な形式に変換したうえで、最終的にデータウェアハウスやデータベースに格納します。

つまり、ETLはデータウェアハウスやデータベースにデータを格納する前の「下処理」の工程といえるでしょう。

プロセス1. Extract

Extractとは、ETLの最初のステップで、データソースから必要な情報を抽出することを指します。データソースは、RDBMSやCSVファイル、APIなど様々な形式があります。抽出対象のデータは、たとえば売上データや顧客情報、製品情報など、ビジネスで活用するために重要なものになることが一般的です。

Fluentdではインプット系のプラグインがこの役割を果たし、アプリケーション内のログファイルを受け取り、各行がどのようなデータをもつのかを把握します。

プロセス2. Transform

Transformとは、ETLの中間ステップで、抽出したデータを分析やデータウェアハウスに適した形式に変換するための工程です。このステップでは、以下のような処理が行われます。

1. データクレンジング:不要なデータや不正確なデータを除去し、品質を向上させる
2. データ統合:異なるデータソースからのデータを統合し、一貫性を保つ
3. データ変換:データの形式や単位を変更し、分析に適した状態にする

Fluentdでは、レコードの取捨選択を行うgrepプラグインや、IPアドレスをもとに地域情報を付与するgeoipプラグインなどを利用することにより、Transformを実施できます。

プロセス3. Load

Loadは、ETLの最終ステップで、変換されたデータをデータウェアハウスやデータベースに格納することを指します。このステップでは、以下の点に注意する必要があります。

1. パフォーマンス:データを高速かつ効率的にロードする
2. データの整合性:データウェアハウスやデータベースの構造に従って、正確にデータを格納する
3. エラーハンドリング:ロード時のエラーを検出し、適切な対処を行う

Fluentdでは、データウェアハウスの『BigQuery』や分散型全文検索エンジンの『Elasticsearch』などを出力先として指定することができます。


Fluentdの設定方法

Fluentdでは、おもにfluent.confというファイルに対し、<system>、@include、<source>、<label>、<filter>、<match>などのディレクティブを利用して、設定を行います。

たとえば、下記設定では/var/log/nginx/access.logからログデータを収集し、標準出力に出力しています。

【fluent.conf】

 <source>
  @type tail
  path /var/log/nginx/access.log
  pos_file /var/log/td-agent/nginx.access.log.pos
  tag nginx.access
  format nginx
</source>

<match nginx.access>
  @type stdout
</match>


Fluentdを使ってETLを構築する方法

ここからは、実際にFluentdを使ってETLを構築する方法を解説します。今回は、Webサーバである『Nginx』のログを、BigQueryに格納するまでのプロセスを例にご紹介しましょう。

ステップ1 Nginxをセットアップする

まず、Nginxのconfに以下のコードを書いてください。

 log_format  ltsv  "local_time:$time_local"
                  "\thost:$remote_addr"
                  "\tforwardedfor:$http_x_forwarded_for"
                  "\treq:$request"
                  "\tstatus:$status"
                  "\tsize:$body_bytes_sent"
             "\treferer:$http_referer"
                   "\tua:$http_user_agent"
                  "\treqtime:$request_time"
                  "\tcache:$upstream_http_x_cache"
                  "\truntime:$upstream_http_x_runtime"
                  "\tvhost:$host"
                  "\tmethod:$request_method"
                  "\turi:$request_uri";

access_log  /var/log/nginx/access.log  ltsv;


上記のコードにより、NginxのログがLTSV(Labeled TSV)形式で出力されるようになります。

ステップ2 Fluentdをセットアップする

つづいて、Fluentdをインストールします。まず以下のコマンドを実行してください。

 curl -L 
https://toolbelt.treasuredata.com/sh/install-ubuntu-xenial-td-agent3.sh | sh


次に、Fluentdの設定ファイルを作成します。/etc/fluentd/fluentd.confという名前で、以下の内容を記述してください。

【/etc/fluentd/fluentd.conf】

 <source>
  @type tail
  path /var/log/nginx/access.log
  format ltsv
  keep_time_key
  time_key time_local
  time_format %d/%b/%Y:%H:%M:%S %z
  tag bq.log.nginx_access_logs
  pos_file /var/log/td-agent/nginx_access.log.ltsv.pos
</source>

<match bq.log.nginx_access_logs>
  @type bigquery_insert

  auth_method json_key
  json_key { "private_key": [YOUR_PRIVATE_KEY], "client_email": [YOUR_CLIENT_EMAIL]}

  project [YOUR_PROJECT_ID]
  dataset [YOUR_DATASET_ID]
  table   [YOUR_TABLE_NAME]

  schema [
   { "name": "time",    "type": "timestamp" },
   { "name": "local_time",    "type": "string" },
   { "name": "host",  "type": "string"  },
   { "name": "forwardedfor",  "type": "string"  },
   { "name": "req",  "type": "string"  },
   { "name": "status",    "type": "integer"  },
   { "name": "size",  "type": "integer"  },
   { "name": "referer",  "type": "string"  },
   { "name": "ua",    "type": "string" },
   { "name": "reqtime",   "type": "float" },
   { "name": "cache",    "type": "string" },
   { "name": "runtime",   "type": "float" },
   { "name": "vhost", "type": "string" },
   { "name": "method",    "type": "string" },
   { "name": "uri",    "type": "string"  }
  ]

</match>


この設定では、/var/log/nginx/access.logからログを読み込み、BigQueryに格納しています。[YOUR_PRIVATE_KEY]、[YOUR_CLIENT_EMAIL]、[YOUR_PROJECT_ID]、[YOUR_DATASET_ID]、[YOUR_TABLE_NAME]は、適切な値に置き換えてください。

最後に、必要なプラグインをインストールします。以下のコマンドを実行して、BigQuery用のプラグインをインストールしてください。

 sudo td-agent-gem install fluent-plugin-bigquery


ステップ3 BigQueryのセットアップ

公式ドキュメントをもとに、BigQueryを効率的に活用するためのbqコマンドが使用できる状態になったら、下記のコマンドでデータセットを作成します。

 $bq mk log


次にスキーマ用のファイルを用意し、bq mkコマンドでテーブルを作成します。

【./format_schema.json】

 [
   { "name": "time",    "type": "timestamp" },
   { "name": "local_time",    "type": "string" },
   { "name": "host",  "type": "string"  },
   { "name": "forwardedfor",  "type": "string"  },
   { "name": "req",  "type": "string"  },
   { "name": "status",    "type": "integer"  },
   { "name": "size",  "type": "integer"  },
   { "name": "referer",  "type": "string"  },
   { "name": "ua",    "type": "string" },
   { "name": "reqtime",   "type": "float" },
   { "name": "cache",    "type": "string" },
   { "name": "runtime",   "type": "float" },
   { "name": "vhost", "type": "string" },
   { "name": "method",    "type": "string" },
   { "name": "uri",    "type": "string"  }
  ]

$ bq mk -t log.nginx_access_logs ./format_schema.json


ステップ4 Fluentdを起動する

ここまでのステップが完了したら、あとはFluentdを起動すればOKです。以下のコマンドを実行してください。

 sudo systemctl start td-agent


これで、NginxのログデータがBigQueryに格納される状態になりました。


Fluentdを活用して作業を効率化

今回は、FluentdやELTの概要と基本的な設定方法を解説しました。Fluentdを活用することで、ログデータの収集・統合を効率化できます。ぜひFluentdを試してみてください。

GIGには、データ分析の豊富な実績があります。データ分析/解析、そしてレポーティングのための設定から分析体制の構築まで、データドリブンでの施策立案・実行をサポートしてきました。

自社に蓄積するデータを分析し、活用していきたいと考えている方はGIGまでお問い合わせください。

■株式会社GIG
お問い合わせはこちら
採用応募はこちら(GIG採用サイト)
採用応募はこちら(Wantedly)

WebやDXの課題、お気軽にご相談ください。

福田 拓実

ソフトウェアエンジニア。神戸大学を卒業後、Web広告代理店にてディレクターを担当。その後は起業を経て、2019年6月にGIGへエンジニアとしてジョイン。現在はLeadGrid開発チームのマネージャーとしてプロダクト開発を担当。