OSS化実現が待ち遠しい!Pinterest社のETL-as-a-Service『Skyline』について

2015.10.04

ビッグデータ周りでデータを活用する上で『ETL(またはELT)』は欠かせないプロセスの1つですが、皆様はどのような仕組みや環境、サービスを使って実現していますでしょうか?Pinterest社では、現在社内で『Skyline』というETL-as-a-Serviceを構築し、活用しているそうです。Pinterest社のブログでこのサービスに関する紹介及び今後の展望について紹介されていましたので、その内容を読み解いてみたいと思います。

サービス誕生の背景

Piterest社において、データは利用者に対して新しい体験をしてもらったり、新たな気付きを得てもらうために重要な役目を果たしています。一方で、データを実用的な洞察力に変換する際の摩擦を軽減する方法を常に考えています。社内ではデータやアクセスする人数、クエリの数が増えるに従い、スケーリングと新たな要件に対応して行く事は大きな課題となりました。

そこでこの問題に取り組むために、Pinterest社では『Skyline』と呼ばれる新しいデータプラットフォームを構築したそうです。

Skyline誕生の前は、データを扱うユーザーは以下の様な作業をデータエンジニアに依存していました。

  • クエリ実行対象の適切なテーブルを見つける
  • ETLとしてのクエリ作成
  • 特定のETLジョブに対する履歴データ(例えば過去1年分)を埋め戻す(Backfill)。※データユーザーはしばしば年間全体のメトリクスを追跡したくなるので。

Skyluneは上記の要求を解決し、以下3つの主なユースケースを可能とします。

  • 1.セルフサービスUI:データを扱うためのワークフローやジョブを作成
  • 2.Pinterestのデータウェアハウス内データの可視化探索
  • 3.データの依存関係が理解出来るようになる

セルフサービスETL

Skylineでは、ジョブの作成とスケジューリングを簡単にするセルフサービスETLマネージャを構築しました。このデータを使って、データを扱うユーザーは、以下のようなタスクを全て自分で行うために、SQLクエリを使ってデータジョブを作成し、スケジューリングする事が出来ます。

  • HiveからRedshiftにデータを移動
  • Pinalytics(Pinterestデータ解析エンジン)のレポートを作成
  • オンデマンドの履歴データ埋め戻し

シンプルな設計と使いやすさから、ETLマネージャはデータアナリストやプロダクトマネージャーに採用されています。そして、Pinalyticsのレポートの40%以上がSkylineを使って作成されています。

データの探索

上記のセルフサービスETL機能を提供すると共に、"Skyline Data Warehouse"と呼ばれる機能も構築されました。この機能は主要なDWH内のデータセットのカタログビューを提供し、毎日の自動更新を可能とします。Skyline Data Warehouseはデータテーブルに関する以下の情報を提供します。

  • どのワークフロー/ジョブがデータを生成したか
  • テーブル所有者
  • テーブルが最新の状態にあるかどうか
  • 列名や型
  • その他詳細(サイズや行数、テーブルパーティションやサンプル行)
  • コメント等

データの依存関係を可視化

Pinterest社の環境では数千ものデータジョブが実行されており、それぞれが依存関係を持っています。以前は、本番環境のジョブが壊れた場合、影響を受けるテーブルを調べる事はユーザーにとって困難でした。これらの作業を簡単にするために、全てのデータジョブを監視出来る自動依存関係検知システムを構築しました。以下のような機能を有しています。

  • どのようにしてテーブルが他のテーブル(※MySQL, Hive, HBase, RedisやRedshift等の)から派生しているかを理解出来る。
  • どのようにしてPinalyticsのレポートが把握出来る。
  • テーブルの所有者/ジョブ/ワークフローの情報を即座に確認出来る。

skyline-arch

アーキテクチャ

skyline-etl-architecture

Skylineは以下のコンポーネントで構成されています。

Skyline UI:
Flaskというフレームワーク上にWebApplicationを作成。React.js をシンプルなインタラクティブ可視化情報のようなユーザーインタフェースコンポーネントを作成するためにフロントエンドとして用い、SQLAlchemyをバックエンドのデータベースと連携するために利用しています。
Thriftサービス&データベース:
ジョブの入出力情報はSkyline Data Warehouseやデータ連携、ETLマネージャーの機能において必要なものとなります。 全てのデータはMySQLデータベースに格納されます。そしてクライアントがこのデータの読み書き・対話を行うために、Thriftサーバを構築します。データ量が大きくなく、データの依存関係を取得するのに結合(JOIN)操作を行う必要があるため、HBaseのような選択肢の代わりに、MySQLを永続的なストレージとして使います。
ETLドライバー
ETLドライバーは、Skyline ETL Managerを介して作成したETLワークフローやジョブを解析するために作成したPythonライブラリです。解析した後、ETLドライバーはトークンとしてジョブを変換します。このトークンはPinball(ワークフロー管理システム)によって認識されます。
ETLクエリ/ジョブパーサー:
ジョブの入出力を自動的に計測するために、パーサー(解析器)のペアを構築しました。
1.クエリパーサー: 自動的に全てのクエリの入力/出力テーブルを解析。
2.Hadoop設定パーサー: Hadoopジョブに指定された入出力S3ファイルパスを自動的に解析。
ユーザーが新規ETLジョブをSkyline上で作成する際は常にこの入出力情報が自動的に抽出され、 格納され、Skyline UIを通じて容易に探索が可能となります。

ロードマップ

ちなみにこのプロダクト、まだオープンソースとして公開されているものではありません。しかし、以下の様に近いうちにOSSとして我々も利用出来る状況になる事が予想されます。

We hope to open-source Skyline soon.

中長期的には以下の様な機能も検討しているようです。

  • アドホッククエリをHiveやRedshift、Prestoのような様々なバックエンドで実行する機能
  • ユーザークエリ、コメント、列情報、サンプルデータなど、『データ』に関連するあらゆる情報を検索する機能
  • 優先順位によるETLワークフロー/ジョブスケジューリングのサポート

まとめ

今はまだPinterest社内部でのプロダクトな状態ですが、この内容からするとビッグデータ周りでETLを管理したい人々にとってとても便利なツールとなりそうです。オープンソース化がとても待ち遠しいですね!こちらからは以上です。

参考情報: