京都研究所・TechLabの田中です。
マイクロアドでは、主にエンジニア以外のメンバーが広告配信実績などの各種データにアクセスする際にRedashを利用しています。
Redashから接続しているデータソースには、以前このブログでも紹介した分析用Hadoopクラスタ*1に加えて、MySQLのレプリやBigQueryなどがあります。
これらの異なるデータソースに対してRedashからは同じインターフェースでアクセスでき、手軽にデータの抽出や可視化・分析などが可能です。
また、クエリで抽出したデータを利用して、Redash上にダッシュボードを作成することもできます。
本稿では、そんなRedashの活用方法の1つとして、
スケジューリング機能とキャッシュ機能を利用した簡易的なデータパイプラインを使ってダッシュボードを作成する例をご紹介します。
なお、この記事で扱うRedashの説明はバージョンv10.1.0に基づいています。
Redashで作成する簡易パイプラインの構成を説明します(下図)。
1. 中間集計
まずはデータソースからダッシュボード作成に必要なデータを収集します。
ここで抽出するデータはそのままダッシュボードに表示されるのではなく、後続の処理のインプットとして使われます。
Redashにはクエリを定期実行するスケジューリング機能があるので、この機能を使って日次で中間集計用のクエリを実行するようにしています(下図)。
Redashでは、クエリの実行結果であるデータは Query Results Data Source (QRDS) にキャッシュされるため、後続の処理ではこのQRDSを通して中間集計の結果にアクセスします。*2
このような中間集計を挟まずに、データソースから直接ダッシュボード用のデータを抽出しようとすると、複数のクエリに同じような集計ロジックを記述することになる場合があります。
その場合、集計ロジックの更新や修正の必要が出てきた時は、全てのクエリを漏れなく変更する必要があります。
クエリの数が多いほど修正漏れが発生しやすくなり、データの不整合が発生する可能性が高くなります。
また、中間集計したデータよりもデータソースのテーブルのほうがデータ量が多いため、1つひとつのクエリの応答時間が長くなります。
その上、多くのクエリを実行すればそれだけ参照先のDBにかかる負荷も高くなります。
このような集計ロジックの散在に起因するデメリットを回避するために、できるだけ共通の中間集計データを作りQRDSにキャッシュする構成を取りました(下図)。
後続の複数のクエリで参照されることを考慮して、この中間集計を行うクエリでは
「全ての後続処理で必要な粒度 × 日付」
といった単位で集計やフィルターをしておきます。*3
2. ダッシュボード表示用データの抽出
次に、1で作成した中間集計データをインプットとして、ダッシュボードに表示したいグラフや表に適した形式のデータをそれぞれのクエリで整形します(下図)。
今回は、ダッシュボード上で中間集計データの抽出期間を指定して、その期間のデータを可視化したグラフや表がダッシュボードで表示されるようにしています(上図の「抽出条件」)。
この機能を実現するために、クエリパラメータを利用します。
Redashではクエリ内にパラメータのプレースホルダーを記述でき、そのパラメータの値を指定してクエリを実行できる機能があります*4。
これを利用して、クエリ内のwhere句で日付を指定する部分をパラメータにしておき、パラメータの入力箇所がダッシュボード上に表示されるように設定します。(下図)
ダッシュボードには複数のグラフが表示されており、それぞれのグラフは異なるクエリで抽出したデータをつかって描画されています。
上図の例では、グラフ1はクエリA、グラフ2はクエリBで抽出したデータからそれぞれ描画されるイメージです。
これら複数あるすべてのクエリに対して、日付を指定する部分だけはすべて同じ形式でクエリパラメータを記述しておきます。
こうすると、ダッシュボードで日付の期間を一度入力するだけで、その日付が全てのクエリに適用されて実行されます。
結果として、すべてのグラフが指定した期間のデータを反映したものになります。
中間集計のデータサイズはデータソースにある生ログと比べて非常に小さくなっているため、日付指定を入力してからビューが更新されるまでのタイムラグも短時間で済みます。
3. 利用方法
以上の手順によって作られたダッシュボードは、利用者がダッシュボードを閲覧するたびに日付の期間を入力することを想定しています。
インタラクティブに操作しながらいろいろな期間のデータを確認するためのダッシュボードを作る際は、今回ご紹介した構成が便利だと思われます。
4. 参考
RedashのQRDSに使うクエリエンジンはSQLiteです。
SQLiteはデフォルトの状態だと累乗、平方根、対数といった数学関数が存在しません。
このような関数でQRDSの値を加工するには、SQLiteに拡張機能を追加する必要がありました。
最後に
今回はRedashのスケジュール機能とキャッシュ機能を利用してダッシュボードを作成する方法をご紹介しました。
参考になれば幸いです。
*3:QRDSにキャッシュできるデータ量にも限度があります。Redashをホストするサーバーのメモリやディスクサイズにもよりますが、あまりに大きなデータだとキャッシュには向かないようです。 My hard disk space was suddenly full ( How redash is working )! - #3 by mali - Self Hosted Redash Support - Redash Discourse