PostgresQ-இல் HyperLogLog மூலம் வீடியோ ஹீட்மேப்களை (Heatmaps) உருவாக்குதல்

பார்வையாளர்கள் ஒரு வீடியோவை எங்கு பார்ப்பதை நிறுத்துகிறார்கள் என்பதை எடிட்டர்களுக்குத் துல்லியமாகக் காட்ட நீங்கள் விரும்புகிறீர்கள்.

இதைச் செய்ய, உங்களுக்கு ஒரு ஹீட்மேப் தேவை. இந்த ஹீட்மேப் வீடியோவின் ஒவ்வொரு வினாடிக்கும் தனித்துவமான பார்வையாளர்களைக் (unique viewers) காட்டுகிறது.

TrendVidStream-இல், நாங்கள் ஒவ்வொரு நாளும் 40 மில்லியன் நிகழ்வுகளை (events) செயலாக்குகிறோம். நாங்கள் PHP 8.4 மற்றும் Postgres ஆகிய எளிய தொழில்நுட்பக் கட்டமைப்பைப் (stack) பயன்படுத்துகிறோம்.

சிக்கல் என்பது கார்டினாலிட்டி (cardinality) தான். ஒவ்வொரு வினாடிக்கும் தனித்துவமான பார்வையாளர்களை எண்ணுவது கடினம்.

சாதாரண வழி:

  • ஒரு மூல நிகழ்வு அட்டவணையைப் (raw events table) பயன்படுத்துதல்.
  • COUNT(DISTINCT viewer_hash) என்பதை இயக்குதல்.
  • வீடியோ மற்றும் நேரக் தொகுதியின் (time bucket) அடிப்படையில் குழுவாக்குதல் (Group by).

இது விரைவாகத் தோல்வியடைந்தது. 90 நாட்களின் தரவுகளுக்கு, உங்களுக்கு 3.6 பில்லியன் வரிசைகள் (rows) தேவைப்படும். வினவல்கள் (queries) 9 வினாடிகள் எடுத்தன. மேலும், தனித்துவமான எண்ணிக்கையைத் தொகுக்க (roll up) முடியாது. "மணிநேரத்திற்குத் தனித்துவமானவர்கள்" என்பதைத் தரம் குறைத்து "நாளுக்குத் தனித்துவமானவர்கள்" என்று கூட்ட முடியாது, ஏனெனில் அதே நபர் இரண்டிலும் இடம்பெறக்கூடும்.

தீர்வு: HyperLogLog (HLL).

HLL ஒரு தரவுத்தொகுப்பின் (dataset) சிறிய "ஸ்கெட்ச்" (sketch)-ஐ உருவாக்குகிறது. எத்தனை மில்லியன் மக்கள் பார்த்தாலும், இது சுமார் 10 KB அளவில் மிகச் சிறியதாக இருக்கும்.

ஹீட்மேப்களுக்கு HLL ஏன் வேலை செய்கிறது:

  • நிலையான அளவு: இது சிறியதாகவே இருக்கும்.
  • இணைக்கக்கூடியது (Mergeable): உலகளாவிய எண்ணிக்கையைப் பெற நீங்கள் இரண்டு ஸ்கெட்ச்களை ஒன்றிணைக்கலாம் (union). இது rollup சிக்கலைத் தீர்க்கிறது.

எங்களது செயலாக்கம்:

நாங்கள் postgresql-hll விரிவாக்கத்தைப் (extension) பயன்படுத்துகிறோம். நாங்கள் இரண்டு அட்டவணைகளைப் பயன்படுத்துகிறோம்.

  1. ஒரு ஸ்டேஜிங் அட்டவணை (staging table): இது PHP மூலமான மூலத் துடிப்புகளை (raw heartbeats) எழுதும் ஒரு 'append-only' அட்டவணை. பதிவுகளை வேகமாக வைத்திருக்க நாங்கள் இங்கே குறியீடுகளை (indexes) பயன்படுத்துவதில்லை.
  2. ஒரு ஸ்கெட்ச் அட்டவணை (sketch table): இது HLL தரவைச் சேமிக்கிறது.

ஸ்டேஜிங் அட்டவணையிலிருந்து ஸ்கெட்ச் அட்டவணைக்குத் தரவை நகர்த்த நாங்கள் ஒரு cron job-ஐப் பயன்படுத்துகிறோம். நாங்கள் இந்த கட்டளையைப் பயன்படுத்துகிறோம்:

INSERT INTO video_heatmap (...)
SELECT ..., hll_add_agg(hll_hash_text(viewer_hash), 14, 5)
FROM beacon_staging
GROUP BY ...
ON CONFLICT (...)
DO UPDATE SET viewers = video_heatmap.viewers || EXCLUDED.viewers;

"||" ஆபரேட்டர் புதிய தரவை ஏற்கனவே உள்ள ஸ்கெட்ச்சுடன் இணைக்கிறது.

முடிவுகள்:

  • வினவல் வேகம்: எங்களது ஹீட்மேப் வினவல்கள் 15 முதல் 40 ms வரை மட்டுமே எடுத்துக் கொள்கின்றன. பழைய முறையில் 9 வினாடிகள் எடுத்தது.
  • சேமிப்பு: எங்களது 90-நாள் தரவுத்தொகுப்பு 40 GB ஆகும். பழைய முறையில் இது 1.2 TB எடுத்திருக்கும்.
  • துல்லியம்: நாங்கள் சுமார் 0.6% முதல் 1.4% வரை பிழையைக் காண்கிறோம். ஒரு ஹீட்மேப்பிற்கு இது மிகச் சரியானது.

கற்றுக்கொண்ட பாடங்கள்:

  • தரவுத்தளத்திற்குள்ளேயே (database) ஹாஷ் (hash) செய்யவும். உங்கள் செயலியில் (app) ஹாஷ் செய்ய வேண்டாம்.
  • உங்கள் புதுப்பிப்புகளைத் தொகுப்பாக (batch) செய்யவும். ஸ்கெட்ச்களை ஒவ்வொன்றாகப் புதுப்பிக்க வேண்டாம், இல்லையெனில் அது 'write hotspots'-ஐ உருவாக்கும்.
  • ஹாஷ்களுக்குத் தினசரி சால்ட் (salt)-ஐப் பயன்படுத்தவும். இது தனியுரிமையைப் பாதுகாக்கிறது மற்றும் உங்கள் தினசரி ஸ்கெட்ச்களைத் தூய்மையாக வைக்கிறது.

COUNT(DISTINCT) காரணமாக உங்கள் டேஷ்போர்டு (dashboard) மெதுவாக இருந்தால், உங்களுக்கு ஒரு பிரம்மாண்டமான டேட்டா வேர்ஹவுஸ் (data warehouse) தேவையில்லை. உங்களுக்கு HLL தேவை.

ஆதாரம்: https://dev.to/ahmet_gedik778845/building-per-second-video-heatmap-analytics-with-hyperloglog-in-postgres-2p22