प्रतिनिधि इंटरव्यू विषय

डेटा इंजीनियरिंग इंटरव्यू: डिस्ट्रिब्यूटेड यूनिक काउंट्स के लिए आप HyperLogLog का उपयोग कैसे करेंगे?

डेटाकठिन
Offer.cc संपादकीय टीमप्रकाशित अपडेट किया गया

प्रश्न

एक इवेंट प्लेटफ़ॉर्म प्रतिदिन अरबों विज़िट इनजेस्ट करता है और उसे प्रति घंटे, टेनेंट और क्षेत्र के अनुसार यूनिक-यूज़र काउंट्स का उत्तर देना होगा। एक सटीक बेसलाइन और एक HyperLogLog सन्निकटन (approximation) डिज़ाइन करें, फिर त्रुटि, मर्जिंग, विलंबित इवेंट्स, गोपनीयता और सत्यापन की व्याख्या करें।

प्रॉम्प्ट और दायरा

यह डेटा-इंजीनियरिंग और स्ट्रीम-प्रोसेसिंग इंटरव्यू का प्रश्न है। प्लेटफ़ॉर्म अरबों इवेंट्स इनजेस्ट करता है, घंटे, टेनेंट और क्षेत्र के अनुसार क्वेरी करता है, और डैशबोर्ड के लिए लगभग 1% सापेक्ष त्रुटि (relative error) की अनुमति देता है। बिलिंग, कोटा प्रवर्तन और ऑडिट रिपोर्ट के लिए अभी भी सटीक मानों की आवश्यकता होती है। त्रुटि बजट, विंडो प्रकार, विलंबता सीमा (lateness bound), सेट ऑपरेशन्स की आवश्यकता, और क्या पहचानकर्ता व्यक्तिगत डेटा है, इसे स्पष्ट करें।

प्रश्न बैंक में पहले से ही स्ट्रीमिंग, हॉट पार्टिशन और बैच-बनाम-स्ट्रीम आर्किटेक्चर शामिल हैं। यह प्रॉम्प्ट किसी एक डेटाबेस उत्पाद के बजाय इस बात पर केंद्रित है कि कैसे एक मर्ज करने योग्य कार्डिनैलिटी स्केच डिस्ट्रिब्यूटेड डिस्टिंक्ट-काउंट लागत को बदलता है।

इंटरव्यूअर क्या मूल्यांकन करता है

  • क्या आप HLL को Bloom फ़िल्टर या Count-Min Sketch मानने के बजाय कार्डिनैलिटी, सदस्यता (membership) और आवृत्ति (frequency) में अंतर करते हैं।
  • क्या आप स्थानीय अनुमानों को जोड़ने के बजाय प्रति शार्ड निश्चित आकार के स्केच और रजिस्टर-वार अधिकतम मर्जिंग की व्याख्या करते हैं।
  • क्या आप त्रुटि, विलंबता, रीसेट, गोपनीयता और व्यावसायिक सटीकता को परीक्षण योग्य अनुबंधों में बदलते हैं।

एक कमजोर उत्तर कहता है "Redis HLL का उपयोग करें क्योंकि यह छोटा है।" एक मजबूत उत्तर एक सटीक बेसलाइन देता है, सन्निकटन विफलता मोड का नाम बताता है, और रीप्ले, सैंपलिंग और ड्रिफ्ट मॉनिटरिंग को परिभाषित करता है।

उत्तर देने से पहले स्पष्टीकरण

  1. कितनी त्रुटि स्वीकार्य है? एक डैशबोर्ड लगभग 1% स्वीकार कर सकता है; बिलिंग या अनुपालन रिपोर्टिंग के लिए एक सटीक पथ या कैलिब्रेटेड समाधान (reconciliation) पथ की आवश्यकता होती है।
  2. क्या क्वेरी निश्चित विंडो हैं या मनमानी रेंज? प्रति घंटा स्केच निश्चित बकेट के लिए उपयुक्त हैं; मनमानी रेंज के लिए स्पष्ट सीमाओं और प्रतिधारण (retention) के साथ मर्ज करने योग्य बकेट की आवश्यकता होती है।
  3. इवेंट कितनी देर से आ सकते हैं? विलंबता सीमा यह निर्धारित करती है कि बकेट को फिर से खोलना है, रॉ इवेंट्स को बनाए रखना है, या अंतिम वॉटरमार्क स्वीकार करना है।
  4. क्या इंटरसेक्शन, अंतर या सदस्यों की सूची आवश्यक है? HLL यूनियन कार्डिनैलिटी के लिए मजबूत है; सदस्यता, इंटरसेक्शन या विलोपन के लिए किसी अन्य संरचना या सटीक पुनर्गणना की आवश्यकता होती है।

30-सेकंड का उत्तर

"मैं शुद्धता बेसलाइन के रूप में एक सटीक सेट रखूँगा, लेकिन इसकी मेमोरी, नेटवर्क शफल और क्रॉस-शार्ड मर्ज लागत यूनिक यूज़र्स के साथ बढ़ती है। यदि डैशबोर्ड लगभग 1% त्रुटि स्वीकार करता है, तो प्रत्येक शार्ड घंटे, टेनेंट और क्षेत्र द्वारा कीड (keyed) एक निश्चित-परिशुद्धता HyperLogLog बनाए रखता है। क्वेरी समय पर मैं स्केच में रजिस्टर-वार अधिकतम लेता हूँ और एक एस्टीमेटर चलाता हूँ; मैं कभी भी स्थानीय अनुमानों को नहीं जोड़ता। HLL अनुमानित यूनियन कार्डिनैलिटी का उत्तर देता है, सदस्यता, विलोपन या पहचान सूची का नहीं। मैं बकेट को बंद करने, सीमित विलंबता को स्वीकार करने और पुराने सुधारों को सटीक रीप्ले में भेजने के लिए इवेंट टाइम और वॉटरमार्क का उपयोग करता हूँ। अंत में, मैं सटीक काउंट्स के विरुद्ध सैंपल किए गए बंद बकेट का समाधान करता हूँ और सापेक्ष त्रुटि, खाली बकेट, डुप्लिकेट, स्केच मर्ज और गोपनीयता जोखिम की निगरानी करता हूँ।"

चरण-दर-चरण विस्तृत उत्तर

चरण 1: सटीक बेसलाइन बनाएं।

प्रत्येक (hour, tenant, region) के लिए एक यूज़र-ID सेट संग्रहीत करें। यह सटीक है, लेकिन शार्ड्स को कई ID भेजने होंगे या ग्लोबल शफल करना होगा। स्थानीय COUNT(DISTINCT) मानों को जोड़ने से कई शार्ड्स पर मौजूद उपयोगकर्ता की दोबारा गिनती (double-counting) हो जाती है।

चरण 2: HLL स्थिति का वर्णन करें।

एक स्थिर हैश को एक रजिस्टर इंडेक्स और एक लीडिंग-ज़ीरो रैंक में विभाजित करें। प्रत्येक इनपुट केवल अपने रजिस्टर को अधिकतम रैंक के साथ अपडेट करता है। एस्टीमेटर सभी रजिस्टरों से कार्डिनैलिटी निकालता है और छोटी-रेंज के सुधार लागू करता है। सटीकता, हैश व्यवहार और एस्टीमेटर रेंज का नाम दिए बिना सार्वभौमिक त्रुटि का वादा न करें।

चरण 3: डिस्ट्रिब्यूटेड मर्जिंग की व्याख्या करें।

एक आयाम (dimension) के स्केच के लिए समान रजिस्टर संख्या, हैश परिपाटी (convention) और एन्कोडिंग का उपयोग किया जाना चाहिए। अनुमानों को जोड़ने के बजाय, प्रत्येक रजिस्टर में अधिकतम लेकर मर्ज करें। इसलिए मिनट के स्केच रॉ ID को शफल किए बिना प्रति घंटा उत्तरों में रोल हो सकते हैं।

text
for each event(user_id, bucket, tenant, region):
    i, rank = hash_and_rank(user_id, precision)
    sketch[bucket, tenant, region][i] = max(sketch[...][i], rank)

merged[i] = max(sketch_a[i], sketch_b[i])
estimate = hll_estimator(merged)

चरण 4: विलंबता और विंडो को संभालें।

इवेंट समय के अनुसार बकेट बनाएं और बकेट को अंतिम चिह्नित करने के लिए वॉटरमार्क का उपयोग करें। केवल अधिकतम विलंबता सीमा के भीतर अपडेट स्वीकार करें; पुराने इवेंट्स को रॉ-लॉग रीप्ले या सटीक सुधार तालिका में भेजें। HLL एक उपयोगकर्ता को नहीं हटा सकता है, इसलिए किसी इवेंट को रद्द करने के लिए प्रभावित बकेट को फिर से बनाना आवश्यक है।

चरण 5: अनुमानित परिणामों को व्यावसायिक शुद्धता से अलग करें।

एक समाधान कार्य (reconciliation job) बंद बकेट का सैंपल लेता है और एक सटीक सेट या ऑफ़लाइन SQL के साथ सत्य की गणना करता है। सापेक्ष त्रुटि, पूर्वाग्रह की दिशा और विसंगतियों वाले आयामों को रिकॉर्ड करें। बिलिंग, कोटा और गोपनीयता विलोपन के लिए सटीक लेज़र रखें; कम लागत वाले अवलोकन या अनुमान के लिए स्केच का उपयोग करें।

चरण 6: लागत और गोपनीयता को नियंत्रित करें।

आयाम संयोजनों, बकेट प्रतिधारण और प्रति टेनेंट स्केच को सीमित करें ताकि उच्च-कार्डिनैलिटी लेबल अनबाउंड स्थिति न बना सकें। हैश इनपुट को लगातार सामान्य करें और कुंजी रोटेशन प्रबंधित करें; स्केच एक्सेस को अधिकृत करें। एक स्केच कोई अनामीकरण (anonymization) गारंटी नहीं है क्योंकि कुल आकार अभी भी किसी समूह को प्रकट कर सकता है।

उच्च गुणवत्ता वाला नमूना उत्तर

"मैं सबसे पहले पूछूँगा कि क्या परिणाम अनुमानित हो सकता है। सटीक सेट बिलिंग और ऑडिट के लिए उपयुक्त हैं, लेकिन शार्ड्स और लंबी विंडो में अरबों इवेंट्स मेमोरी और शफल को महंगा बनाते हैं। लगभग 1% सहनशीलता वाले डैशबोर्ड के लिए, प्रत्येक शार्ड समय बकेट और आयाम के अनुसार समान रूप से कॉन्फ़िगर किया गया HLL बनाए रखता है। एक स्थिर हैश एक रजिस्टर को अपडेट करता है, और क्वेरी एस्टीमेटर चलाने से पहले रजिस्टर-वार अधिकतम लेती है; स्थानीय अनुमानों को जोड़ने से उपयोगकर्ताओं की दो बार गिनती होगी।

मैं वॉटरमार्क के साथ इवेंट-टाइम बकेट को बंद करता हूँ और एक सीमित विलंबता विंडो रखता हूँ। उस विंडो के बाहर के सुधार रॉ-लॉग रीप्ले के माध्यम से जाते हैं क्योंकि HLL एक तत्व को हटा नहीं सकता है। मेटाडेटा सटीकता, हैश परिपाटी और बकेट सीमाओं को रिकॉर्ड करता है ताकि स्केच मर्ज करने योग्य बने रहें। मैं स्केच आकार, मर्ज लेटेंसी, डुप्लिकेट दर और सापेक्ष त्रुटि की निगरानी करता हूँ, और सटीक सेट के साथ सैंपल किए गए बकेट का समाधान करता हूँ। बिलिंग और अनुपालन विलोपन सटीक बने रहते हैं; HLL एक एनालिटिक्स त्वरण परत है।"

सामान्य गलतियाँ

  • शार्ड अनुमानों को जोड़ना → एक ही उपयोगकर्ता कई शार्ड्स पर दिखाई दे सकता है → रजिस्टरों को मर्ज करें, फिर एक बार अनुमान लगाएं।
  • यह दावा करना कि HLL उत्तर दे सकता है कि कोई उपयोगकर्ता दिखाई दिया या नहीं → यह एक सांख्यिकीय सारांश संग्रहीत करता है → सदस्यता के लिए एक सेट या Bloom फ़िल्टर का उपयोग करें और फ़ॉल्स पॉज़िटिव बताएं।
  • स्केच से विलंबित या हटाए गए इवेंट को घटाना → रजिस्टर अधिकतम का कोई प्रतिवर्ती (reversible) योगदानकर्ता नहीं होता है → बकेट को फिर से बनाएं या एक सटीक सुधार तालिका का उपयोग करें।
  • मनमानी सटीकता या हैश प्रारूपों को मर्ज करना → रजिस्टर के अर्थ भिन्न होते हैं → सटीकता, हैश, एन्कोडिंग और संस्करण मेटाडेटा संग्रहीत करें।
  • स्केच को गोपनीयता सुरक्षा के रूप में मानना → समग्र आकार अभी भी समूह की जानकारी लीक कर सकता है → प्राधिकरण, न्यूनतम आयाम, प्रतिधारण और गोपनीयता समीक्षा को संयोजित करें।

फ़ॉलो-अप और प्रतिक्रियाएँ

फ़ॉलो-अप 1: व्यवसाय किसी भी 37-दिन की सीमा के लिए पूछता है। आप इसे कैसे बकेट करते हैं?

मिनट के स्केच अधिक स्थिति बनाते हैं, लेकिन एक क्वेरी निरंतर मिनटों को मर्ज कर सकती है; प्रति घंटा और दैनिक स्केच लंबी सीमाओं के लिए रीड्स को कम करते हैं। बहु-स्तरीय बकेट को स्पष्ट, गैर-अतिव्यापी (non-overlapping) सीमाओं की आवश्यकता होती है। योजनाकार सबसे मोटे गैर-अतिव्यापी संयोजन को चुनता है और महीन बकेट के साथ क्रॉस-लेवल किनारों को भरता है।

फ़ॉलो-अप 2: एक उपयोगकर्ता विलोपन 24 घंटे के भीतर प्रभावी होना चाहिए। क्या HLL रह सकता है?

HLL प्रति-उपयोगकर्ता विलोपन नहीं कर सकता। एक मिटाने योग्य सटीक इवेंट इंडेक्स या एन्क्रिप्टेड मैपिंग रखें, प्रभावित बकेट को फिर से बनाएं, और डैशबोर्ड परत पर पुराने संस्करणों को छिपाएं; स्केच को गैर-आधिकारिक मानें। यदि विनियमन के लिए विलोपन साक्ष्य की आवश्यकता है, तो सटीक विलोपन लेज़र और रीप्ले सत्यापन का उपयोग करें।

फ़ॉलो-अप 3: मर्ज के बाद त्रुटि 1% से बढ़कर 8% हो जाती है। आप सबसे पहले क्या निरीक्षण करते हैं?

स्केच मेटाडेटा की तुलना करें: सटीकता, हैश सीड, रजिस्टर एन्कोडिंग और संस्करण। जांचें कि क्या किसी शार्ड ने रजिस्टरों के बजाय किसी अनुमान को सीरियलाइज़ किया है, एक ही इनपुट को दो बार मर्ज किया है, या असामान्य हैश वितरण प्राप्त किया है। एस्टीमेटर या सीरियलाइज़ेशन दोषों को अलग करने के लिए एक शार्ड, दो शार्ड्स और एक मर्ज के साथ चरण दर चरण एक छोटे सेट को पुन: प्रस्तुत करें।

सार्वजनिक स्रोत

संबंधित प्रश्न