Video içerik platformlarının en büyük zorluklarından biri, kullanıcıların hangi bölümleri izlediğini ve kaç farklı kullanıcının hangi saniyeleri görüntülediğini doğru bir şekilde analiz etmektir. Geleneksel yöntemler, her saniye için ayrı bir satır oluşturarak veritabanını hızla doldurur ve sorguları yavaşlatır. Peki, milyonlarca kullanıcı verisini optimize ederek gerçek zamanlı analizler yapmanın bir yolu var mı? Cevap: HyperLogLog.
Neden milyonlarca satır yerine tahmini sayılar yeterli?
Bir video platformunun aylık milyonlarca kullanıcısı olduğunu düşünün. Her kullanıcı, bir videonun farklı bölümlerini izlediğinde, geleneksel bir yaklaşımla her saniye için ayrı bir kayıt oluşturulması gerekecektir. Örneğin, 9 dakikalık bir videoyu izleyen tek bir kullanıcı bile 540 satırlık bir veri hacmi oluşturur. Bu durum, milyonlarca kullanıcıyla birlikte günde yüz milyonlarca satırın oluşmasına yol açar. Ancak, bu verilerin çoğu aslında sadece farklı kullanıcı sayısını analiz etmek için kullanılmaktadır.
Ürün ekipleri genellikle "Belirli bir saniyeyi kaç farklı kullanıcı izledi?" gibi sorulara yanıt arar. Bu sorguların sonucu, doğruluk oranı yüksek olmasa da yaklaşık olarak yeterli olabilir. Örneğin, "Sekizinci saniyeyi yaklaşık 41.000 farklı kullanıcı izledi" bilgisi, "41.287" sayısına göre çok daha uygulanabilir olabilir. İşte tam da bu noktada HyperLogLog devreye giriyor.
HyperLogLog, veri kümesinin benzersiz öğelerinin sayısını tahmin ederken sabit bir bellek kullanımı sağlar. Bu yöntem, verilerin boyutuna bakılmaksızın çalışır. Temel prensip, her öğenin hash değerini hesaplamak ve ardından en uzun sıfır serisini tespit etmektir. Bu şekilde, ne kadar benzersiz öğenin mevcut olduğunu tahmin etmek mümkün hale gelir.
HyperLogLog'un video analizlerinde avantajları
HyperLogLog'un video izleme verilerinde kullanılmasının birçok avantajı bulunmaktadır:
- Sabit boyut: Bellek kullanımı, kullanıcı sayısından bağımsız olarak değişmez. Örneğin,
log2m = 12(4096 kayıt) kullanıldığında, her kayıt yaklaşık 2,5 KB yer kaplar ve tek bir kullanıcıdan milyonlarca kullanıcıya kadar etkili bir şekilde çalışır.
- Birleştirilebilirlik: İki HyperLogLog kaydını birleştirerek global bir analiz elde etmek mümkündür. Bu sayede, farklı bölgelerdeki veriler tek bir sorguda birleştirilerek global bir izleme haritası oluşturulabilir.
- Hata sınırı: Standart hata oranı
%1,6civarındadır. Bu, insan gözüyle algılanamayacak kadar düşük bir hata payıdır.
PostgreSQL'de HyperLogLog kullanımı için postgresql-hll uzantısı tercih edilir. Bu uzantı, Citus ve Aggregate Knowledge tarafından geliştirilmiş olup, veritabanına doğrudan entegre edilebilir. Uzantının kurulması ve etkinleştirilmesi için aşağıdaki komut kullanılabilir:
-- Veritabanında bir kez çalıştırılması yeterli
CREATE EXTENSION IF NOT EXISTS hll;Veritabanı tasarımı: İzleme verilerini optimize etme
Video izleme verilerini analiz etmek için video_heatmap adlı bir tablo kullanılabilir. Bu tablo, her bir video için farklı bölgelerde ve saniyelerde kaç farklı kullanıcının izlediğini saklar. Tablo yapısı aşağıdaki gibi olabilir:
CREATE TABLE video_heatmap (
video_id text NOT NULL,
region text NOT NULL, -- Örneğin 'JP', 'KR', 'GLOBAL'
bucket_sec integer NOT NULL, -- Saniye bilgisi
viewers hll NOT NULL, -- HyperLogLog kaydı
PRIMARY KEY (video_id, region, bucket_sec)
);
-- Sık kullanılan sorgular için bir indeks oluşturulması
CREATE INDEX video_heatmap_lookup ON video_heatmap (video_id, region, bucket_sec) INCLUDE (viewers);Veri alınması: Milyonlarca kaydı tek bir sorguda işleme
Kullanıcıların video izleme verilerini toplamak için, istemci tarafından gönderilen kalp atışı (heartbeat) verileri kullanılır. Bu veriler, kullanıcının son birkaç saniyede hangi bölümleri izlediğini belirtir. Ancak, bu verilerin doğrudan veritabanına kaydedilmesi yerine, HyperLogLog kaydına eklenmesi tercih edilir.
Veri alma işlemi, Python kullanılarak gerçekleştirilebilir. Aşağıdaki örnek kod, kullanıcının izlediği saniyeleri alarak HyperLogLog kaydını günceller:
import hashlib
import os
import psycopg
DB = os.environ["ANALYTICS_DSN"] # PostgreSQL bağlantı dizesi
VIEWER_SALT = os.environ["VIEWER_SALT"].encode() # Gizli bir salt değer
def viewer_hash(viewer_id: str) -> int:
# Kullanıcı kimliğine göre benzersiz bir hash değeri oluştur
digest = hashlib.blake2b(
viewer_id.encode() + VIEWER_SALT,
digest_size=8
).digest()
return int.from_bytes(digest, "big", signed=True)
def record_watch(
conn,
video_id: str,
region: str,
start_sec: int,
end_sec: int,
viewer_id: str
) -> None:
h = viewer_hash(viewer_id)
with conn.cursor() as cur:
cur.execute(
"""
INSERT INTO video_heatmap (video_id, region, bucket_sec, viewers)
SELECT %(vid)s, %(region)s, g.b, hll_add(hll_empty(), hll_hash_bigint(%(h)s))
FROM generate_series(%(start)s, %(end)s) AS g(b)
ON CONFLICT (video_id, region, bucket_sec)
DO UPDATE SET viewers = video_heatmap.viewers || hll_add(hll_empty(), hll_hash_bigint(%(h)s));
""",
{
"vid": video_id,
"region": region,
"h": h,
"start": start_sec,
"end": end_sec,
}
)
# Örnek kullanım
if __name__ == "__main__":
with psycopg.connect(DB, autocommit=False) as conn:
record_watch(conn, "yt_abc123", "JP", start_sec=8, end_sec=47, viewer_id="sess_91f2")
conn.commit()Bu yaklaşım sayesinde, milyonlarca kullanıcı verisi tek bir sorguda işlenerek veritabanı performansı önemli ölçüde artırılır. HyperLogLog'un sunduğu bu esneklik ve verimlilik, video analizlerinde devrim yaratmaktadır.
Sonuç: Gelecekteki analizler için yeni olanaklar
HyperLogLog, video izleme verilerinin analizinde devrim yaratmaktadır. Sabit bellek kullanımı, birleştirilebilirlik ve düşük hata oranı sayesinde, platformlar milyonlarca kullanıcının verilerini hızlı ve verimli bir şekilde analiz edebilir. PostgreSQL'in sunduğu bu güçlü araç, gelecekteki analiz projelerinde de kullanılabilecek esnek bir çözüm sunmaktadır.
Bu yöntem, özellikle büyük veri hacimlerine sahip olan ve gerçek zamanlı analizler gerektiren platformlar için ideal bir çözüm olarak öne çıkmaktadır. HyperLogLog'un sunduğu avantajlar sayesinde, veri tabanı performansı ve analiz doğruluğu arasında mükemmel bir denge kurulabilir.
Yapay zeka özeti
PostgreSQL'in HyperLogLog uzantısını kullanarak video izleme verilerini optimize edin. Milyonlarca kullanıcı verisini nasıl daha hızlı ve verimli analiz edebilirsiniz? Detaylar için tıklayın.