読者です 読者をやめる 読者になる 読者になる

夢とガラクタの集積場

落ちこぼれ三流エンジニアである管理人の夢想=『夢』と、潰えた夢=『ガラクタ』の集積場です。

Amazonの中の人によるAWS re:Invent 出張報告会での注目スライドサマリ(Gremlin)

こんにちは。

既に旬(?)自体は明らかに過ぎているre:Inventネタですが、個人的な勉強にもなるので続けます。
3つ目はBDT303、AWS上でグラフベースの製品リコメンドシステムを構築した事例の話になります。

3.BDT303 Using AWS to Build a Graph-Based Product Recommendation System(スライド)(動画

実際どのサイトでの話かというと、「Magazine Luiza」というブラジルでの耐久消費財を扱うチェーン店での話です。
ブラジルにおいては家庭用品を扱う最も大きな小売店チェーンのうちの一つとのことでした。
規模は下記の画像参照・・・ですが、2280万人のユーザを抱えて捌いているというのはかなり大規模になりますね。

で、まずそもそもレコメンデーションで重要になる要素は何かという話から。
レコメンデーションシステムにおいては、「ショップ側が提供したい情報」と「ユーザが興味がある情報」のバランスを取ることが重要になります。

そのため、ユーザと商品をつなぐグラフを生成し、ユーザに近い内容の商品の情報を提供することが重要となります。

尚、「Magazine Luiza」においてはグラフを生成するスタックとして、以下の2つを使用しているとのことです。

  • 分散グラフDB「TITAN」

オンライントランザクションクエリが発行可能、Tinkerpop(GraphDB を利用する為の汎用フレームワーク)とネイティブ連携

  • 分散DB「Cassandra」

単一障害点(SPOF)無し、規模を柔軟に変更可能、キャッシュレイヤにも使用、レプリケーション機能を自前で保持

ユーザの購入情報は以下の図のイメージのように推移します。
購入した情報がTITANに記録され、マスタ情報としてのCassandraに反映される形のようです。

生成されるグラフの情報は「ユーザ」が買いものという「Session」を生成し、アクセスした商品である「item」とカテゴリである「Channel」を記録します。
その上で見た/カートに入れた/購入したという形で「Session」「Channel」と「item」の関連性にポイントを加算していく形になります。

レコメンデーションとしては同一Sessionにおいて「商品Aを見た後に商品Bを見た」「商品Aを買っている人は商品Bも買っている」「商品Aを見た後に商品Bを買った」といった
情報を基に他のユーザに対して提供する形になる。

グラフDBに対してクエリを発行するのに使用しているのがGremlinというGroovy DSL
これはTITANに限らず、Tinkerpopに準拠するGraphDBに対して汎用的に使用できるDSLとなっています。

Gremlinによって、商品Aを見た人一覧「g.v(4).in('viewed')」や商品Aを見た後に見ている商品「g.v(4).in('viewed').out('viewed')」といったクエリが発行可能になります。
#これについては実際にスライドを見てみるとクエリの流れがわかりやすく解説されていたのでお勧めです。

これらのクエリ処理はAmazon SQSにクエリを登録し、
スポットインスタンスAWSの浮動リソースを入札形式で安くEC2として使用できるインスタンス)で処理を行っているようです。

また、個人向けのメール発行も同じ方式で行っているとのこと。
短期的な処理は全てSQSに登録しておいて、スポットインスタンスで捌く形でAWSの利用料を節約する方式を取っているようですね。
実際、リアルタイムに処理せずに間を空けて処理すればいいものについてはこれで十分だとは思います。

尚、グラフデータの解析(統計取得)についてはFAUNUSというグラフ解析エンジンをHadoop上で動作させて行っているようです。
FAUNUSがGremlinを叩いて結果を取得し、それで解析を行っている・・・という流れのようですね。

その上で、バックアップはCassandraのnodetoolを使い、結果をAmazon S3に保存するという流れのようです。

最終的なアーキテクチャの全体像は以下の通り。

このアーキテクチャで以下の規模のサービスを提供しているようです。

また、AWSに移行したことによってスピードは10倍、コストは60%低減に成功したとのこと。

今後やってみたいこととしては、
「Faunusを全レコメンデーションに対して事前に実行」「グラフ上のコミュニティを扱うアルゴリズムの導入」「リージョンを跨いだCassandraのレプリケーション
とのことでした。

=====
失礼な話かもしれませんが、前2つのスライドと比べると至極当然・・・というか真っ当な資料だったと思います。
ただ、AWS上でグラフDBを利用したレコメンデーションを実際どういう風にやっているよ、ということが非常によくわかる資料ではありました。
後は短期的、かつリアルタイムに処理する必要性がないタスクについてはSQSに登録しておいてスポットインスタンスで処理してしまう、
というアプローチは面白かったですね。