先日公開されたブログ記事で、PinterestのエンジニアのHaibin Xie氏とMichael Mi氏は、同社チームが階層的なドキュメントを取得する効率的なアーキテクチャを実装した方法について説明している。氏らはこれを、インデックスの平坦化、正規化、非正規化という原則を組み合わせることで実現した。
ManasはPinterestが自社開発した検索エンジンである。他の検索エンジンと同様、フラットなドキュメントをサポートするように設計され、最適化されている。しかしながらPinterestには、階層構造のドキュメントを提供しなければならない、という要件がある。下の図はその構造を示したもので、Campaignエンティティが、Promoted Pinの集合で構成されるAdグループを複数含んでいる。
すべてのCampaignとAdグループのプロパティをPinレベルに平坦化することを避けるために、Pinterestのエンジニアたちは当初、クライアントとクラスタの間に複数回のラウンドトリップを必要とする、2ステージクエリ実行プランを採用していた。しかしこの方法では、"クライアントが複雑な集約や、複数ステージのためのクエリ構築を扱わなければならない"ため、クライアントコードが複雑なものになる。
開発されたフレームワークは、効率的なクエリを可能にするために、複数のステップを採用している。最初に、Manasが階層型ドキュメントのインデックスを平坦化し、スキップリストを含む逆インデックス(inverted index)を構築する。下の図は、2レベルの"Documents"("field1"と"field2")と"Groups"("field3"と"field4")に対するこのプロセスを表したものだ。
次にManasは、トップレベルのプロパティの重複を回避するために正規化を行う。下の図はこのプロセスを示したもので、リレーショナルデータベースの正規化に近い。
高レベルのgroupプロパティが重複する無駄を削減するためにインデックスを正規化する一方で、Manasは、下位レベルのドキュメントが複数のグループに属するシナリオをサポートするために、部分的な非正規化も行う。ドキュメントが属するグループの冗長コピーを保存することによって、インデックス作成時間に余分な出力のコストを払いつつ、サービス時間のパフォーマンスを向上させているのだ。
Xie、Mi両氏にManasと、その2ステージ検索実装について聞いた。
InfoQ: ElasticsearchやApache Solrのような既存のソリューションを使わずに、Manasを社内開発した一番の理由は何だったのでしょうか?
検索エンジンを社内開発することにした大きな理由は、効率性と柔軟性の2つです。
効率性はパフォーマンス、運用コスト、維持コストに大きな影響を与える、重要なメトリクスです。これまで当社の検索エンジンは、Lucene上にJavaで記述されたものでした。Pinterestは画像検索エンジンですが、その規模は毎日成長していて、数千万の人々が数十億のPinを保存することによって、レコメンデーションが日々強化されています。Pinterestが成長するに従って、システムの直面するレイテンシが問題となり、大規模なサポートが不可能になってきました。社内開発の検索エンジンをC++で記述したことで、レイテンシが大幅に低下すると同時に、効率性も改善されたのです。
さらに検索は、Pinterestのほとんどのプロダクトにおいて基盤となる機能なので、システムをスクラッチから開発することによって柔軟性も高まりました。また、社内MLプラットフォームとの統合のように、当社のユースケースに対する最適化とビジネスニーズへの適合とのトレードオフも可能になりました。結果は極めて良好で、リアルタイムサービスや埋め込みベース検索、2ステージ検索など、オープンソースプロジェクトでは利用できていないようなイノベーションをManasで実現することができました。
とは言うものの、実装の中ではいくつかのオープンソースプロジェクトも活用しています。フォワードインデックスにはRocksDBを使っていますし、インデックスパイプラインにはSolrを活用しています。
InfoQ: 他の検索エンジンと比較した場合、Manasのユニークな点は何ですか?
Pinterestのユースケースに特化して設計されている点ですね。この設計はつまり、当社にはElasticsearchの提供する全機能は必要ない、という意味でもあります。一方で、Pinterest独特の課題に対処するためならば、より高度なソリューションを採用することもできるのです。
InfoQ: 現在の検索エンジンで、2ステージクエリを実装したものは他にもあるのでしょうか?
今のところ、他の例は知りません。ただし2ステージ検索は、Pinterestのスケーラビリティと効率性という課題に対処するための、ソリューションのひとつに過ぎません。Pinterestにとってスケールアップは、早急に対処する必要のあるビジネス上の問題だったのです。
InfoQ: 実装上、最も大変だったのは何でしたか?
実装に関して最も難しかった部分は、当社のユースケースを汎化できるような適切な抽象化を使って、問題をモデル化することでした。インフラの考え方で、より多くのシナリオをサポートできるように、十分な汎用性をフレームワークに持たせようとしているのです。
InfoQ: Manasをオープンソースにする予定はありますか?
今のところ計画はありませんが、可能な部分はオープンソースにしてコミュニティに貢献したいと思っています。コミュニティは当社にとって常に重要な存在なのです。
検索エンジンを実装したオープンソースコンポーネントは他にもさまざまなものがある。特に有名なのはElasticsearch(最近になってライセンスが更新された)とApache Solrで、いずれもApache Luceneプロジェクトをベースとしている。