Uber Engineeringは最近、Uber Riderアプリからデータを収集、標準化、使用する方法を公開した。ライダーデータには、Uberアプリとのライダーのインタラクションがすべて含まれる。このデータは、Uberのオンラインシステムからの毎日の何十億ものイベントを表している。Uberはこのデータを使って、ファンネルコンバージョンの増加、ユーザエンゲージメントなどの主要な問題領域に対処する。
UberのソフトウェアエンジニアDivya Babu Ravichandran氏とVarun Verma氏は、Uber Riderアプリデータを収集して使用する動機について次のように説明している。
データは当社の製品にとって非常に重要です。データ分析は、当社のサービスを使用する人々に摩擦のない体験を提供するのに役立ちます。また、エンジニア、製品マネージャー、データアナリスト、データサイエンティストが情報に基づいた意思決定を行うこともできます。データ分析の影響は、アプリのすべての画面で確認できます。ホーム画面に表示される内容、商品が表示される順序、ユーザに表示される関連メッセージ、ユーザの利用やサインアップを妨げるものなどです。
Uberは2つのソースから必要なデータをキャプチャする。そのソースは、アプリケーション(クライアント)自体とアプリケーションが使用するバックエンドサービスである。クライアントログは、プラットフォームによって自動的に生成されるか(例えば、UI要素、インプレッションなどとユーザとのインタラクションなどのイベント)、あるいは開発者によって手動で追加される。バックエンドログには、モバイルでは利用できないか、携帯電話では処理できないような、より多くのメタデータを含む。ログに記録された各レコードにはキーがあり、それによりモバイルインタラクションと紐づけて、統合されたビューを生成できる。
Ravichandran氏とVerma氏は「何百人ものエンジニアがイベントの追加や編集に関与しているため、ロギングの標準プロセスを持つことが重要です。」と述べている。すべてのイベントがプラットフォーム間で一貫しており、メタデータが標準化されていることを確実にするために、UberはApache Thrift構造体を定義している。これは、ペイロードを定義するためにイベントモデルによって実装される必要がある。以下の画像は、分析イベントの標準スキーマ定義の例を示している。
出典: https://eng.uber.com/how-data-shapes-the-uber-rider-app/
イベントプロセッサはイベントを受信し、それらをどのように処理してさらに伝播する必要があるかを決定する。信号・ノイズ比を改善するために、イベントプロセッサは、そのイベントのメタデータとマッピングが利用可能でない限り、イベントをダウンストリームに伝播しない。次の図は、エンドツーエンドのフローを示している。
出典: https://eng.uber.com/how-data-shapes-the-uber-rider-app/
収集されたデータは構造化され、Apache Hiveのオフラインデータセットとしてコピーされる。Ravichandran氏とVerma氏は次のように説明している。
オフラインデータセットは、問題のある領域(...)を特定し、その問題に対処するために開発されたソリューションの成功を測定する助けとなります。巨大な未加工のオフラインデータセットは管理が困難です。未加工データは補強され、階層化されたテーブルにモデル化されます。補強の過程で、さまざまなデータセットが結合され、データがより意味のあるものになります。
Ravichandran氏とVerma氏は、データはビジネス上の意思決定を促進するシグナルを提供するため、データの整合性と品質を維持することが不可欠であることを強調している。テストでは、分析イベントが発生した場合、期待されるペイロードと正しい順序を使用することを確認している。異常検出では、データがログに記録され、期待どおりに流れていることが検証される。オフラインでモデル化されたテーブルでは、テストフレームワークにより、さまざまなテーブル間でデータの正確性、カバレッジ、一貫性が保証される。パイプラインを実行するたびに、構成されたテストがトリガーされ、生成されたデータが高品質のSLA(サービスレベルアグリーメント)で保証されることが確認される。