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

डेटा इंजीनियरिंग इंटरव्यू: आप ORC Bloom-filter इंडेक्स को कैसे ट्यून करेंगे?

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

प्रश्न

एक ORC फैक्ट टेबल इक्वैलिटी फ़िल्टर के लिए बहुत अधिक stripes स्कैन करती है। आप Bloom-filter कॉलम कैसे चुनेंगे, फॉल्स-पॉजिटिव दर कैसे निर्धारित करेंगे, और यह कैसे साबित करेंगे कि इंडेक्स स्कैनिंग को कम करता है?

प्रॉम्प्ट और संदर्भ

एक ORC फैक्ट टेबल दिनांक के अनुसार partitioned है और प्रत्येक फ़ाइल में कई stripes हैं। यूज़र्स अक्सर इक्वैलिटी के लिए customer_id और device_id द्वारा फ़िल्टर करते हैं, लेकिन राइट थ्रूपुट गिर रहा है और कुछ क्वेरीज़ अभी भी बहुत अधिक डेटा स्कैन करती हैं। समझाएं कि ORC min/max आँकड़े, row indexes, और Bloom filters क्या छोड़ (skip) सकते हैं, आप कॉलम और फॉल्स-पॉजिटिव दर कैसे चुनेंगे, और आप परिणाम को कैसे बेंचमार्क करेंगे।

इंटरव्यूअर क्या टेस्ट कर रहा है

  • ORC फ़ाइल, stripe, और row-index स्तरों और predicate pushdown की सीमाओं की समझ।
  • यह जानना कि एक Bloom filter फॉल्स पॉजिटिव दे सकता है लेकिन उसे मौजूद मान को अस्वीकार नहीं करना चाहिए।
  • कॉलम कार्डिनैलिटी, इक्वैलिटी सेलेक्टिविटी, राइट CPU, मेटाडेटा आकार, और क्वेरी बचत को जोड़ना।
  • कॉन्फ़िगरेशन डिफ़ के बजाय छोड़े गए stripes, पढ़े गए बाइट्स, फ़िल्टर हिट दर, और एंड-टू-एंड लेटेंसी के साथ वैल्यू साबित करना।

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

  1. क्या क्वेरीज़ मुख्य रूप से अत्यधिक सेलेक्टिव इक्वैलिटी प्रेडिकेट्स हैं, या रेंज, ऑर्डरिंग, और प्रीफ़िक्स हैं?
  2. customer_id और device_id की प्रति-stripe कार्डिनैलिटी, डुप्लिकेशन, और वितरण क्या हैं?
  3. क्या रीडर और राइटर ORC Bloom-filter इंडेक्स और लक्षित संस्करण के गुणों का समर्थन करते हैं?
  4. राइट लेटेंसी, फ़ाइल आकार, और ऑब्जेक्ट-स्टोर अनुरोधों के लिए क्या बजट हैं?
  5. क्या कोई सॉल्टिंग, हैशिंग, या प्राइवेसी आवश्यकताएं हैं जो इंडेक्स में रॉ मानों को प्रतिबंधित करती हैं?

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

मैं पहले प्रेडिकेट्स को अलग करूँगा: min/max ऑर्डर्ड रेंज के लिए उपयुक्त है, row indexes मिलान को एक छोटे रो ग्रुप तक सीमित करते हैं, और Bloom filters सेलेक्टिव इक्वैलिटी जांच में मदद करते हैं। मैं पहले customer_id जैसे मापने योग्य कॉलम के लिए फ़िल्टर सक्षम करूँगा, फिर राइट एम्प्लीफिकेशन को मापते हुए लक्षित रीडर पर डिफ़ॉल्ट फॉल्स-पॉजिटिव दर की तुलना कम दर से करूँगा। बेंचमार्क छोड़े गए stripes, पढ़े गए बाइट्स, CPU, फ़ाइल आकार, और p95 लेटेंसी को रिकॉर्ड करेगा, और यह सत्यापित करने के लिए कि कोई पंक्ति नहीं छूटी है, रैंडम अनुपस्थित मानों और उपस्थित मानों दोनों का उपयोग करेगा।

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

चरण 1: तीन इंडेक्स प्रकारों को जिम्मेदारियां सौंपें

ORC फ़ाइल, stripe, और row-index स्तरों पर हल्के इंडेक्स संग्रहीत करता है। Min/max एक कॉलम रेंज रिकॉर्ड करता है और ऐसे stripe को अस्वीकार कर सकता है जो किसी रेंज प्रेडिकेट को प्रतिच्छेद नहीं कर सकता; row indexes खोज को एक निश्चित रो ग्रुप तक सीमित करते हैं। एक Bloom filter बताता है कि एक मान उस इंडेक्स रेंज में हो सकता है, इसलिए यह इक्वैलिटी प्रेडिकेट के लिए अनुपस्थित माने जाने वाले मान को अस्वीकार कर सकता है, लेकिन यह वास्तव में अनुपस्थित रेंज को बनाए रख सकता है।

चरण 2: प्रेडिकेट्स और वितरण से कॉलम चुनें

उन कॉलम्स को प्राथमिकता दें जो बार-बार इक्वैलिटी फ़िल्टर प्राप्त करते हैं, प्रति stripe कई भिन्न मान रखते हैं, और वास्तविक क्वेरीज़ से stripes को हटा सकते हैं। कम कार्डिनैलिटी वाला कॉलम, या लगभग हर stripe में मौजूद कॉलम, बहुत कम प्रूनिंग के साथ राइट और मेटाडेटा लागत जोड़ता है। रेंज, ऑर्डरिंग, और एग्रीगेशन के लिए केवल एक Bloom filter के बजाय पार्टिशन, सॉर्टिंग, min/max आँकड़े, या एक विशेष इंडेक्स की आवश्यकता होती है।

चरण 3: फॉल्स-पॉजिटिव बजट सेट करें

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

चरण 4: राइट और रीड पाथ सत्यापित करें

पुष्टि करें कि राइटर लक्षित कॉलम के लिए Bloom-filter इंडेक्स बनाता है और रीडर predicate pushdown के दौरान उनका उपयोग करता है। यदि कोई प्रॉपर्टी परिवर्तन केवल नई फ़ाइलों को प्रभावित करता है, तो पुरानी और नई फ़ाइल कवरेज को अलग करें। क्वेरी प्लान या इंजन मेट्रिक्स को इंडेक्स रीड, छोड़े गए stripes, और स्कैन की गई अंतिम पंक्तियों को उजागर करना चाहिए; उन संकेतों के बिना, यह दावा न करें कि फ़िल्टर सक्रिय है।

चरण 5: एक नियंत्रित बेंचमार्क बनाएं

चार वर्कलोड तैयार करें: उपस्थित मान, रैंडम अनुपस्थित मान, कम-सेलेक्टिविटी मान, और रेंज प्रेडिकेट्स। पार्टिशन, फ़ाइल आकार, कैश स्थिति, और कॉनकरेंसी को स्थिर रखें। फ़िल्टर अक्षम, डिफ़ॉल्ट फॉल्स-पॉजिटिव दर, और उम्मीदवार दरों की तुलना करें, जबकि स्कैन किए गए stripes, पढ़े गए बाइट्स, डिकम्प्रेस्ड बाइट्स, CPU, p50/p95 लेटेंसी, राइट समय, और फ़ाइल आकार को रिकॉर्ड करें। प्रत्येक वर्कलोड को दोहराएं और कोल्ड-कैश और वार्म-कैश दोनों परिणामों की रिपोर्ट करें।

चरण 6: इवोल्यूशन और ऑपरेशंस को संभालें

कॉलम जोड़ने या सॉर्ट क्रम बदलने के बाद प्रति-stripe कार्डिनैलिटी और सेलेक्टिविटी का पुनर्मूल्यांकन करें। कॉम्पैक्शन, मर्जिंग, और रीराइट्स इंडेक्स की गुणवत्ता को बदलते हैं, इसलिए इंडेक्स प्रॉपर्टीज को टेबल मेटाडेटा और रिलीज़ मेनिफेस्ट में रिकॉर्ड करें। मेटाडेटा शेयर, राइट विफलताओं, स्कैन एम्प्लीफिकेशन, और रीडर-वर्जन अंतरों की निगरानी करें। यदि कोई रीडर Bloom filters का समर्थन नहीं करता है, तो एक सुरक्षित फ़ॉलबैक स्कैन करना है, डेटा को छोड़ना नहीं।

चरण 7: शुद्धता और गोपनीयता सीमाओं को सत्यापित करें

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

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

मैं पहले min/max, row indexes, और Bloom filters को अलग करूँगा, फिर customer_id का चयन करूँगा क्योंकि वास्तविक इक्वैलिटी क्वेरीज़ उच्च प्रति-stripe सेलेक्टिविटी दिखाती हैं; मैं कम कार्डिनैलिटी वाले कॉलम्स के लिए आँख मूंदकर फ़िल्टर सक्षम नहीं करूँगा। मैं राइटर CPU, फ़ाइल आकार, छोड़े गए stripes, पढ़े गए बाइट्स, और p95 लेटेंसी को मापते हुए डिफ़ॉल्ट दर और क्रमिक रूप से कम दरों का बेंचमार्क करूँगा। बेंचमार्क में उपस्थित, अनुपस्थित, कम-सेलेक्टिविटी, और रेंज क्वेरीज़ शामिल होंगी और रीडर प्लान से सत्यापित किया जाएगा कि फ़िल्टर का उपयोग किया जा रहा है। एक मिश्रित पुराने/नए रोलआउट के दौरान मैं फ़ाइल संस्करण द्वारा मेट्रिक्स को विभाजित करूँगा और जब कोई इंडेक्स गायब या असमर्थित हो तो स्कैनिंग पर फ़ॉलबैक करूँगा। अंत में, मैं शुद्धता के नमूनों के साथ साबित करूँगा कि कोई फॉल्स नेगेटिव नहीं है और जांच करूँगा कि संवेदनशील मान इंडेक्स, लॉग या कैश के माध्यम से उजागर नहीं होते हैं।

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

  • Bloom filter को एक सटीक इंडेक्स के रूप में मानना जो प्रत्येक मिलान वाली पंक्ति लौटाता है।
  • राइट एम्प्लीफिकेशन को मापे बिना इसे हर कम-कार्डिनैलिटी या सर्वव्यापी कॉलम पर सक्षम करना।
  • एक रेंज क्वेरी को Bloom-filter वैल्यू के प्रमाण के रूप में उपयोग करना और इसे min/max आँकड़ों के साथ भ्रमित करना।
  • छोड़े गए stripe और पढ़े गए बाइट्स के मेट्रिक्स के बिना केवल कुल लेटेंसी को देखना, जिससे कैश प्रभाव अस्पष्ट रह जाते हैं।
  • एक असमर्थित रीडर द्वारा डेटा को स्कैन करने के बजाय उसे छोड़ देना, जिससे फॉल्स नेगेटिव उत्पन्न होते हैं।

फॉलो-अप प्रश्न और उत्तर

फॉलो-अप 1: फॉल्स पॉजिटिव के कारण पंक्तियाँ गायब क्यों नहीं होती हैं?

फ़िल्टर केवल उस रेंज को अस्वीकार करता है जिसमें मान न होने का प्रमाण हो। एक फॉल्स पॉजिटिव एक अनुपस्थित रेंज को बनाए रखता है, जिसे बाद में ORC स्कैन द्वारा जांचा जाता है। यह प्रदर्शन को बदलता है, सही परिणाम को नहीं।

फॉलो-अप 2: आप कैसे तय करते हैं कि कोई कॉलम फ़िल्टर के योग्य है या नहीं?

प्रति-stripe मान कवरेज और क्वेरी सेलेक्टिविटी को मापें, देखें कि अनुपस्थित मान कितने stripes को समाप्त करते हैं, और बचाई गई रीड लागत की तुलना राइटर CPU, मेटाडेटा स्पेस, और फ़ाइल-लाइफ़साइकिल लागत से करें। बिना मापी गई बचत वाले कॉलम को डिफ़ॉल्ट रूप से सक्षम नहीं किया जाना चाहिए।

फॉलो-अप 3: फ़िल्टर पार्टिशन और सॉर्टिंग के साथ कैसे काम करते हैं?

पार्टिशन पहले फ़ाइल सेट को कम करते हैं; सॉर्टिंग और min/max stripes को कम करते हैं; Bloom filters कम ऑर्डर्ड डेटा के लिए एक इक्वैलिटी जांच जोड़ते हैं। एक ही बेंचमार्क में प्रत्येक लेयर को अक्षम करके दिखाएं कि लाभ पार्टिशन परिवर्तन के बजाय इच्छित लेयर से आता है।

फॉलो-अप 4: क्या होगा यदि पुरानी और नई ORC फ़ाइलें विभिन्न मापदंडों का उपयोग करती हैं?

राइटर संस्करण द्वारा मेट्रिक्स को विभाजित करें और रीडर्स को जो भी इंडेक्स मौजूद है उसका उपयोग करने दें; बिना फ़िल्टर वाली फ़ाइलों को स्कैन करें। माइग्रेशन के दौरान यह माने बिना कि प्रत्येक फ़ाइल में समान फॉल्स-पॉजिटिव दर है, रीराइट्स या मर्ज के माध्यम से धीरे-धीरे सामान्य करें।

फॉलो-अप 5: आप इंडेक्स-पैरामीटर परिवर्तन कैसे रिलीज़ करते हैं?

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

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

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