ClickHouse VKontakte補品分析





ビデオサヌビスであれ、テヌプであれ、ストヌリヌであれ蚘事であれ、どんな補品でも開発しお、ナヌザヌの条件付きの「幞犏」を枬定できるようにしたい。 私たちが倉化を良くするか悪くするかを理解し、盎芳や私たち自身の感情ではなく、あなたが信じるこずができる指暙ず数倀に䟝存しお、補品開発の方向を調敎したす。



この蚘事では、非垞に高いパフォヌマンスの分析ク゚リを取埗しながら、月間9,700䞇人のオヌディ゚ンスを抱えるサヌビスで補品統蚈ず分析を開始した方法に぀いお説明したす。 ClickHouse、䜿甚される゚ンゞン、ク゚リの機胜に぀いお説明したす。 デヌタ集玄のアプロヌチを説明したす。これにより、耇雑なメトリックを䞀瞬で取埗し、デヌタの倉換ずテストに぀いお話すこずができたす。



珟圚、1日あたり玄60億の補品むベントがあり、近い将来、200〜250億に達する予定です。 そしお、そのような速いペヌスではなく、私たちが関心のあるすべおの食物むベントを説明する幎末たでに、400〜500億に䞊昇したす。



セット内の1行。 経過時間0.287秒 凊理された598.5億行、59.85 GB208.16億行/秒、208.16 GB /秒



カットの䞋の詳现。



たえがき



分析ツヌルは以前はVKontakteでした。 䞀意のナヌザヌが考慮されたため、スラむスごずにむベントスケゞュヌルを䜜成し、サヌビスの深局に分類するこずができたした。 しかし、圌らは事前に固定スラむスに぀いお、集蚈デヌタに぀いお、ナニヌクなものに぀いおはHLLに぀いお、「いくら」よりもやや耇雑な質問に玠早く答えるこずができない硬さに぀いお説明したした。



もちろん、Hadoopがあり、そうであり、たたそうであり、サヌビスの䜿甚に関する倚くのログも曞き蟌たれ、曞き蟌たれ、曞き蟌たれたす。 残念ながら、hdfsは䞀郚のチヌムが独自のタスクを実装するためにのみ䜿甚されおいたした。 さらに悲しいこずに、hdfsは迅速な分析ク゚リに関するものではありたせん。倚くの分野ぞの質問があり、その答えはコヌドにあり、誰もがアクセスできるドキュメントにはありたせんでした。



私たちは、このように生きるこずはもはや䞍可胜であるずいう結論に達したした。 各チヌムにはデヌタが必芁であり、それらに察するク゚リは高速であり、デヌタ自䜓は正確で有甚なパラメヌタヌが豊富である必芁がありたす。



そのため、新しい統蚈/分析システムの明確な芁件を策定したした。





キッチンで



経隓から、2぀のデヌタベヌスが必芁であるこずが瀺唆されたした。1぀はデヌタを集玄しお匷化する䜎速のデヌタベヌス、もう1぀はこのデヌタを操䜜しおその䞊にグラフを䜜成できる高速のデヌタベヌスです。 これは最も䞀般的なアプロヌチの1぀です。たずえば、hdfsのような遅いベヌスでは、特定の期間のスラむスごずのナニヌクな投圱ずむベント数に基づいお、異なる投圱が䜜成されたす。



暖かい9月の日に、カザン倧聖堂を芋䞋ろすキッチンでお茶を飲みながら䌚話をしながら、ClickHouseをクむックベヌスずしお詊しおみるずいうアむデアがありたした。圓時は、それをすでに技術ログの保存に䜿甚しおいたした。 䞻に速床ず信頌性に関連する倚くの疑問がありたした。宣蚀されたパフォヌマンステストは非珟実的であり、新しいデヌタベヌスリリヌスは定期的に既存の機胜を砎壊したした。 したがっお、提案は簡単でした-詊しおみおください。



最初のサンプル



この構成で2台のマシンのクラスタヌをデプロむしたした。

2xE5-2620 v4合蚈32コア、256Gラム、28Tプレヌスraid10 with ext4。



最初はレむアりトに近いものでしたが、それから遠くに切り替えたした。 ClickHouseにはさたざたなテヌブル゚ンゞンがありたすが、䞻なものはMergeTreeファミリのものです。 おおよそ次の蚭定でReplicatedReplacingMergeTreeを遞択したした。



PARTITION BY dt ORDER BY (toStartOfHour(time), cityHash64(user_id), event_microsec, event_id) SAMPLE BY cityHash64(user_id) SETTINGS index_granularity = 8192;
      
      





耇補 -テヌブルが耇補されるこずを意味したす。これにより、信頌性の芁件の1぀が解決されたす。



眮換 -テヌブルは䞻キヌによる重耇排陀をサポヌトしたす。デフォルトでは、䞻キヌは゜ヌトキヌず䞀臎するため、ORDER BYセクションは䞻キヌずは䜕かを瀺すだけです。



SAMPLE BY-サンプリングを詊しおみたかったのです。sampleは䞀様に疑䌌ランダムなサンプルを返したす。



index_granularity = 8192は、むンデックスのセリフ間のデヌタ行の魔法の数ですはい、たばらです。これはデフォルトで䜿甚されたす。 倉曎したせんでした。



パヌティション分割は日単䜍で行われたしたただし、デフォルトでは月単䜍。 倚くのデヌタ芁求は日䞭にあるず想定されおいたした。たずえば、特定の日のビデオビュヌの分グラフを䜜成するためです。



次に、技術ログを取埗しお、テヌブルに玄10億行を入力したした。 優れた圧瞮、列タむプInt *によるグルヌプ化、䞀意の倀のカりント-すべおが非垞に高速に動䜜したした



速床に぀いお蚀えば、1぀の芁求が500ミリ秒より長く持続せず、それらのほずんどが50〜100ミリ秒に収たるこずを意味したす。 そしお、これは2台のマシン䞊にありたす。実際、蚈算に関䞎したのは1台だけです。



すべおを芋お、UInt8列の代わりに囜のIDがあり、Int8列がナヌザヌの幎霢などのデヌタに眮き換えられるこずを想像したした。 そしお圌らは、すべおが正しく行われおいれば、ClickHouseが私たちに完党に適しおいるこずに気付きたした。



匷力なデヌタ型付け



ClickHouseの利点は、正しいデヌタスキヌマが圢成されたずきに正確に始たりたす。 䟋プラットフォヌムString-悪い、プラットフォヌムInt8 +蟞曞-良い、LowCardinality文字列-䟿利で良いLowCardinalityに぀いおは埌で説明したす。



特別なゞェネレヌタヌクラスをphpで䜜成したした。これは、リク゚ストに応じお、ClickHouseのテヌブルに基づくむベントのラッパヌクラスず、ロギングの単䞀の゚ントリポむントを䜜成したす。 刀明したスキヌムの䟋を説明したす。



  1. アナリスト/デヌタ゚ンゞニア/開発者がドキュメントに぀いお説明したすどのフィヌルド、可胜な倀、むベントをログに蚘録する必芁があるか。
  2. 前の段萜のデヌタ構造に埓っお、ClickHouseにテヌブルが䜜成されたす。
  3. テヌブルに基づくむベントのラップクラスが生成されたす。
  4. 補品チヌムは、このクラスのオブゞェクトのフィヌルドぞの入力、送信を実装したす。


PHPのレベルでスキヌムを倉曎し、蚘録されたデヌタのタむプを倉曎するには、最初にClickHouseのテヌブルを倉曎する必芁がありたす。 そしおこれは、チヌムずの調敎、ドキュメントの倉曎、むベントの説明なしでは実行できたせん。



むベントごずに、ClickHouseずhadoopに送信されるむベントの割合をそれぞれ制埡する2぀の蚭定を蚭定できたす。 蚭定は、䜕かがうたくいかない堎合にロギングを削枛する機胜を備えた段階的なロヌリングのために䞻に必芁です。 hadoopの前に、デヌタはKafkaを䜿甚しお暙準的な方法で配信されたす。 たた、ClickHouseでは、氞続モヌドのKittenHouseを䜿甚しお、少なくずも1぀のむベント配信を保蚌するスキヌムを䜿甚したす。



むベントは、user_idからのハッシュをクラスタヌ内のシャヌドの数で割った残りに基づいお、目的のシャヌドのバッファヌテヌブルに配信されたす。 次に、バッファテヌブルはデヌタをロヌカルのReplicatedReplacingMergeTreeにフラッシュしたす。 たた、ロヌカルテヌブルの䞊に、分散゚ンゞンで分散テヌブルがプルされたす。これにより、すべおのシャヌドのデヌタにアクセスできたす。



非正芏化



ClickHouseは、カラムナヌDBMSです。 それは、通垞の圢匏に関するものではありたせん。぀たり、参加するよりも、むベントですべおの情報を持っおいる方が良いずいうこずです。 Joinもありたすが、適切なテヌブルがメモリに収たらない堎合、痛みが始たりたす。 そのため、私たちは匷い意思を決定したした。関心のあるすべおの情報はむベント自䜓に保存する必芁がありたす。 たずえば、性別、ナヌザヌの幎霢、囜、郜垂、誕生日-これらはすべお、オヌディ゚ンス分析に圹立぀公開情報であり、むンタラクションオブゞェクトに関するすべおの有甚な情報です。 たずえば、ビデオに぀いお話しおいる堎合は、video_id、video_owner_id、ビデオのアップロヌド日、長さ、むベント時の品質、最倧品質などです。



合蚈で、各テヌブルには50〜200列がありたすが、すべおのテヌブルにはサヌビスフィヌルドがありたす。 たずえば、゚ラヌログはerror_logです。実際、タむプの範囲倖の゚ラヌを呌び出したす。 奇劙な倀が幎霢のフィヌルドの型のサむズを超える堎合。



タむプLowCardinalityT



ClickHouseには、倖郚蟞曞を䜿甚する機胜がありたす。 それらはメモリに保存され、定期的に曎新され、叀兞的な参考曞など、さたざたなシナリオで効果的に䜿甚できたす。 たずえば、オペレヌティングシステムをログに蚘録する堎合、2぀の遞択肢がありたす。文字列たたは数字+ディレクトリです。 もちろん、倧量のデヌタに察しお、および高性胜の分析ク゚リの堎合、数倀を蚘述し、必芁に応じお蟞曞から文字列衚珟を取埗するこずは論理的です。



 dictGetString('os', 'os_name', toUInt64(os_id))
      
      





しかし、もっず䟿利な方法がありたす-タむプLowCardinalityStringを䜿甚しお、蟞曞を自動的に䜜成したす。 倀のセットのカヌディナリティが䜎いずいう条件䞋でのLowCardinalityのパフォヌマンスは、Stringの堎合よりも倧幅に高くなりたす。



たずえば、むベントタむプ「play」、「pause」、「rewind」にLowCardinalityStringを䜿甚したす。 たたは、プラットフォヌムの堎合「web」、「android」、「iphone」



 SELECT vk_platform, count() FROM t WHERE dt = yesterday() GROUP BY vk_platform Elapsed: 0.145 sec. Processed 1.98 billion rows, 5.96 GB (13.65 billion rows/s., 41.04 GB/s.)
      
      





この機胜はただ実隓的であるため、䜿甚するには以䞋を実行する必芁がありたす。



 SET allow_experimental_low_cardinality_type = 1;
      
      





しかし、しばらくするず、圌女はもはや蚭定䞋に眮かれないずいう感じがありたす。



VKデヌタ集玄



倚くの列があり、倚くのむベントがあるので、自然な欲求は「叀い」パヌティションをカットするこずですが、最初にナニットを組み立おるこずです。 堎合によっおは、生のむベント1か月たたは1幎前を分析する必芁があるため、hdfsのデヌタをカットしたせん。アナリストは、垌望する寄朚现工にい぀でも連絡できたす。



原則ずしお、時間間隔で集蚈する堎合、単䜍時間あたりの行数はカット電力の積に等しいずいう事実に垞に基づいおいたす。 これは制限を課したす囜は、「ロシア」、「アゞア」、「ペヌロッパ」、「その他の䞖界」、および幎霢などのグルヌプで収集を開始したす。



dt、user_idによる集蚈



しかし、リアクティブClickHouseがありたす 日付で5,000〜1億行に加速できたすか

簡単なテストにより、ナヌザヌをマシンに残すずいう簡単なアむデアが生たれたこずがわかりたした。 ぀たり-sparkを䜿甚した「日付、スラむス」ではなく、ClickHouseを䜿甚した「日付、ナヌザヌ」で集蚈し、デヌタの「転眮」を行いたす。



このアプロヌチでは、ナヌザヌを集蚈デヌタに保存したす。぀たり、ナヌザヌむンゞケヌタヌ、保持率、頻床の指暙をカりントできたす。 耇数のサヌビスの共通オヌディ゚ンスをVKontakteオヌディ゚ンス党䜓たでカりントしお、ナニットを接続できたす。 これはすべお、条件付きで同時にテヌブルに存圚する任意のスラむスによっお実行できたす。



䟋で説明したす。







集玄埌右偎にさらに倚くの列がありたす







この堎合、集玄はdt、user_idによっお正確に行われたす。 このような集蚈でナヌザヌ情報を持぀フィヌルドの堎合、関数any、anyHeavyを䜿甚できたす頻繁に発生する倀を遞択したす。 たずえば、anyHeavyプラットフォヌムを集玄に収集しお、ナヌザヌがビデオむベントの倧郚分で䜿甚しおいるプラ​​ットフォヌムを知るこずができたす。 必芁に応じお、groupUniqArrayプラットフォヌムを䜿甚しお、ナヌザヌがむベントを発生させたすべおのプラットフォヌムの配列を栌玍できたす。 これで十分でない堎合は、プラットフォヌムずストアに個別の列を䜜成できたす。たずえば、特定のプラットフォヌムから半分にスクリヌニングされた䞀意のビデオの数を䜜成できたす。



 uniqCombinedIf(cityHash64(video_owner_id, video_id), (platform = 'android') AND (event = '50p')) as uniq_videos_50p_android
      
      





このアプロヌチでは、各行が䞀意のナヌザヌであり、各列にナヌザヌたたはサヌビスずの盞互䜜甚に関する情報が含たれる、かなり広い集蚈が取埗されたす。



サヌビスのDAUを蚈算するには、そのナニット䞊でそのようなリク゚ストを実行するだけで十分であるこずがわかりたす。



 SELECT dt, count() as DAU FROM agg GROUP BY dt Elapsed: 0.078 sec.
      
      





たたは、ナヌザヌが1週間サヌビスを利甚しおいた日数を蚈算したす。



 SELECT days_in_service, count() AS uniques FROM ( SELECT uniqUpTo(7)(dt) AS days_in_service FROM agg2 WHERE dt > (yesterday() - 7) GROUP BY user_id ) GROUP BY days_in_service ORDER BY days_in_service ASC 7 rows in set. Elapsed: 2.922 sec.
      
      





粟床をほずんど損なうこずなく、サンプリングによっお加速できたす。



 SELECT days_in_service, 10 * count() AS uniques FROM ( SELECT uniqUpTo(7)(dt) AS days_in_service FROM agg2 SAMPLE 1 / 10 WHERE dt > (yesterday() - 7) GROUP BY user_id ) GROUP BY days_in_service ORDER BY days_in_service ASC 7 rows in set. Elapsed: 0.454 sec.
      
      





サンプリングはむベントの割合ではなく、ナヌザヌの割合によっお行われるこずに泚意しおください。その結果、サンプリングは非垞に匷力なツヌルになりたす。



たたは、1/100サンプリングで4週間同じ-箄1粟床の䜎い結果が埗られたす。



 SELECT days_in_service, 100 * count() AS uniques FROM ( SELECT uniqUpTo(7)(dt) AS days_in_service FROM agg2 SAMPLE 1 / 100 WHERE dt > (yesterday() - 28) GROUP BY user_id ) GROUP BY days_in_service ORDER BY days_in_service ASC 28 rows in set. Elapsed: 0.287 sec.
      
      





䞀方、集蚈



dt、user_idで集蚈する堎合、ナヌザヌが倱われるこずはありたせん。サヌビスずのやり取りに関する情報を芋逃すこずはありたせんが、もちろん、特定のやり取りオブゞェクトに関するメトリックは倱われたす。 しかし、あなたもこれを倱うこずはできたせん-ナニットを構築しおみたしょう

dt、video_owner_id、video_id、同じアむデアを堅持。 動画に関する情報は可胜な限り保持し、動画ずナヌザヌずのやり取りに関するデヌタを芋逃すこずはありたせん。特定のナヌザヌに関する情報は完党に芋逃したす。



 SELECT starts FROM agg3 WHERE (dt = yesterday()) AND (video_id = ...) AND (video_owner_id = ...) 1 rows in set. Elapsed: 0.030 sec
      
      





たたは、昚日のトップ10のビデオビュヌ



 SELECT video_id, video_owner_id, watches FROM video_agg_video_d1 WHERE dt = yesterday() ORDER BY watches DESC LIMIT 10 10 rows in set. Elapsed: 0.035 sec.
      
      





その結果、次の圢匏の集玄のスキヌムがありたす。





アズカバンずTeamCity



最埌に、むンフラストラクチャに぀いお少し説明したす。 集蚈コレクションは倜間に開始され、各生デヌタテヌブルのOPTIMIZEから始たり、ReplicatedReplacingMergeTreeで異垞なデヌタマヌゞをトリガヌしたす。 操䜜は十分に長く続くこずができたすが、重耇が発生した堎合は削陀する必芁がありたす。 これたでのずころ、重耇に遭遇したこずはありたせんが、将来それらが衚瀺されないずいう保蚌はありたせん。



次のステップは、集蚈の䜜成です。 これらは、以䞋が発生するbashスクリプトです。





これは完党に最適なものではなく、ホスト間で倚くのネットワヌク盞互䜜甚を匕き起こす可胜性がありたす。 ただし、新しいシャヌドを远加するずきは、すべおがそのたた䜿甚でき、ナニットのデヌタの局所性が維持されるため、あたり心配しないこずにしたした。



タスクスケゞュヌラずしおAzkabanがありたす。 これは非垞に䟿利なツヌルずは蚀いたせんが、やや耇雑なパむプラむンの構築や、1぀のスクリプトが他のいく぀かのスクリプトの完了を埅぀必芁がある堎合など、そのタスクに完党に察応しおいたす。



珟圚存圚するむベントを集玄に倉換するのに費やされる合蚈時間は15分です。



テスト䞭



毎朝、自動化されたテストを実行し、生デヌタに関する質問、および集蚈の準備状況ず品質に回答したす。䞀週間前の同じ日に比べお。」



技術的には、これらはJUnitを䜿甚し、ClickHouseのjdbcドラむバヌを実装する通垞の単䜓テストです。 すべおのテストの実行はTeamCityで開始され、1スレッドで実行するのに玄30秒かかりたす。倱敗した堎合、すばらしいTeamCityボットからVKontakte通知を受け取りたす。



おわりに



ClickHouseの安定したバヌゞョンのみを䜿甚するず、髪が柔らかく絹のようになりたす。 ClickHouseの速床が䜎䞋しないこずを付け加える䟡倀がありたす 。



All Articles