रॉब्लॉक्सने क्रिएटर अॅनालिटिक्स वाढवण्यासाठी थेटा स्केचेस कसे वापरले

आजच्या रिअल-टाइम मल्टीप्लेअर गेम्ससाठी विश्लेषण अत्यावश्यक आहे. Roblox मध्ये, आम्ही आमच्या निर्मात्यांना यशस्वी होण्यास मदत करणारी मोजणी साधने विकसित करण्यावर लक्ष केंद्रित करतो. आमची मोफत, तत्काळ उपलब्ध विश्लेषणे निर्मात्यांना त्यांच्या अनुभवांच्या वाढीबद्दल, वापरकर्ते मिळविण्याबद्दल आणि टिकवून ठेवण्याबद्दल त्वरित अंतर्दृष्टी देतात, ज्यामुळे ते त्यांचे यश जास्तीत जास्त करू शकतात.
लाखो Roblox निर्माते ज्यावर अवलंबून आहेत अशा अद्ययावत विश्लेषणात्मक प्रणाली तयार करणे हे एक महत्त्वाचे आव्हान आहे. यावर मात करण्यासाठी, आम्ही आमच्या विश्लेषणात्मक क्वेरी इंजिनचे अनुकूलन केले आहे, ज्यामुळे 120 कोअर प्रोसेसिंग क्लस्टर दररोज सुमारे 300,000 अभ्यागतांकडून 86 TB डेटावर प्रवेश करताना 6 दशलक्षाहून अधिक क्वेरी सेवा देऊ शकते. आमच्या उपायाच्या केंद्रस्थानी एक ऑनलाइन अॅनालिटिकल प्रोसेसिंग (OLAP) डेटाबेस आहे, ज्याची आम्ही त्याच्या स्केलेबिलिटी आणि अंदाजकारक अल्गोरिदमसोबतच्या एकत्रीकरणासाठी निवड केली. डेटा रोलअप तंत्रांच्या मिश्रणासह HyperLogLog आणि Theta Sketch अल्गोरिदमचा वापर करून, आम्ही लाखो Roblox अनुभवांसाठी विश्लेषण प्रदान करतो.
OLAP विश्लेषणावरील एक परिचय
जितका अधिक डेटा क्वेरी केला जातो, तितका निकाल मिळवायला जास्त वेळ लागतो. जेव्हा आपण आवश्यक डेटा कमी करू शकतो आणि विश्लेषण प्रक्रिया वेगवान करू शकतो, तेव्हा निर्माते त्यांच्या क्रियांवरून जवळजवळ रिअल-टाइम अंतर्दृष्टी मिळवू शकतात. आम्ही वापरत असलेल्या काही तंत्रांमध्ये समाविष्ट आहेत:
- स्तंभीय संचयन: OLAP, Druid, फक्त आवश्यक स्तंभ वाचते.
- विभाजन आणि क्रमवारी फिल्टर: OLAP फक्त संबंधित फाइल्स वाचते ज्या थेट आवश्यक डेटा ब्लॉक्सशी निर्देशित आहेत.
- रोलअप: OLAP सामान्य गटांचा वापर करून घटनांचा आंशिक संकलन करतो.
रोलअप्स विशेषतः OLAPs ला Spark किंवा Presto (ज्यांची विलंब दहा सेकंदांपर्यंत असतो) सारख्या सर्वात मोठ्या SQL क्वेरी इंजिन्स आणि पॉईंट क्वेरी किंवा मर्यादित SQL, जे सहसा पूर्णपणे एकत्रित केलेला डेटा पुरवतात, यांच्यात कार्य करण्यास सक्षम करतात. रोलअप्ससह, क्वेरीज डायमेंशनच्या गटांनुसार की केल्या जातात, ज्यामुळे एकूण ओळींच्या कार्डिनॅलिटीमध्ये मोठी कपात होते. जेव्हा अब्जावधी किंवा अगदी ट्रिलियनवधी कच्च्या घटना पाहिल्या जातात, तेव्हा त्यांना दशलक्ष गटांमध्ये रोलअप करणे अधिक कार्यक्षम ठरते, ज्यांना उप-सेकंद विलंबात एकत्रित करता येते. उदाहरणार्थ:

जरी रोलअप्स वर नमूद केलेल्या संकुचन फायद्यांना अनुमती देतात, तरी काही मेट्रिक्स त्यांच्यावर अवलंबून राहत नाहीत, जसे की कच्च्या डेटाच्या संपूर्ण टेबल क्रमवारीची आवश्यकता असलेली क्वेरीज, जसे की वेगळे गणना, पर्सेंटायल्स आणि वारंवारता क्वेरीज.
सुदैवाने, संपूर्ण डेटासेटचा नमुना असलेली जटिल डेटा संरचना वापरून सांख्यिकीयदृष्ट्या मर्यादित अंदाजे निकाल परत करणाऱ्या तंत्रांच्या मदतीने आपण या मर्यादांवर मात करू शकतो. ही डेटा संरचना रोलअप तंत्रात वापरण्यासाठी डिझाइन केलेली असून, दोन वेगळ्या गणना युनियन ऑपरेशनद्वारे एकत्र करते, जसे दोन संख्या एकत्र बेरीज करतात.
Roblox विश्लेषण कार्यभारांचे विभाजन
Roblox मध्ये, आम्ही निर्मात्यांना एक केंद्रीकृत डॅशबोर्ड पुरवतो जिथे ते त्यांच्या सर्वात महत्त्वाच्या अंतर्दृष्टी शोधू शकतात. यात समाविष्ट आहेत:
- संलग्नता: दैनिक सक्रिय वापरकर्ते (DAU), मासिक सक्रिय वापरकर्ते (MAU), टिकून राहण्याची क्षमता, आणि फनेल्स
- मनीकरण: महसूल, प्रति वापरकर्ता सरासरी महसूल, विक्री, आणि अर्थव्यवस्था
- प्राप्ती डेटा
- थंबनेल वैयक्तिकरण आणि प्रयोग निकाल
- होम शिफारसींचे विश्लेषण
- आणि अजून बरेच काही येणार आहे.

क्वेरी इंजिनची निवड आणि अनुकूलन
कार्यक्षमता आव्हाने पार करणे
उत्पादन शॅडो चाचणीच्या अंतिम फेरीत, आम्हाला एक महत्त्वाची अडचण आढळली: एकल मोठ्या क्वेरींऐवजी दररोजच्या एकत्रीकरण पॅटर्नमध्ये बदल केल्यानंतर आमच्या MAU क्वेरीच्या कामगिरीला बळकटी देणे आवश्यक होते. हे आमच्या क्रिएटर अॅनालिटिक्सच्या दृश्य सादरीकरणांसाठी अत्यंत महत्त्वाचे आहेत.
आम्हाला आढळले की क्वेरीची रचना आमच्या OLAP सोल्यूशनच्या अंतर्निहित कामगिरीवर मोठा परिणाम करते. अनेक अंमलबजावणी टप्प्यांसह (जसे की नेस्टेड "GROUP BY" स्टेटमेंट्स2) असलेल्या मानक क्वेरीज अनेकदा कामाचा मोठा भाग हलक्या ब्रोकर नोड्सवर ढकलतात.
ही एक पारंपरिक बिग डेटा समस्या आहे जिथे क्वेरीचा काही भाग महत्त्वाच्या लहान सर्व्हिंग नोड्सवर चालवला जातो. आम्हाला अपेक्षित होते की आमच्या अंदाजे डेटा संरचना साध्या गणना किंवा बेरीजप्रमाणे कार्य करतील, परंतु आम्ही पाहिले की त्या प्रत्यक्षात खूपच वेगळ्या प्रकारे वागत होत्या.
खालील आकृतीत हा प्रश्न दाखवला आहे. यात दाखवले आहे की आमचे ऐतिहासिक नोड्स कसे आंशिक एकत्रीकरण करत होते, प्रत्येक दिवसासाठी एक Theta Sketch तयार करून नंतर त्यांचा डेटा ब्रोककडे पाठवत होते. नंतर ब्रोकने प्रत्येक मोठ्या दैनंदिन स्केचला एका दिवसासाठी एकाच मासिक मूल्यात विलीन करण्याचा प्रयत्न केला. 30 दिवसांच्या MAU साठी, याचा अर्थ ब्रोकवर 1,800 कमाल-आकाराच्या थेटा स्केचेसचे विलय करणे, ज्यामुळे ब्रोकचा CPU ताब्यात घेणारा, हळू आणि अयशस्वी होण्यास प्रवण क्वेरी तयार झाला.

आमचे समाधान म्हणजे अंदाज-आधारित क्वेरींवर अवलंबून असलेल्या डेटा स्रोतांसाठी डेटा स्थानिकता जास्तीत जास्त वाढवण्यासाठी कमी मोठ्या ऐतिहासिक वर्कर्ससह OLAP चालवणे. प्रत्यक्षात, यामुळे 100 MB पेक्षा जास्त डेटा प्रक्रिया करण्याची गरज असलेली एक मर्ज ऑपरेशन पुन्हा आमच्या ऐतिहासिक नोड्सवर ढकलली गेली.
SQL मध्ये हे साध्य करण्यासाठी, आम्ही इनलाइन जॉइनचा वापर करून क्वेरींना ऐतिहासिक नोड्सकडे आवश्यक माहिती प्रसारित केली आणि इनलाइन रिझल्ट तारखांची यादी असलेली क्वेरी तयार केली. प्रत्येक रिझल्ट तारीख नंतर ऐतिहासिक नोड विभागांमधून संबंधित डेटा गोळा करू शकते. नंतर हा डेटा ब्रोककडे परत पाठवला जातो, जिथे खाली दाखविल्याप्रमाणे रिझल्ट तारखेपासून मेट्रिक डेटापर्यंतचा एकच नकाशा तयार करण्यासाठी रिझल्ट्स त्वरीत विलीन केले जातात.

या ऑप्टिमायझेशनमुळे मोठ्या प्रमाणावरील क्वेरींच्या कामगिरीवर नाट्यमय परिणाम झाला. एका प्रमुख अनुभवाच्या देशनिहाय मासिक सक्रिय वापरकर्त्यांच्या (MAU) विभाजनासाठी सरासरी क्वेरी कामगिरी पाचपट सुधारली (17.53 सेकंदांपासून 3.23 सेकंदांपर्यंत), जसे खालील चार्टमध्ये दाखवले आहे. आम्ही ब्रोकरवरील CPU वेळेतही 50 पट घट पाहिली (16.83 सेकंदांपासून 0.34 सेकंदांपर्यंत).
जरी निकाल बदलू शकतात, तरीही हे गुंतागुंतीच्या ऑपरेशन्स (जसे की लाखो स्केचेस विलीन करणे) काळजीपूर्वक हाताळण्याचे महत्त्व अधोरेखित करते. या ऑपरेशन्सना साध्या एकत्रीकरणासमान समजल्यास, विशेषतः अशा प्रणालींमध्ये जिथे अंतिम टप्प्यातील क्लायंट एकत्रीकरण सामान्य आहे, तेथे लक्षणीय कामगिरी समस्या उद्भवू शकतात.
रोलअप्स आणि एक सैद्धांतिक थिटा क्यूब

आम्ही थेटा क्यूब नावाची एक प्रणालीही तपासली, जी मूलभूत रोलअप टेबल्स आणि पूर्णपणे कच्च्या टेबल्स यांच्यातील अंतर अंदाजे संच संमिलनाद्वारे भरून काढण्याचा एक सामान्यीकृत दृष्टिकोन आहे. हा दृष्टिकोन एका मूलभूत मर्यादेवर उपाय करतो: जेव्हा क्वेरींना उच्च-कार्डिनॅलिटी असलेल्या अनेक परिमाणांच्या थरांना स्पर्श करावे लागते, तेव्हा रोलअप टेबल्स त्यांचा फायदा गमावतात. कारण प्रत्येक परिमाण रोलअप कार्डिनॅलिटीचे प्रमाण परिमाणांच्या गुणाकाराप्रमाणे (∏dim) वाढवते.
आम्ही अशी प्रणाली डिझाइन केली की जी सामान्य परिमाण गटांनुसार एकत्रीकरण करते आणि कार्डिनॅलिटी कॅप ठेवते, ज्यामुळे गटातील कोणत्याही गोष्टीवर रोलअप कामगिरीच्या क्वेरींना परवानगी मिळते. नंतर, गटांमधील परिमाणांच्या संयोजनांसाठी शोधताना, आम्ही संचांवर approximate join4 करण्याचा प्रयत्न करतो आणि त्रुटीच्या अंदाजांसह मेट्रिक निकाल परत करतो. उच्च अंदाजित त्रुटी असलेली क्वेरी कच्च्या टेबलकडे पाठवली जाते, जिथे अनेक फिल्टर मोठ्या पुशडाउन ऑप्टिमायझेशन्ससाठी परवानगी देतात.


कारण आपण ही त्रुटी दर त्वरीत गणना करू शकतो, त्यामुळे कच्ची टेबल वाचणे कार्यक्षम असेल याचेही हे एक ठोस संकेत आहे. जिथे युनियनच्या तुलनेत ओव्हरलॅप होणारा डेटा कमी आहे (उदाहरणार्थ, जर्मनीतील जपानी भाषिक), तिथे कच्च्या टेबलमधील बऱ्याच ओळी फिल्टर केल्या जातील. यामुळे पुशडाउन ऑप्टिमायझेशन कार्यक्षम होते. डायमेंशन गट, अंदाजे जॉइन्स आणि त्रुटी-आधारित कच्ची टेबल रीड्स वापरणारी प्रणाली अंदाज-अनुकूल क्वेरीजवर रोलअप कामगिरी खरोखरच जास्तीत जास्त वाढवेल.
Roblox साठी, हे समाधान आमच्या पुढील स्तराच्या प्रमाणात अधिक लागू होईल—संभाव्यतः डायनॅमिक फनेल किंवा सानुकूल इव्हेंट विश्लेषणासाठी—तर आमची सध्याची साधी रोलअप प्रतिकृती आजच्या गरजा पूर्ण करते.
स्व-सेवा प्लॅटफॉर्म तयार करणे
आमच्या ब्रोकरचे ऑप्टिमायझेशन झाल्यानंतर, आम्ही आमच्या OLAP सोल्यूशनमध्ये जोडलेल्या डेटासेट्सच्या ऑनबोर्डिंग आणि क्वेरीसाठी साधने तयार करण्याकडे वळलो. आम्ही आमच्या डेटास्केच फंक्शन्ससाठी एक ओपन-सोर्स Spark आणि Trino UDAF लायब्ररी तयार केली, ज्यामुळे Spark ला आमच्या OLAP6 प्रमाणेच बायनरी डेटास्केच फॉरमॅट वापरता येतो. यामुळे आमचा बहुतेक कम्प्यूट वर्कलोड Spark मध्येच राहिला आणि Roblox मध्ये अंदाज (approximation) मानकीकृत करण्यात मदत झाली, ज्यामुळे काही डेटासेट्ससाठी कम्प्यूट खर्च सुमारे 80% पर्यंत कमी होऊ शकतो.
आम्ही आमच्या बॅच जॉब शेड्युलरमध्ये अंतर्गत विस्तार करून ऑनबोर्डिंग सुलभ केले आणि एक डेटाफ्रेम-शैलीतील API परिभाषित केली जी डेव्हलपर्सना निश्चित मेट्रिक्स आणि डायमेंशन्स ठरवण्यास मार्गदर्शन करते, ज्यामुळे ओपन क्वेरीजचा परिणाम कमी होतो. आम्ही आमच्या OLAP मध्ये हा डेटा कसा लोड आणि क्वेरी करतो यासाठी काही नमुना वर्कफ्लो ओपन-सोर्स केले आहेत.
आमचे अनुकूलित विश्लेषणात्मक डेटासेट्स आता आमच्या क्रिएटर्सना सखोल अंतर्दृष्टी प्रदान करत आहेत. आमच्या अनुकूलनांमुळे सरासरी कामगिरीत 4 पट आणि वाईट-प्रकरणातील कामगिरीत 50 पट सुधारणा झाली आहे. हे स्वयं-सेवा प्लॅटफॉर्म आमच्या क्रिएटर अॅनालिटिक्स टीमला डेव्हलपर्ससाठी नवीन डेटासेट्सवर पुढेही सुधारणा करत राहण्याची परवानगी देते. सर्व आकारांच्या डेव्हलपर्सना Roblox वर अविश्वसनीय अनुभव तयार करण्यासाठी ही साधने वापरताना पाहून आम्हाला आनंद होतो.
1 कोणत्याही प्रवेशासह
अद्वितीय युनिव्हर्सच्या मागील 60 दिवसांत गणना केली 2 या साध्या MAU क्वेरीप्रमाणे
3 निकाल 21–28 मार्च, 2025
या कालावधीचे आहेत 4 असे चालवले: SELECT c.experience_id, c.country, p.platform, THETA_INTERSECT(c.user_theta, p.user_theta) from (select experience_id, country, user_theta from theta_cube where agg_level = country) c union (select experience_id, platform, user_theta from theta_cube where agg_level = platform) p
5 https://datasketches.apache.org/docs/Theta/ThetaSketchSetOpsAccuracy.html
6 druid sql फंक्शनद्वारे COMPLEX_DECODE_BASE64('HLLSketch', sketch_col_name ).


