Fluentdを使ってETLを構築し、データ分析を効率化しよう|東京のWEB制作会社・ホームページ制作会社|株式会社GIG
BLOG
ブログ
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開発チームのマネージャーとしてプロダクト開発を担当。