Bagaimana Roblox Menggunakan Theta Sketches untuk Memperluas Analisis Kreator

Analitik sangat penting bagi game multipemain real-time saat ini. Di Roblox, kami berfokus pada pengembangan alat pengukuran untuk membantu para kreator kami berkembang. Analitik gratis dan siap pakai kami memberikan wawasan instan kepada para kreator mengenai pertumbuhan pengalaman mereka, akuisisi pengguna, dan retensi, sehingga membantu mereka memaksimalkan kesuksesan mereka.
Membangun sistem analitik terkini yang diandalkan oleh jutaan kreator Roblox merupakan tantangan penting. Untuk mengatasinya, kami telah mengoptimalkan mesin kueri analitik kami sehingga kluster pemrosesan 120 inti dapat melayani lebih dari 6 juta kueri per hari dari sekitar 300.000 pengunjung harian yang mengakses 86 TB data. Inti dari solusi kami adalah basis data pemrosesan analitik online (OLAP) yang kami pilih karena skalabilitasnya dan integrasinya dengan algoritma aproksimasi. Dengan menggunakan kombinasi teknik penggabungan data serta algoritma HyperLogLog dan Theta Sketch, kami menyediakan analitik untuk jutaan pengalaman Roblox1.
Pengantar Analisis OLAP
Semakin banyak data yang di-query, semakin lama waktu yang dibutuhkan untuk menghasilkan hasil. Ketika kita dapat mengurangi data yang dibutuhkan dan mempercepat proses analisis, pembuat konten dapat memperoleh wawasan hampir secara real-time dari tindakan mereka. Beberapa teknik yang kami gunakan meliputi:
- Penyimpanan kolom: OLAP, Druid, hanya membaca kolom yang diperlukan.
- Filter partisi dan urutan: OLAP hanya membaca file yang relevan yang mengindeks langsung ke blok data yang dibutuhkan.
- Rollup: OLAP mengagregasi sebagian peristiwa menggunakan pengelompokan umum.
Rollup, khususnya, memungkinkan OLAP beroperasi di antara mesin kueri SQL terbesar, seperti Spark atau Presto (dengan latensi puluhan detik), dan kueri titik atau SQL terbatas, yang biasanya menyajikan data yang sepenuhnya diagregasi. Dengan rollup, kueri diindeks berdasarkan pengelompokan dimensi, menghasilkan pengurangan besar pada jumlah baris total. Saat melihat miliaran atau bahkan triliunan peristiwa mentah, akan jauh lebih efisien untuk menggabungkannya menjadi jutaan pengelompokan yang dapat diagregasi dengan latensi kurang dari satu detik. Contohnya:

Meskipun rollup menawarkan keuntungan pengurangan yang disebutkan di atas, metrik tertentu tidak dapat diatasi dengan rollup, termasuk kueri yang memerlukan penyortiran tabel data mentah secara penuh, seperti hitungan unik, persentil, dan kueri frekuensi.
Untungnya, kita dapat mengatasi batasan ini dengan teknik yang mengembalikan hasil perkiraan yang terikat secara statistik berdasarkan struktur data kompleks yang menyimpan sampel dari kumpulan data lengkap. Struktur data ini dirancang untuk digunakan dalam teknik rollup dan menggabungkan dua hitungan unik melalui operasi gabungan, mirip dengan menjumlahkan dua angka.
Menganalisis Beban Kerja Analisis Roblox
Di Roblox, kami menyediakan dasbor terpusat bagi para kreator tempat mereka dapat menemukan wawasan terpenting mereka. Hal ini meliputi:
- Keterlibatan: pengguna aktif harian (DAU), pengguna aktif bulanan (MAU), retensi, dan saluran
- Monetisasi: pendapatan, pendapatan rata-rata per pengguna, penjualan, dan ekonomi
- Data akuisisi
- Personalisasi thumbnail dan hasil eksperimen
- Analisis Rekomendasi Beranda
- Dan masih banyak lagi yang akan datang.

Memilih dan Mengoptimalkan Mesin Pencarian
Mengatasi Tantangan Kinerja
Dalam putaran akhir pengujian bayangan produksi, kami menemukan tantangan penting: Kinerja kueri MAU kami perlu ditingkatkan setelah beralih dari kueri tunggal yang besar ke pola agregasi harian. Hal ini sangat penting untuk visualisasi analitik kreator kami.
Kami menemukan bahwa struktur kueri sangat memengaruhi kinerja dasar solusi OLAP kami. Kueri standar dengan beberapa tahap eksekusi (seperti pernyataan “GROUP BY” bersarang2) sering kali memindahkan sebagian besar beban kerja ke node broker yang ringan.
Ini adalah masalah klasik dalam big data di mana sebagian kueri akhirnya dieksekusi pada node penyedia layanan kecil yang penting. Kami mengharapkan struktur data aproksimasi kami berfungsi seperti hitungan atau penjumlahan sederhana, tetapi kami menemukan bahwa struktur tersebut sebenarnya berperilaku sangat berbeda.
Gambar di bawah ini menggambarkan masalah tersebut. Gambar tersebut menunjukkan bagaimana node historis kami melakukan agregasi parsial, menggabungkan Theta Sketch untuk setiap hari, lalu mengirimkan datanya kembali ke broker. Broker kemudian mencoba menggabungkan setiap sketsa harian besar menjadi satu nilai bulanan per hari. Untuk 30 hari MAU, ini berarti menggabungkan 1.800 Theta Sketch berukuran maksimum pada broker, yang mengakibatkan kueri yang lebih lambat dan rentan gagal yang memonopoli CPU broker.

Solusi kami adalah menjalankan OLAP dengan lebih sedikit pekerja historis berkapasitas besar untuk memaksimalkan lokalisasi data pada sumber data yang bergantung pada kueri aproksimasi. Dalam praktiknya, hal ini memindahkan operasi penggabungan yang berpotensi memerlukan pemrosesan data lebih dari 100 MB kembali ke node historis kami.
Untuk mencapai hal ini dalam SQL, kami menggunakan penggabungan inline agar kueri menyebarkan informasi yang diperlukan ke node historis dan menyiapkan kueri dengan daftar tanggal hasil inline. Setiap tanggal hasil kemudian dapat mengumpulkan data yang relevan dari segmen node historis. Data tersebut kemudian dikirim kembali ke broker, tempat hasilnya dengan cepat digabungkan menjadi satu peta tanggal hasil ke data metrik, seperti yang terlihat di bawah ini.

Optimasi ini berdampak besar pada kinerja untuk kueri berskala besar. Untuk rincian MAU pengalaman utama berdasarkan negara, kinerja kueri rata-rata meningkat 5 kali lipat (dari 17,53 detik menjadi 3,23), seperti yang ditunjukkan pada bagan di bawah ini. Kami juga melihat pengurangan waktu CPU sebesar 50 kali lipat pada broker (dari 16,83 detik menjadi 0,34).
Meskipun hasilnya bervariasi, hal ini menyoroti pentingnya menangani operasi kompleks (seperti menggabungkan jutaan sketsa) dengan hati-hati. Menganggap operasi ini setara dengan agregasi sederhana dapat menyebabkan masalah kinerja yang signifikan, terutama pada sistem di mana agregasi klien last-mile sering terjadi.
Ringkasan dan Kubus Theta Teoretis

Kami juga mengeksplorasi theta cube, atau pendekatan umum untuk menjembatani kesenjangan antara tabel rollup dasar dan tabel mentah sepenuhnya melalui persimpangan himpunan perkiraan. Pendekatan ini mengatasi keterbatasan mendasar: Tabel rollup kehilangan keunggulannya ketika kueri perlu menyentuh banyak lapisan dimensi kardinalitas tinggi. Hal ini disebabkan oleh setiap dimensi yang menyebabkan kardinalitas rollup berskala sebagai ∏dim (produk dimensi).
Kami merancang sistem yang akan mengagregasi berdasarkan kelompok dimensi umum dengan batasan kardinalitas, sehingga memungkinkan kueri rollup berkinerja tinggi pada apa pun dalam kelompok tersebut. Kemudian, saat mencari kombinasi dimensi di seluruh kelompok, kami akan mencoba join4 perkiraan di seluruh himpunan dan mengembalikan hasil metrik bersama dengan perkiraan kesalahan. Kueri dengan perkiraan kesalahan tinggi akan diteruskan ke tabel mentah, di mana banyak filter seharusnya memungkinkan optimisasi pushdown yang besar.


Karena kita dapat menghitung tingkat kesalahan ini dengan cepat, hal ini juga berfungsi sebagai sinyal kuat bahwa membaca tabel mentah kemungkinan besar akan berjalan dengan performa yang baik. Dalam kasus di mana data yang tumpang tindih relatif kecil dibandingkan dengan gabungan (misalnya, penutur bahasa Jepang di Jerman), sejumlah besar baris tabel mentah akan disaring. Hal ini menghasilkan optimisasi pushdown yang efisien. Sistem yang menggunakan grup dimensi, penggabungan perkiraan, dan pembacaan tabel mentah berbasis kesalahan akan benar-benar memaksimalkan kinerja rollup pada kueri yang ramah perkiraan.
Bagi Roblox, solusi ini akan lebih dapat diterapkan pada tingkat skala kami berikutnya—mungkin untuk analisis saluran dinamis atau peristiwa khusus—sementara replika rollup sederhana kami saat ini sudah memenuhi kebutuhan saat ini.
Membangun Platform Layanan Mandiri
Setelah broker kami dioptimalkan, kami beralih ke pengembangan alat untuk onboarding dan pengambilan data dari dataset yang ditambahkan ke solusi OLAP kami. Kami membangun perpustakaan UDAF Spark dan Trino sumber terbuka untuk fungsi datasketch kami, memungkinkan Spark menggunakan format biner datasketch yang sama dengan OLAP6 kami. Hal ini menjaga sebagian besar beban komputasi tetap di Spark dan membantu menstandarkan perkiraan di seluruh Roblox, berpotensi mengurangi biaya komputasi hingga 80% untuk dataset tertentu.
Kami menyederhanakan proses onboarding dengan ekstensi internal pada penjadwal tugas batch kami dan mendefinisikan antarmuka API bergaya dataframe yang memandu pengembang untuk menentukan ukuran dan dimensi definitif, sehingga mengurangi dampak dari kueri terbuka. Kami juga telah membuka sumber beberapa alur kerja contoh tentang cara kami memuat dan mengkueri data ini di OLAP kami.
Kumpulan data analitik kami yang telah dioptimalkan kini memberikan wawasan mendalam kepada para kreator kami. Optimalisasi kami meningkatkan kinerja rata-rata hingga 4 kali lipat dan kinerja terburuk hingga 50 kali lipat. Platform swalayan ini memungkinkan tim Creator Analytics kami untuk terus mengulangi kumpulan data baru bagi para pengembang. Kami sangat antusias melihat pengembang dari berbagai skala menggunakan alat-alat ini untuk menciptakan pengalaman luar biasa di Roblox.
1 Dihitung berdasarkan 60 hari terakhir dari pengguna unik dengan akses
apa pun 2 Seperti kueri
MAU sederhana ini 3 Hasilnya berasal dari tanggal 21-28 Maret 2025
4 Dilakukan seperti ini: 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 Melalui fungsi SQL Druid COMPLEX_DECODE_BASE64('HLLSketch', sketch_col_name ).


