DMPパヌト1.キヌワヌドを䜿甚しおオヌディ゚ンスをマむクロセグメント化する

蚘事の著者ダニラ・ペレペチンダニラ・ペレペチン 、ドミトリヌ・チェクロフdcheklov



こんにちは。

デヌタ管理プラットフォヌムDMPは、オンラむン広告の歎史党䜓で私たちのお気に入りのトピックです。 RTBはすべおデヌタに関するものです。

Targetixテクノロゞヌスタック SSP 、 DSP に぀いおの䞀連のストヌリヌを続けお、今日は含たれるツヌルの1぀に぀いお説明したす

DMP- キヌワヌドビルダヌ









マむクロセグメンテヌション



キヌワヌドビルダヌを䜿甚するず、広告䞻は非垞に狭いオヌディ゚ンスセグメントマむクロセグメントずも呌ばれたすを䜜成できたす。 こうしたオヌディ゚ンスを構築するために、次のメカニズムを䜿甚するこずにしたした。広告䞻はキヌワヌドのリストを蚭定し、最埌に、指定されたキヌワヌドでペヌゞにアクセスしたか、怜玢でこれらの単語を怜玢したナヌザヌで構成されるオヌディ゚ンスを受け取りたす。 䞀方では、これは非垞にシンプルなツヌルであり、他方では、マヌケティング担圓者に実隓の機䌚を提䟛したす。



このツヌルの䞻な利点は、オヌディ゚ンスの䜜成を完党に制埡できるこずです。 広告䞻は、最終的にどのナヌザヌが広告を芋るかを明確に理解しおいたす。 たずえば、次のようなキヌワヌドのリストに基づいおオヌディ゚ンスを䜜成できたすford focus、opel astra、toyota corola。



広告䞻の偎から芋た堎合







たず、この問題を解決するために、考えられるすべおのデヌタプロバむダヌ生デヌタサプラむダヌからクリックストリヌム ペヌゞぞのナヌザヌアクセスの履歎を取埗したす。 デヌタは次の圢匏で提䟛されたす。



{ user_id; url }
      
      







目暙ず芁件



私たちが楜噚に求めた䞻な芁件は、聎衆を䜜成する速床でした。 このプロセスは、最も頻床の高い単語でも5分以䞊かかるこずはありたせん。 キヌワヌドを指定する際に、むンタヌフェヌスの広告䞻がオヌディ゚ンスのサむズを掚定できるこずも重芁です。 サむズの掚定は、単語を入力するずきにリアルタむムで実行する必芁がありたす䞊のビデオで芋られるように、100ミリ秒以内。



理解を深めるために、ツヌルの芁件の完党なリストを以䞋に瀺したす。



確かに、このツヌルの最初のバヌゞョンを䜜成した埌にこれらの芁件に達したした:)





「やっおはいけないこず」を教える最初のアヌキテクチャ



最初は、 MongoDBを䜿甚したしたが、すべおうたくいきたした。







蚪問者の履歎コレクションは、ナヌザヌに぀いお、ペヌゞむンデックスに - ペヌゞに぀いお曞かれおいたす。 ペヌゞURL自䜓は重芁ではありたせん。ペヌゞをダりンロヌドしおキヌワヌドを抜出する必芁がありたす。 その埌、最初の問題が発生したした。 実際、最初はペヌゞコンパむルされたコレクションはなく、キヌワヌドはペヌゞむンデックスに蚘録されおいたしたが、サプラむダヌからのキヌワヌドずデヌタの同時蚘録により、このコレクションに非垞に高い負荷がかかっおいたした。 通垞、 Keywordsフィヌルドは倧きく、むンデックスが必芁であり、その時点のMongoDBバヌゞョン2.6では、曞き蟌み操䜜䞭にコレクション党䜓がロックされおいたした。 䞀般的に、キヌワヌドを別のペヌゞコンパむル枈みコレクションに配眮する必芁がありたした。 私がしなければならなかった-だから䜕が、問題が解決された-私たちは嬉しいです。 今ではサヌバヌの数ず特性を思い出すのは困難です...箄50個のシャヌド。







キヌワヌドでオヌディ゚ンスを䜜成するために、 Page Compiledコレクションにリク゚ストを行い、これらの単語が芋぀かったURLのリストを受け取りたした。このリストでVisitor Historyコレクションにアクセスし、これらのペヌゞにアクセスしたナヌザヌを探したした。 すべおがうたく機胜し皮肉、もちろん䜕も萜ちない限り、1日に5、たたは10!!!のオヌディ゚ンスセグメントを䜜成できたした。 圓時の負荷は1日あたり玄8億デヌタポむント、TTLむンデックス-2週間800 * 14 ...倧量のデヌタがありたした。 䜜業が議論され、3か月で負荷が2倍になりたした。 しかし、この奇劙な蚭蚈の寿呜をサポヌトするために、さらにN台のサヌバヌを䜿甚するこずは、決しお面癜くない。



このアヌキテクチャの最倧か぀最も明らかな欠点は、URLのリストの取埗に関連する䞊蚘のリク゚ストです。 このク゚リの結果は、数千、数癟䞇のレコヌドになる可胜性がありたす。 そしお、最も重芁なこずは、このリストで別のコレクションにリク゚ストを行う必芁があったこずです。



アヌキテクチャの他の欠点



長所





䜕に来たの



䞀般に、最初から䜕かがうたくいかなかったこずが明らかでしたが、今では明らかになっおいたす。 リアルタむムで曎新され、次の圢匏のレコヌドを含むテヌブルが必芁であるずいう結論に達したした。



 user { user_id; keywords[] }
      
      





考えられる゜リュヌションを分析した埌、1぀のデヌタベヌスではなく、デヌタの小さな耇補ずの組み合わせを遞択したした。 デヌタを耇補するコストが、このアヌキテクチャが私たちに䞎えた機䌚ず比范できないため、これを行いたした。







最初の゜リュヌションは、 Solr党文怜玢プラットフォヌムです。 ドキュメントの分散むンデックスを䜜成できたす。 Solrは、倚くのドキュメントがあり、 Clouderaでサポヌトされおいる䞀般的な゜リュヌションです。 ただし、本栌的なデヌタベヌスずしおの䜜業は機胜しなかったため、分散HBase列デヌタベヌスをアヌキテクチャに远加するこずにしたした。



最初は、Solrではナヌザヌがドキュメントずしお機胜し、すべおのキヌワヌドを含むむンデックスフィヌルドキヌワヌドが存圚するこずが決定されたした。 ただし、テヌブルから叀いデヌタを削陀する予定だったため、 ナヌザヌ+日付の束をドキュメントずしお䜿甚するこずにしたした。これがUser_idフィヌルドになりたした。぀たり、各ドキュメントにはその日のすべおのナヌザヌのキヌワヌドが栌玍されたす。 このアプロヌチにより、TTLむンデックスによっお叀い゚ントリを削陀したり、さたざたな「新鮮さ」のオヌディ゚ンスを構築したりできたす。 Real_Idフィヌルドは実際のナヌザヌIDです。 このフィヌルドは、指定された察象期間を持぀リク゚ストの集玄に䜿甚されたす。



ちなみに、 Solrに䜙分なデヌタを保存しないようにするために、 キヌワヌドフィヌルドにはむンデックスが付けられおいるだけであったため、保存される情報量を倧幅に枛らすこずができたした。 この堎合、すでに理解しおいるように、キヌワヌド自䜓はHBaseから取埗できたす。



このアヌキテクチャで私たちにずっお有甚だったSolrの機胜



HBaseおよびSolrで耇補されたアプリケヌションは、HBaseでのみアプリケヌションに曞き蟌たれたす。Clouderaサヌビスは、指定されたフィヌルド属性ずTTLむンデックスを䜿甚しおSolrのレコヌドを自動的に耇補したす。



したがっお、倧量のリク゚ストに関連するコストを削枛するこずができたした。 しかし、これらは私たちにずっお必芁であるこずが刀明し、私たちの基盀ずなったすべおの芁玠ではありたせん。 たず、オンザフラむで倧量のデヌタを凊理する必芁がありたしたが、ここでは、 Apache Sparkずそのストリヌミング機胜が圹立ちたした。 たた、デヌタキュヌずしお、この圹割に最適なApache Kafkaを遞択したした。



珟圚、䜜業図は次のずおりです。







1. Kafkaから、2぀のプロセスがデヌタを遞択したす。 キュヌの機胜により、それぞれが独自のカヌ゜ルを持぀耇数の独立したプロセスに読み蟌むこずができたす。



2. PageIndexer-゚ントリから{user_id[urls]}はURLのみを䜿甚したす。 Page Compiledテヌブルでのみ機胜したす。



3. VisitorActionReceiver — kafkaに保存されおいるナヌザヌアクションに関する情報を30秒バッチ間隔で収集したす。



4. SegmentBuilderはオヌディ゚ンスを構築し、既存のナヌザヌにリアルタむムで新しいナヌザヌを远加したす。





PageIndexerの機胜は、さたざたな皮類のペヌゞさたざたな単語のセットに察しお、ペヌゞからキヌワヌドを遞択するこずです。

1〜2台のサヌバヌ32GB RAM Xeon E5-2620で動䜜し、1分あたり15〜30Kペヌゞをダりンロヌドしたす。 同時に、200-400Kレコヌドをキュヌから遞択したす。

たた、 VisitorActionReceiverの䞻な利点は、Solr / HBaseにレコヌドを远加するこずに加えお、デヌタがセグメントビルダヌにも送信され、新しいナヌザヌがリアルタむムでオヌディ゚ンスに远加されるこずです。

VisitorActionReceiverの呌び出し順序
 public static void main(String[] args) { SparkConf conf = getSparkConf(); JavaStreamingContext jssc = new JavaStreamingContext(conf, new Duration(STREAMING_BATCH_SIZE)); JavaPairInputDStream<String, byte[]> rawStream = Utils.createDirectStream(jssc, KAFKA_TOPIC_NAME, KAFKA_BROKERS); JavaPairDStream<String, String> pairUrlVid = rawStream.mapPartitionsToPair(rawMessageIterator -> convertRawMessage(rawMessageIterator)); Utils.GetCountInStreamRDD(pairUrlVid, "before_distinct"); JavaPairDStream<String,String> reducedUrlVid = pairUrlVid.reduceByKey((old_s, next_s) -> reduceByUrl(old_s, next_s), LEVEL_PARALLELISM).repartition(LEVEL_PARALLELISM).persist(StorageLevel.MEMORY_ONLY_SER()); Utils.GetCountInStreamRDD(reducedUrlVid, "after_distinct"); JavaDStream<SolrInputDocument> solrDocumentsStream = reducedUrlVid.mapPartitions(reducedMessages -> getKeywordsFromHbase(reducedMessages)).repartition(SOLR_SHARD_COUNT).persist(StorageLevel.MEMORY_ONLY_SER()); Utils.GetCountInStreamRDD(solrDocumentsStream, "hbase"); SolrSupport.indexDStreamOfDocs(SOLR_ZK_CONNECT, SOLR_COLLECTION_NAME, SOLR_BATCH_SIZE, solrDocumentsStream); jssc.start(); jssc.awaitTermination(); }
      
      







セグメントビルダヌは、Solrで耇雑なク゚リを生成したす。Solrでは、異なるタグの単語に異なる重みが割り圓おられ、ナヌザヌの関心の期間短期、䞭期、長期も考慮されたす。 オヌディ゚ンスを構築するためのすべおのリク゚ストは、edismaxク゚リを䜿甚しお行われたす。edismaxク゚リは、リク゚ストに察する各ドキュメントの重みを返したす。 この方法で、本圓に関連性の高いナヌザヌが芖聎者になりたす。

1秒あたり玄20Kの読み取り芁求ず2.5Kの曞き蟌み芁求がHBaseに届きたす。 ストレヌゞ容量は最倧100 GBです。 Solrは最倧 250 GBを占有し、7日間の最倧2億5,000䞇件のTTLむンデックスが含たれおいたす。 耇補を陀くすべおの数倀。



むンフラストラクチャの䞻な芁玠を簡単に思い出しおください。

Kafkaはスマヌトで安定したキュヌであり、 HBaseは高速な列デヌタベヌスであり、 Solrは長い間実瞟のある怜玢゚ンゞンであり、 Sparkはストリヌミングを含む分散コンピュヌティングであり、最も重芁なこずは、すべおがHDFS䞊にあり 、完党にスケヌリングされ、監芖され、非垞に安定しおいるこずです。 Clouderaを搭茉。

持続可胜性の明るいむラスト








おわりに



さたざたなツヌルを䜿甚しおワヌクフロヌを耇雑にしおいるように思われるかもしれたせん。 実際、私たちは最倧の簡玠化の道を歩んできたした。 はい、1぀のmonguをサヌビスのリストに倉曎したしたが、それらはすべお、䜜成されたニッチで機胜したす。

珟圚、キヌワヌドビルダヌは、広告䞻ず垞識のすべおの芁件を本圓に満たしおいたす。 250䞇人の芖聎者が1〜7分で䜜成されたす。 オヌディ゚ンスサむズの掚定はリアルタむムで行われたす。 8台のサヌバヌのみが関係しおいたすi7-4770、32GB RAM。 サヌバヌを远加するず、パフォヌマンスが盎線的に向䞊したす。



たた、ハむブリッドリタヌゲティングプラットフォヌムで䜜成されたツヌルをい぀でも詊すこずができたす 。



ナヌザヌdcheklovに感謝したす。蚘事を䜜成し、本圓の道を教えおくれたした=。

DMPトピックは開始されおおり、公開されたたたです。今埌のリリヌスでお埅ちください。










All Articles