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

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

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

प्रश्न

20-TiB की एक Parquet टेबल पर मुख्य रूप से `account_id` पर समानता (equality) के आधार पर क्वेरी की जाती है; वैल्यूज रो ग्रुप्स में बिखरी हुई हैं और स्कैन अभी भी महंगे हैं। आप Parquet Bloom फ़िल्टर का मूल्यांकन और रोलआउट कैसे करेंगे? फ़िल्टर कॉन्ट्रैक्ट, साइज़िंग, कम्पैटिबिलिटी और स्वीकृति मेट्रिक्स को समझाइए।

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

टेबल में भारी मात्रा में डेटा जोड़ा (append) जाता है और यह दिन के अनुसार पार्टिशन्ड है, लेकिन account_id क्लस्टर नहीं है। इक्वेलिटी क्वेरीज़ अक्सर 1% से काफी कम पंक्तियों से मेल खाती हैं। बताएं कि Bloom फ़िल्टर परिणामों को बदले बिना रो ग्रुप्स या पेजों को कैसे छोड़ (skip) सकते हैं, रीडर सपोर्ट को कैसे सत्यापित करें, और कब उनकी मेटाडेटा और राइट लागत बचत से अधिक हो जाती है। क्षमता और सेलेक्टिविटी इंटरव्यू के अनुमान हैं, सार्वभौमिक बेंचमार्क नहीं। मुख्य कौशल प्रोबेबिलिस्टिक फ़ाइल-लेआउट ऑप्टिमाइज़ेशन है, इसलिए यह data से संबंधित है।

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

मजबूत उत्तर एक प्रोबेबिलिस्टिक मेंबरशिप टेस्ट और एक सटीक इंडेक्स के बीच अंतर करते हैं: एक नकारात्मक (negative) परिणाम अनुपस्थिति को साबित करता है, जबकि एक सकारात्मक (positive) परिणाम केवल यूनिट को एक उम्मीदवार के रूप में रखता है। वे लक्षित कार्यान्वयन (implementation) द्वारा उपयोग की जाने वाली फ़िल्टर ग्रैन्युलैरिटी और ऑन-डिस्क स्थान की पहचान करते हैं, नल (nulls) और एन्कोडिंग को ध्यान में रखते हैं, और एक सामान्य-रीड फ़ॉलबैक बनाए रखते हैं। वे समान स्नैपशॉट, कैश स्थिति और रीडर वर्ज़न के साथ एक नियंत्रण प्रयोग (control experiment) का भी प्रस्ताव करते हैं।

पहले स्पष्ट करने योग्य प्रश्न

  • कौन सा इंजन Parquet Bloom फ़िल्टर को लिखता और पढ़ता है, और कौन से वर्ज़न डिप्लॉय किए गए हैं?
  • क्या प्रेडिकेट केवल इक्वेलिटी है, या IN सूचियों और नॉर्मलाइज़्ड कीज़ की आवश्यकता है?
  • क्या इस कार्यान्वयन में फ़िल्टर प्रति कॉलम चंक, रो ग्रुप या पेज से जुड़े हैं?
  • डिस्टिंक्ट-वैल्यू वितरण और अपेक्षित फॉल्स-पॉज़िटिव दर क्या है?
  • क्या पुराने रीडर समान परिणाम लौटाते हुए मेटाडेटा को अनदेखा कर सकते हैं?
  • क्या फ़ाइलें इम्यूटिएबल हैं, या कॉम्पेक्शन और रीराइट्स से निरंतर CPU लागत जुड़ेगी?

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

“मैं पहले एंड-टू-एंड राइटर और रीडर सपोर्ट की पुष्टि करूंगा और फ़िल्टर ऑफ़सेट और साइज़ के लिए नमूना फ़ूटर्स का निरीक्षण करूंगा। मैं केवल उच्च-सेलेक्टिविटी वाले इक्वेलिटी कॉलम के लिए फ़िल्टर सक्षम करूंगा, मापे गए वितरण से एक लक्षित फॉल्स-पॉज़िटिव दर चुनूंगा, और एक इंडेक्स-अक्षम (index-disabled) नियंत्रण रखूंगा। कैनरी के दौरान, मैं रो-ग्रुप/पेज रीड्स, बाइट्स, CPU, लेटेंसी, फ़िल्टर बाइट्स और सटीक परिणाम समानता की तुलना करूंगा। पॉज़िटिव परीक्षण अभी भी उम्मीदवार को पढ़ते हैं; केवल एक सिद्ध नेगेटिव ही इसे छोड़ (skip) सकता है। यदि सपोर्ट गायब है या स्कैन व्यापक हैं, तो फ़ॉलबैक सामान्य Parquet फ़िल्टरिंग ही रहेगा।”

चरण-दर-चरण उत्तर

चरण 1: क्षमता और ग्रैन्युलैरिटी स्थापित करें

उपयोग में आने वाली सटीक लाइब्रेरीज़ के लिए Apache Parquet Bloom-फ़िल्टर विनिर्देश और कार्यान्वयन मैट्रिक्स पढ़ें। सत्यापित करें कि राइटर फ़िल्टर को बनाए रखते हैं और रीडर प्रेडिकेट प्रकार के लिए उनसे परामर्श करते हैं। फ़िल्टर के ऑफ़सेट/लंबाई और उसके द्वारा सुरक्षित डेटा यूनिट को रिकॉर्ड करें; यह न मानें कि प्रत्येक इंजन समान ग्रैन्युलैरिटी का उपयोग करता है।

चरण 2: कॉलम चुनें और फ़िल्टर का आकार तय करें

प्रति सुरक्षित यूनिट डिस्टिंक्ट वैल्यूज और क्वेरी सेलेक्टिविटी का अनुमान लगाएं। एक स्पष्ट फॉल्स-पॉज़िटिव लक्ष्य से फ़िल्टर का आकार तय करें, फिर मेमोरी, फ़ूटर वृद्धि और राइट CPU को बेंचमार्क करें। बहुत छोटा फ़िल्टर कई पॉज़िटिव उत्पन्न करता है; एक ओवरसाइज़्ड फ़िल्टर व्यापक स्कैन में सुधार किए बिना मेटाडेटा I/O पर हावी हो सकता है।

चरण 3: प्रोबेबिलिस्टिक सेमेंटिक्स को सुरक्षित रखें

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

चरण 4: नियंत्रणों के साथ रोल आउट करें

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

चरण 5: स्वीकृति और रोलबैक को परिभाषित करें

परीक्षण की गई संरक्षित यूनिट्स, नेगेटिव्स, फॉल्स पॉज़िटिव्स, पढ़ी गई यूनिट्स, पढ़े गए बाइट्स, फ़िल्टर बाइट्स, CPU, p50/p95 लेटेंसी और राइट थ्रूपुट को ट्रैक करें। फ़िल्टर सक्षम और अक्षम होने पर पूर्ण परिणाम सेट, गणना और एग्रीगेट्स की तुलना करें। यदि परिणाम भिन्न होते हैं, मेटाडेटा ओवरहेड बढ़ता है, या स्किप अनुपात महत्वहीन है, तो राइट्स को रोलबैक करें या उपभोग (consumption) को अक्षम करें।

मॉडल उत्तर

“Bloom फ़िल्टर तब उपयोगी होते हैं जब इक्वेलिटी प्रेडिकेट्स सेलेक्टिव होते हैं और वैल्यूज बिखरी होती हैं। मैं डिप्लॉयड Parquet राइटर और रीडर सपोर्ट को सत्यापित करूंगा, फ़िल्टर ऑफ़सेट और ग्रैन्युलैरिटी का निरीक्षण करूंगा, और मापे गए फॉल्स-पॉज़िटिव लक्ष्य के आधार पर फ़िल्टर का आकार तय करूंगा। एक कैनरी पार्टीशन पर, मैं कोल्ड और वार्म कैश नियंत्रणों के तहत एक समान नो-फ़िल्टर कोहोर्ट की तुलना करूंगा। एक नेगेटिव मेंबरशिप टेस्ट यूनिट को छोड़ सकता है; एक पॉज़िटिव टेस्ट को अभी भी सटीक प्रेडिकेट निष्पादित करना चाहिए। फ़ूटर वृद्धि, CPU, राइट थ्रूपुट और p95 लेटेंसी की जांच करते हुए, मुझे समान परिणामों के साथ-साथ पढ़ी जाने वाली कम यूनिट्स और बाइट्स की आवश्यकता होगी। असमर्थित रीडर सामान्य रीड्स जारी रखते हैं, इसलिए डिप्लॉयमेंट क्षमता-जागरूक और प्रतिवर्ती (reversible) है।”

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

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

फॉलो-अप प्रश्न

फॉलो-अप 1: क्या फॉल्स पॉज़िटिव शुद्धता (correctness) को बदल सकता है?

नहीं। यह केवल अतिरिक्त रीड्स का कारण बनता है। शुद्धता केवल तभी विफल होती है जब कोई कार्यान्वयन पॉज़िटिव को प्रमाण के रूप में मानता है या विकृत मेटाडेटा के बावजूद नेगेटिव को मान्य मानता है।

फॉलो-अप 2: Bloom फ़िल्टर लिखना कब उचित नहीं है?

पूर्ण स्कैन, कम-सेलेक्टिविटी वाले प्रेडिकेट, छोटी फाइलें और फ़िल्टर को अनदेखा करने वाले रीडर्स को आमतौर पर बहुत कम लाभ मिलता है। फ़िल्टर बाइट्स और राइट CPU की तुलना मापी गई स्किप बचत से करें।

फॉलो-अप 3: आप एक गायब की (missing key) को कैसे मान्य करते हैं?

स्नैपशॉट से अनुपस्थित एक की का उपयोग करें और सत्यापित करें कि कई संरक्षित यूनिट्स नेगेटिव लौटाती हैं, फिर पुष्टि करें कि फ़िल्टर सक्षम और अक्षम दोनों के साथ पूर्ण क्वेरी परिणाम खाली है।

फॉलो-अप 4: क्या होगा यदि किसी रीडर में सपोर्ट की कमी है?

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

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

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