Konten di situs ini telah diterjemahkan menggunakan kecerdasan buatan (AI) atau teknologi penerjemahan mesin, dan mungkin terdapat kesalahan.

Skip to content

Bagaimana Roblox Menggunakan Theta Sketches untuk Memperluas Analisis Kreator

SEO image for Roblox Appoints Naveen Chopra as Chief Financial Officer

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:

  1. Penyimpanan kolom: OLAP, Druid, hanya membaca kolom yang diperlukan.
  2. Filter partisi dan urutan: OLAP hanya membaca file yang relevan yang mengindeks langsung ke blok data yang dibutuhkan.
  3. 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. 
Saat membangun sistem kami, kami berfokus pada pengoptimalan kueri kasus terburuk. Kueri ini biasanya berupa penghitungan unik dalam skala besar (>100 juta UUID) seperti MAU untuk pengalaman populer, yang dapat memperlambat waktu muat dari hitungan detik menjadi menit. Kami membangun kerangka kerja aproksimasi statistik untuk menjaga kueri tetap dalam latensi dua detik. Kami mengadaptasi teknik HyperLogLog dan Theta Sketch dari pustaka standar industri, yang mengurangi kueri terburuk dari membaca lebih dari 100 juta baris menjadi sekitar 5 juta.
Memilih dan Mengoptimalkan Mesin Pencarian
Setelah memilih solusi OLAP kami, kami memuat data keterlibatan selama enam bulan dan menguji batas kinerja sistem kami. Dengan sekitar 100 inti dan 500 GB memori, kami menemukan bahwa kami dapat menggabungkan secara acak 5 juta objek Theta Sketch biner (dengan total sekitar 100 MB) dalam waktu dua detik. Hal ini dilakukan pada kueri cold-start yang membaca dari disk tanpa mengakses cache dalam memori apa pun. Opsi penyimpanan jaringan seperti pembacaan S3, yang ditawarkan secara default oleh Clickhouse dan Duckdb, menunjukkan kinerja yang jauh lebih buruk. 
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

Kueri analitik rata-rata di platform kami memiliki sedikit pemecahan data dan jarang melibatkan dimensi dengan kardinalitas tinggi (seperti negara). Mengetahui hal ini, kami memutuskan untuk menduplikasi data kami, membuat tabel ringkasan dengan dimensi yang lebih sedikit, yang akan cukup untuk lebih dari 98%3 kueri kami. Kinerja tabel ini empat kali lebih baik pada kueri rata-rata.

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.

Pendekatan kubus theta ini mengubah dimensi, sehingga menghasilkan ekspansi ∑dim (jumlah dimensi) untuk jumlah baris, bukan ekspansi ∏dim. Tentu saja, hal ini dapat mengorbankan akurasi, sebuah dinamika yang berbanding lurus dengan ukuran tumpang tindih5 antara kedua kelompok dimensi. Alasan mendasar untuk hal ini berkaitan langsung dengan cara Theta Sketches menyimpan daftar terurut gaya K terbawah, yang akan memaksimalkan tabrakan antara dua himpunan dengan tumpang tindih inheren yang tinggi.

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 ).