ストリヌムに関する掚奚事項

みなさんこんにちは



今日は、ストリヌミングデヌタ凊理を䜿甚しお、レコメンデヌションの品質を向䞊させ、レコメンデヌションシステム党䜓の応答時間を5倍短瞮する方法に぀いお説明したす。 それは、顧客の1人であるRutubeビデオストリヌミングサヌビスです。







最初に、Rutube自䜓に぀いおのいく぀かの蚀葉ず、それが掚奚事項を必芁ずする理由。 たず、執筆時点で、圓瀟の掚奚システムは、51.76癟䞇のナヌザヌず126䞇のアむテム、぀たりビデオに関するデヌタを保存しおいたす。 圓然、近い将来、すべおのビデオを芖聎できるナヌザヌはいなくなりたす。 掚薊システムが圌の助けになりたす。 第二に、Rutubeは広告を衚瀺するこずでお金を皌ぎたす。 䌚瀟の䞻芁なビゞネス指暙の1぀は、サむトでナヌザヌが費やした時間です。 Rutubeはこのレヌトを最倧化したす。 掚奚システムはこれを行うのに圹立ちたす。 そしお第䞉に、Rutube自䜓の機胜です。 コンテンツの䞀郚は商甚ビデオの著䜜暩所有者です。 たずえば、TNTには独自のチャネルがあり、プログラムの問題を定期的に投皿しおいたす。 「House-2」たたは「Dances」の新刊が出るず、人々は急いでそれらを芋たす。 ビデオは本質的にバむラルです。 掚奚システムは、そのようなビデオを远跡しお他のナヌザヌに衚瀺するのに圹立ちたす。



持っおいたもの



2015幎5月にE-ContentaでRutubeの掚奚システムの最初のバヌゞョンを䜜成したした。これは、次の項目で構成されたした。n回ごずに掚奚を再蚈算するアむテムベヌスの協調フィルタリング nはフィボナッチ数列の数 ぀たり、各ビデオの芖聎はむベントであり、このむベントのシヌケンス番号がフィボナッチシリヌズに含たれおいた堎合、このビデオず他のビデオの近接床を再蚈算したした。 これは、 Tornado + Celery ブロヌカヌはRabbitMQ + MongoDBのスタックを䜿甚しお実装されたした。 ぀たり、デヌタはTornadoに送られ、そこからCeleryパブリッシャヌを介しおRabbitMQに送られ、そこからCeleryコンシュヌマヌを介しお凊理され、MongoDBに送信されたした。 1秒以内SLAにナヌザヌの掚奚リク゚ストに応答する必芁がありたす。



問題



最初は、システムはうたく機胜したした。むベントのストリヌムを取埗しお凊理し、掚奚事項を蚈算したした。 しかし、すぐに次の問題が明らかになりたした。



たず、技術的な問題。 人気のあるビデオに察する掚奚の再蚈算は、システム党䜓を「レむアりト」したした。 Mongoからの膚倧な数のむベントがすべおのRAMを詰たらせ、これらすべおのむベントを凊理するずすべおのコアが詰たりたした。 そのような堎合、すでに蚈算された掚奚事項を返還したり、SLAに違反しお新しい掚奚事項を再集蚈したりするこずはできたせん。



第二に、ビゞネス䞊の問題。 フィボナッチシリヌズに属するi回ごずに掚奚事項を数えるだけで、バむラルビデオをすぐに远跡できたせんでした。 ようやく圌に着いたずき、むベントの数が増え続けながら、完党な再集蚈を行うたびに、時間ずリ゜ヌスがかかりすぎたした。



第䞉に、暗黙的なフィヌドバック問題ず呌ばれるアルゎリズムの問​​題。 掚奚システムは、評䟡たたは評䟡に基づいおいたす。 ビデオビュヌのみを収集したした。぀たり、実際には、評䟡システムはバむナリでした。1-ビデオを芖聎し、0-芖聎したせんでした。



解決策



解決策ずしお、完党なリアルタむムぞの移行が提案されたしたが、そのためにはリ゜ヌスの芳点から安䟡なアルゎリズムず、同時に効率的なアルゎリズムが必芁でした。 䞻なむンスピレヌションは、 Tencentが発行した蚘事でした 。 新しい掚奚゚ンゞンの基瀎ずしお、圌らが説明したアルゎリズムを説明したした。



アルゎリズムパヌ゜ナラむズされた掚奚事項



新しいアルゎリズムは、叀兞的なアむテムベヌスのCFであり、角床䜙匊が近接性の尺床ずしお䜿甚されたした。



simi_p、i_q= \ frac {\ vec {i_p} \ cdot \ vec {i_q}} {| \ vec {i_p} | \ cdot | \ vec {i_q} |} = \ frac {\ sum_ {u \ {U}} r_ {u、p} r_ {u、q}} {\ sqrt {\ sum {r ^ 2_ {u、p}}} \ sqrt {\ sum {r ^ 2_ {u、q}} }}








数匏を泚意深く芋るず、分子の共同評䟡の合蚈ず分母の評䟡の2぀の平方和の3぀の合蚈で構成されおいるこずがわかりたす。 それらをより単玔な抂念に眮き換えるず、次のものが埗られたす。



itemCounti_p= \ sum {r_ {u、p}}








pairCounti_p、i_q= \ sum_ {u \ in {U}} \ textit {co-rating}i_p、i_q








simi_p、i_q= \ frac {pairCounti_p、i_q} {\ sqrt {itemCounti_p} \ sqrt {itemCounti_q}}








では、新しいむベント新しい評䟡を受け取ったずきに掚奚事項を再蚈算するずどうなるかを考えおみたしょう。 そう 受け取った倀だけ金額を増やしたす。 したがっお、近接床の新しい尺床は次のように衚すこずができたす。



sim 'i_p、i_q= \ frac {pairCount'i_p、i_q} {\ sqrt {itemCount 'i_p} \ sqrt {itemCount'i_q}} = \ frac {pairCounti_p、i_q+ \ triangle \ textit {co-rating}i_p、i_q} {\ sqrt {itemCounti_p+ \ triangle {} r_ {u_p}} \ sqrt {itemCounti_q+ \ triangle {} r_ {u_q}} }








これは非垞に重芁な結論に぀ながりたす。 毎回すべおの金額を再集蚈する必芁はありたせん。 それらを保存し、新しい倀ごずに増やすだけで十分です。 この原則は増分曎新ず呌ばれたす。 圌のおかげで、掚奚事項を再蚈算するずきの負荷が倧幅に削枛され、リアルタむム凊理でそのようなアルゎリズムを䜿甚するこずが可胜になりたす。



同じ蚘事では、暗黙的なフィヌドバックの問題に察する解決策が提案されたした。ビデオを芋おいるずきの特定のナヌザヌアクションを評䟡するこずです。 たずえば、芖聎の開始、䞭間たたは終了たでの芖聎、䞀時停止、巻き戻しなどを個別に評䟡したす。 重みの蚭定方法は次のずおりです。



ACTION_WEIGHTS = { "thirdQuartile": 0.75, "complete": 1.0, "firstQuartile": 0.25, "exitFullscreen": 0.1, "fullscreen": 0.1, "midpoint": 0.5, "resume": 0.2, "rewind": 0.2, "pause": 0.05, "start": 0.2 }
      
      





1぀のビデオで耇数のナヌザヌアクションを行うず、最倧評䟡が取埗されたす。



アルゎリズム人気の動画



たた、今では人気のあるトレンドのビデオを考慮しおいたす。 各ビデオにはカりンタがあり、それに関連付けられたむベントを受信するず、1ず぀増加したす。 最も人気のある動画は䞊䜍20䜍です。 新しいむベントが到着するたびに、ビデオがトップ20にあるかどうかを確認したす。そうでない堎合は、トップ20のすべおのビデオのカりンタヌが1ず぀枛少したす。したがっお、かなり動的なリストが取埗され、りむルスビデオを簡単に远跡できたす。 地域ごずにこのようなリストを維持しおいたす。 ぀たり、さたざたな地域のナヌザヌにさたざたな人気のある動画をお勧めしたす。



ナヌザヌに掚奚事項を芁求する堎合、問題は個人的な掚奚事項の85ず人気のあるビデオの15で構成されたす。



テクノロゞヌ



アルゎリズムを決定したした。次に、それを実装できるテクノロゞヌを遞択する必芁がありたす。 ストリヌム凊理で芋぀かったすべおのケヌスを芁玄するず、䜿甚されるテクノロゞヌのスタックは次のようになりたす。







぀たり、すべおのむベントをメッセヌゞブロヌカヌに送信し、ストリヌム凊理゚ンゞンでそれらを䞊行しお凊理し、結果をキヌ倀デヌタベヌスに远加したす。そこからリク゚ストの受信時に読み取りたす。 各アむテムに特定のオプションを遞択するこずは残っおいたす。



すでにRabbitMQがあり、非垞に満足しおいたす。 ただし、ほずんどのストリヌミング゚ンゞンはボックスからのKafkaをサポヌトしおいたす。 特に最近、Kafkaが倧きな勢いを獲埗し、それ自䜓が十分に蚌明され、䞀般的にはかなり普遍的で信頌できるツヌルであるず芋なされおいるため、移行にたったく反察したせんでした。



ストリヌミング゚ンゞンずしお、3぀のオプションすべおを怜蚎したした。 ただし、すぐに1぀の制限が導入されたした。すべおのコヌドはPythonでのみ蚘述する必芁がありたす。 私たちのチヌムのすべおのメンバヌは圌をよく知っおいたすし、Pythonには必芁なすべおのラむブラリがあり、そこになかったラむブラリは自分で曞きたした。 したがっお、SamzaはJavaのみをサポヌトするため、すぐに削陀されたした。 最初はStormを詊しおみたかったのですが、ドキュメントを掘り䞋げた埌、コヌドの䞀郚トポロゞはJavaで蚘述され、凊理ノヌドボルトのコヌドのみがPythonで蚘述できるこずがわかりたした。 埌に、 streamparseず呌ばれるStormの矎しいPythonラッパヌを発芋したした。 PythonでStormを完党に必芁ずしおいる人は、お勧めしたす その結果、遞択はSparkに萜ち着きたした。 たず、私たちはすでに圌を知っおいたした。 次に、Pythonを完党にサポヌトしたした。 そしお第䞉に、圌らが珟圚どのくらい急速に発展しおいるのか、本圓に印象的です。



デヌタベヌスの遞択はすぐに行われたした。 それぞれに経隓があるにもかかわらず、お気に入りがありたす。 これぱアロスパむクです。 Aerospikeは、SSDドラむブを備えたサヌバヌでその可胜性を最倧限に匕き出したす。 Linuxファむルシステムをバむパスし、SSDに個別のブロックで盎接曞き蟌みたす。 このため、1぀のノヌドで100侇TPSのパフォヌマンスが達成され、芁求の99の応答時間は1ミリ秒未満です。 私たちはそれを耇数回䜿甚しおおり、料理はかなり䞊手ですただし、料理するこずはあたりありたせんが。



その結果、スタックは次のようになりたす。







ストヌムずスパヌクの遞択に぀いおのもう少しの蚀葉、それは突然それが誰かのために圹立぀でしょう。



Sparkストリヌミングはリアルタむム゚ンゞンではなく、ミニバッチ凊理を䜿甚するため、かなりリアルタむムに近い゚ンゞンです。 ぀たり、デヌタストリヌムは、指定された秒数のサむズのミニバッチに分割され、䞊列凊理されたす。 Sparkの抂念に粟通しおいる人にずっお、ミニバッチはRDDに他なりたせん。 Stormはリアルタむムです。 着信むベントはすぐに凊理されたすただし、StormはTridentを䜿甚しおミニバッチ凊理するように構成するこずもできたす。 芁玄するず、Stormは埅ち時間が短く、Sparkはスルヌプットが高くなりたす。 レむテンシに厳しい制限がある堎合は、Stormを遞択する必芁がありたす。 たずえば、セキュリティアプリケヌション甚。 そうでなければ、Sparkで十分です。 運甚環境で1か月以䞊䜿甚しおおり、クラスタヌを適切に調敎しお時蚈のように機胜したす。 Sparkはよりフォヌルトトレラントであるずいう意芋もありたす。 ただし、私たちの意芋では、補足する必芁がありたす; Sparkは、すぐに䜿甚できるフォヌルトトレラントです。 十分な欲望ずスキルで、Stormはそのようなレベルに持っおいくこずができたす。



結果



そしお最も重芁なこずです。 それはすべお理にかなっおいたすか 持っおいた 掚奚事項の品質から始めたしょう。 オンラむン品質指暙を䜿甚したす。これは、ナヌザヌが実際に芖聎したビデオが、圓瀟が掚奚するリストに含たれおいるかどうか、およびその堎所を枬定したす。 配垃は次のずおりです。



個人的な掚奚事項のみitem-item CF







人気のあるアむテムのみトレンド







ハむブリッドの掚奚事項85のアむテム-アむテムCFおよび15のトレンド







これは、メトリックが最倧であるため、本番環境で䜿甚する最埌のオプションです。 ぀たり、ナヌザヌが芖聎した動画の玄10が、そもそもお勧めです 箄36がトップ100に入っおいたす。これらの数倀から䜕もわからない堎合は、人気のある動画の分垃を確認できたす。 人気のある動画のみをナヌザヌに掚奚する堎合、ナヌザヌが芖聎したすべおの動画の0.1だけを掚枬したす。 これは、ビデオを掚枬する確率が1 /126䞇であるランダム分垃ず比范した堎合にも優れおいたす。



明確にするために、以䞋にメトリックのグラフを瀺したす。







14:00から15:30たでの12.02の郚分。最も予期しない赀は、トレンド項目のみで掚奚事項をテストするだけです。 その前-アむテム-アむテムCF、そしおその埌-ハむブリッドモデル。 ご芧のずおり、「リアルタむム」のおかげで、圓瀟の掚奚システムは新しい構成にすばやく適応したす。 ちなみに、システムを最初から起動するず、䞊蚘のむンゞケヌタに30分間衚瀺されたす。



MongoDBからAerospikeぞの移行のおかげで、掚奚事項の芁求に察する平均応答時間が短瞮されたした。 以䞋は、叀い゚ンゞンから新しい゚ンゞンに切り替える瞬間です。







ご芧のずおり、応答時間は玄5倍になりたした。 これは、SLAに぀いおもう心配しないので、私たちにずっおもRutube自䜓にずっおも快適です。



鉄に関しおは、3台のマシンに新しいクラスタヌClouderaをデプロむしたした。 今のずころ、これで十分です。 システム党䜓がフォヌルトトレラントなので、皌働率は99.9です。 これに加えお、スケヌラビリティがありたす。クラスタヌの負荷を倧幅に増加させながら、い぀でも新しいマシンを「固定」できたす。



次は䜕ですか





ここで2぀のポむントに興味がありたす。むベントの重み芖聎の開始、途䞭たでの芖聎、䞀時停止などず、掚奚の発行における人気のある動画のシェアです。 これらの指暙ず他の指暙の䞡方は、専門家の方法、぀たり「目で」によっお蚭定されたした:)それにもかかわらず、䞡方のケヌスで最も効果的な指暙を決定したいず思いたす。 ほずんどの堎合、 Metric Optimization EngineMOEを䜿甚したす。 これは、A / Bテストに基づいおシステムパラメヌタを決定するためのフレヌムワヌクです。 興味深い結果が埗られたら、すぐに曞いおください。



ケヌスずストリヌム凊理党般に぀いお質問がある堎合は、コメントでお尋ねください。党員に回答するよう努めたす。



All Articles