Roblox ใช้ Theta Sketches อย่างไรในการขยายการวิเคราะห์ผู้สร้าง

การวิเคราะห์ข้อมูลเป็นสิ่งสำคัญสำหรับเกมมัลติเพลเยอร์แบบเรียลไทม์ในปัจจุบัน ที่ Roblox เรามุ่งเน้นในการพัฒนาเครื่องมือวัดผลเพื่อช่วยให้ผู้สร้างของเราประสบความสำเร็จ เครื่องมือวิเคราะห์ข้อมูลของเราที่ให้บริการฟรีและพร้อมใช้งานทันที ช่วยให้ผู้สร้างได้รับข้อมูลเชิงลึกเกี่ยวกับการเติบโตของประสบการณ์ การได้มาซึ่งผู้ใช้ และการรักษาผู้ใช้ในทันที ซึ่งช่วยให้พวกเขาประสบความสำเร็จสูงสุด
การสร้างระบบวิเคราะห์ข้อมูลที่ทันสมัยซึ่งผู้สร้าง Roblox หลายล้านคนพึ่งพาอยู่นั้นเป็นความท้าทายที่สำคัญ เพื่อรับมือกับสิ่งนี้ เราได้ปรับปรุงประสิทธิภาพของเครื่องมือค้นหาข้อมูลเชิงวิเคราะห์ของเราให้สามารถรองรับคลัสเตอร์การประมวลผลที่มี 120 คอร์ เพื่อให้บริการมากกว่า 6 ล้านคำค้นหาต่อวัน จากผู้เข้าชมประมาณ 300,000 คนต่อวัน ที่เข้าถึงข้อมูล 86 TB หัวใจสำคัญของโซลูชันของเราคือฐานข้อมูลการประมวลผลเชิงวิเคราะห์ออนไลน์ (OLAP) ที่เราเลือกใช้เนื่องจากความสามารถในการขยายตัวและการผสานรวมกับอัลกอริธึมการประมาณค่า ด้วยการใช้เทคนิคการรวมข้อมูลหลายรูปแบบร่วมกับอัลกอริธึม HyperLogLog และ Theta Sketch เราจึงสามารถให้บริการวิเคราะห์ข้อมูลสำหรับประสบการณ์บน Roblox ได้หลายล้านรายการ1
คู่มือเบื้องต้นเกี่ยวกับการวิเคราะห์ข้อมูลแบบ OLAP
ยิ่งมีการค้นหาข้อมูลมากเท่าใด ก็ยิ่งใช้เวลานานขึ้นในการสร้างผลลัพธ์ เมื่อเราสามารถลดปริมาณข้อมูลที่จำเป็นและเร่งกระบวนการวิเคราะห์ได้ ผู้สร้างจะสามารถได้รับข้อมูลเชิงลึกที่ใกล้เคียงกับเวลาจริงจากการกระทำของพวกเขา เทคนิคบางส่วนที่เราใช้ ได้แก่:
- การจัดเก็บข้อมูลแบบคอลัมน์: OLAP, Druid, อ่านเฉพาะคอลัมน์ที่จำเป็นเท่านั้น
- ตัวกรองการแบ่งส่วนและการจัดเรียง: OLAP จะอ่านเฉพาะไฟล์ที่เกี่ยวข้องซึ่งมีการจัดทำดัชนีโดยตรงไปยังบล็อกข้อมูลที่จำเป็นเท่านั้น
- สรุป: OLAP จะรวบรวมเหตุการณ์บางส่วนโดยใช้การจัดกลุ่มที่เหมือนกัน
Rollups โดยเฉพาะอย่างยิ่ง ช่วยให้ OLAP สามารถทำงานระหว่างเครื่องมือค้นหา SQL ที่ใหญ่ที่สุด เช่น Spark หรือ Presto (ที่มีความหน่วงเวลาเป็นสิบวินาที) และการค้นหาแบบจุดหรือ SQL ที่จำกัด ซึ่งโดยปกติจะให้บริการข้อมูลที่ถูกรวมทั้งหมดแล้ว ด้วย rollups การค้นหาจะกลายเป็นแบบกำหนดโดยกลุ่มของมิติ ส่งผลให้การลดจำนวนแถวทั้งหมดลดลงอย่างมาก เมื่อพิจารณาเหตุการณ์ดิบจำนวนหลายพันล้านหรือแม้กระทั่งหลายล้านล้านเหตุการณ์ การรวบรวมเหตุการณ์เหล่านี้เป็นกลุ่มๆ หลายล้านกลุ่มที่สามารถรวมกันได้ด้วยความล่าช้าน้อยกว่าหนึ่งวินาทีนั้นจะมีประสิทธิภาพมากกว่ามาก ตัวอย่างเช่น:

ในขณะที่ rollups มอบข้อได้เปรียบด้านการลดขนาดตามที่กล่าวไว้ข้างต้น แต่ก็มีตัวชี้วัดบางประเภทที่ไม่สามารถลดได้ เช่น การค้นหาที่ต้องการการจัดเรียงข้อมูลดิบทั้งหมด เช่น การนับจำนวนที่ไม่ซ้ำกัน การหาเปอร์เซ็นไทล์ และการค้นหาความถี่
โชคดีที่เราสามารถหลีกเลี่ยงข้อจำกัดเหล่านี้ได้ด้วยเทคนิคที่ให้ผลลัพธ์โดยประมาณที่มีขอบเขตทางสถิติ โดยอาศัยโครงสร้างข้อมูลที่ซับซ้อนซึ่งเก็บตัวอย่างของชุดข้อมูลทั้งหมดไว้ โครงสร้างข้อมูลเหล่านี้ถูกออกแบบมาเพื่อใช้ในเทคนิคการรวมข้อมูล (rollup) และรวมจำนวนสองค่าที่แตกต่างกันผ่านการดำเนินการรวม (union operation) ซึ่งคล้ายกับการบวกตัวเลขสองตัวเข้าด้วยกัน
การวิเคราะห์ภาระงานของ Roblox
ที่ Roblox เราให้ผู้สร้างมีแดชบอร์ดกลางที่พวกเขาสามารถค้นหาข้อมูลเชิงลึกที่สำคัญที่สุดได้ ซึ่งรวมถึง:

การเลือกและปรับแต่งเครื่องมือค้นหาข้อมูล
การเอาชนะความท้าทายด้านประสิทธิภาพ
ในรอบสุดท้ายของการทดสอบเงาการผลิต เราพบความท้าทายที่สำคัญ: ประสิทธิภาพการค้นหา MAU ของเราจำเป็นต้องได้รับการเสริมหลังจากเปลี่ยนจากการค้นหาขนาดใหญ่เพียงครั้งเดียวเป็นรูปแบบการรวมข้อมูลรายวัน สิ่งเหล่านี้มีความสำคัญอย่างยิ่งสำหรับการแสดงผลข้อมูลการวิเคราะห์ผู้สร้างของเรา
เราพบว่าโครงสร้างของคำค้นหาส่งผลกระทบอย่างมากต่อประสิทธิภาพพื้นฐานของโซลูชัน OLAP ของเรา คำค้นหาแบบมาตรฐานที่มีหลายขั้นตอนในการประมวลผล (เช่น คำสั่ง "GROUP BY" ที่ซ้อนกัน) มักจะผลักงานจำนวนมากไปยังโหนดตัวกลางที่มีน้ำหนักเบา
นี่คือปัญหาบิ๊กดาต้าแบบคลาสสิกที่บางส่วนของคำสั่งค้นหาถูกนำไปประมวลผลบนโหนดให้บริการขนาดเล็กที่มีความสำคัญ เราคาดหวังว่าโครงสร้างข้อมูลแบบประมาณการของเราจะทำงานเหมือนการนับหรือการรวมค่าอย่างง่าย แต่เราพบว่ามันมีพฤติกรรมที่แตกต่างออกไปอย่างมาก
รูปด้านล่างแสดงปัญหาที่เกิดขึ้น โดยแสดงให้เห็นว่าโหนดในอดีตของเราจะทำการรวมข้อมูลบางส่วนอย่างไร โดยจะรวบรวม Theta Sketch สำหรับแต่ละวันแล้วส่งข้อมูลกลับไปยังโบรกเกอร์ จากนั้นโบรกเกอร์จะพยายามรวม Sketch รายวันขนาดใหญ่แต่ละรายการให้เป็นค่ารายเดือนเพียงค่าเดียวต่อวัน สำหรับ 30 วันของ MAU นี่หมายถึงการรวม Theta Sketches ขนาดสูงสุด 1,800 รายการบนตัวกลาง ซึ่งส่งผลให้การค้นหาช้าลง มีแนวโน้มล้มเหลว และทำให้ CPU ของตัวกลางทำงานหนักเกินไป

วิธีแก้ปัญหาของเราคือการใช้ OLAP ด้วยจำนวนผู้ทำงานขนาดใหญ่ในอดีตที่น้อยลง เพื่อเพิ่มประสิทธิภาพการเก็บข้อมูลในหน่วยความจำสำหรับแหล่งข้อมูลที่ต้องใช้การค้นหาแบบประมาณค่า ในทางปฏิบัติ วิธีนี้ทำให้การรวมข้อมูลซึ่งอาจต้องใช้ข้อมูลมากกว่า 100 MB กลับมาดำเนินการที่โหนดเก็บข้อมูลในอดีตของเรา
เพื่อให้บรรลุเป้าหมายนี้ใน SQL เราใช้การเชื่อมโยงแบบอินไลน์ (inline join) เพื่อให้การค้นหาข้อมูลสามารถส่งต่อข้อมูลที่จำเป็นไปยังโหนดประวัติศาสตร์ได้ และเตรียมการค้นหาข้อมูลพร้อมรายการวันที่ของผลลัพธ์แบบอินไลน์ไว้ วันที่ของผลลัพธ์แต่ละวันสามารถรวบรวมข้อมูลที่เกี่ยวข้องได้จากส่วนของโหนดประวัติศาสตร์ จากนั้นข้อมูลจะถูกส่งกลับไปยังโบรกเกอร์ ซึ่งผลลัพธ์จะถูกผสานรวมอย่างรวดเร็วเป็นแผนที่เดียวของวันที่ของผลลัพธ์กับข้อมูลเมตริก ตามที่เห็นด้านล่าง

การปรับปรุงประสิทธิภาพครั้งนี้มีผลกระทบอย่างมากต่อประสิทธิภาพของคำค้นหาขนาดใหญ่ สำหรับการแยกประเภทผู้ใช้รายเดือน (MAU) ตามประเทศของประสบการณ์หลัก ประสิทธิภาพเฉลี่ยของคำค้นหาดีขึ้นถึง 5 เท่า (จาก 17.53 วินาที เป็น 3.23 วินาที) ตามที่แสดงในแผนภูมิด้านล่าง นอกจากนี้ เรายังสังเกตเห็นการลดเวลาการใช้ CPU บนบрокเกอร์ลงถึง 50 เท่า (จาก 16.83 วินาที เหลือ 0.34 วินาที)
แม้ว่าผลลัพธ์จะแตกต่างกันไป แต่สิ่งนี้เน้นย้ำถึงความสำคัญของการจัดการกับกระบวนการที่ซับซ้อน (เช่น การรวมภาพร่างหลายล้านภาพ) ด้วยความระมัดระวัง การสมมติว่ากระบวนการเหล่านี้เทียบเท่ากับการรวมข้อมูลแบบง่ายอาจนำไปสู่ปัญหาด้านประสิทธิภาพที่สำคัญ โดยเฉพาะในระบบที่มีการรวมข้อมูลจากฝั่งไคลเอนต์ในขั้นตอนสุดท้ายบ่อยครั้ง
โรลอัพและลูกบาศก์ธีโอเรียทเธต้า

เรายังได้สำรวจ theta cube หรือแนวทางทั่วไปเพื่อเชื่อมช่องว่างระหว่างตาราง rollup พื้นฐานกับตารางดิบอย่างสมบูรณ์ผ่านการตัดเซตประมาณค่า วิธีนี้แก้ไขข้อจำกัดพื้นฐาน: ตาราง rollup สูญเสียข้อได้เปรียบเมื่อการค้นหาต้องเข้าถึงหลายชั้นของมิติที่มีคาร์ดินัลสูง นั่นเป็นเพราะแต่ละมิติทำให้คาร์ดินัลของ rollup ขยายตัวเป็น ∏dim (ผลคูณของมิติ)
เราออกแบบระบบที่จะรวบรวมข้อมูลตามกลุ่มมิติที่มีลักษณะร่วมกัน โดยมีการจำกัดจำนวนสูงสุด (cardinality cap) ซึ่งช่วยให้สามารถทำการค้นหาแบบรวมยอด (rollup) สำหรับข้อมูลใดๆ ในกลุ่มนั้นได้ จากนั้น เมื่อต้องการค้นหาการรวมกันของมิติจากหลายกลุ่ม เราจะพยายามทำการเชื่อมโยงแบบประมาณการ (approximate join4) ระหว่างชุดข้อมูล และส่งคืนผลลัพธ์ของเมตริกพร้อมกับการประมาณค่าความผิดพลาด การค้นหาที่มีค่าประมาณความผิดพลาดสูงจะถูกส่งต่อไปยังตารางดิบ (raw table) ซึ่งตัวกรองจำนวนมากควรช่วยให้เกิดการปรับปรุงประสิทธิภาพแบบ pushdown ได้มาก


เนื่องจากเราสามารถคำนวณอัตราความผิดพลาดนี้ได้อย่างรวดเร็ว จึงสามารถใช้เป็นสัญญาณที่ชัดเจนว่าการอ่านข้อมูลจากตารางดิบจะมีประสิทธิภาพ ในกรณีที่มีข้อมูลทับซ้อนกันน้อยเมื่อเทียบกับข้อมูลรวม (เช่น ผู้พูดภาษาญี่ปุ่นในเยอรมนี) จำนวนแถวในตารางดิบจำนวนมากจะถูกกรองออกไป ส่งผลให้เกิดการปรับปรุงประสิทธิภาพแบบ pushdown ที่มีประสิทธิภาพ ระบบที่ใช้กลุ่มมิติ, การเชื่อมต่อแบบประมาณ, และการอ่านตารางดิบตามข้อผิดพลาด จะช่วยเพิ่มประสิทธิภาพการรวมข้อมูลในแบบสอบถามที่เหมาะกับการประมาณค่าได้อย่างแท้จริง
สำหรับ Roblox, โซลูชันนี้จะเหมาะกับการนำไปใช้ในระดับต่อไปของเรา—อาจเหมาะสำหรับการวิเคราะห์แบบไดนามิกของฟันเนลหรือเหตุการณ์ที่กำหนดเอง—ในขณะที่แบบจำลองแบบรวมแบบง่ายในปัจจุบันของเราสามารถตอบสนองความต้องการในปัจจุบันได้
การสร้างแพลตฟอร์มบริการตนเอง
เมื่อเราปรับแต่งตัวกลางของเราให้เหมาะสมแล้ว เราจึงหันมาสร้างเครื่องมือสำหรับการนำเข้าข้อมูลและการสืบค้นชุดข้อมูลที่เพิ่มเข้าไปในโซลูชัน OLAP ของเรา เราได้สร้างไลบรารี UDAF สำหรับ Spark และ Trino แบบโอเพนซอร์สสำหรับฟังก์ชัน datasketch ของเรา ทำให้ Spark สามารถใช้รูปแบบข้อมูล datasketch แบบไบนารีเดียวกันกับ OLAP6 ของเรา สิ่งนี้ช่วยให้ภาระงานประมวลผลส่วนใหญ่ยังคงอยู่ใน Spark และช่วยมาตรฐานการประมาณค่าให้สอดคล้องกันทั่วทั้ง Roblox ซึ่งอาจช่วยลดค่าใช้จ่ายในการประมวลผลได้สูงสุดถึง 80% สำหรับชุดข้อมูลบางประเภท
เราได้ทำให้กระบวนการเริ่มต้นใช้งานง่ายขึ้นด้วยการขยายส่วนขยายภายในสำหรับตัวจัดตารางงานแบบแบทช์ของเรา และกำหนด API แบบ dataframe เพื่อช่วยแนะนำให้นักพัฒนาตัดสินใจเกี่ยวกับมาตรการและมิติที่ชัดเจน ลดผลกระทบจากคำถามที่ยังไม่ได้รับการแก้ไข นอกจากนี้ เรายังได้เปิดเผยตัวอย่างเวิร์กโฟลว์บางส่วนที่แสดงวิธีการโหลดและสอบถามข้อมูลนี้ในระบบ OLAP ของเราในรูปแบบโอเพนซอร์สอีกด้วย
ชุดข้อมูลวิเคราะห์ที่ได้รับการปรับให้เหมาะสมของเราตอนนี้ให้ข้อมูลเชิงลึกที่ลึกซึ้งแก่ผู้สร้างของเรา การปรับให้เหมาะสมของเราได้ปรับปรุงประสิทธิภาพเฉลี่ยขึ้น 4 เท่า และประสิทธิภาพในกรณีที่แย่ที่สุดขึ้น 50 เท่า แพลตฟอร์มบริการตนเองช่วยให้ทีม Creator Analytics ของเราสามารถปรับปรุงชุดข้อมูลใหม่สำหรับนักพัฒนาต่อไปได้ เรารู้สึกตื่นเต้นที่จะได้เห็นนักพัฒนาทุกขนาดใช้เครื่องมือเหล่านี้เพื่อสร้างประสบการณ์ที่น่าทึ่งบน 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) จาก (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 ผ่านฟังก์ชัน sql ของ druid COMPLEX_DECODE_BASE64('HLLSketch', sketch_col_name ).


