प्रॉम्प्ट और संदर्भ
एक लेकहाउस जॉब ऑब्जेक्ट स्टोरेज से Parquet पढ़ता है। क्रॉस-रीजन रेप्लिकेशन के बाद थोड़ी संख्या में फ़ाइलें करप्ट हो जाती हैं, लेकिन वर्तमान पाइपलाइन केवल पूरी फ़ाइल को पुनः प्रयास (retry) करती है। एक पेज-लेवल CRC प्लान डिज़ाइन करें: चेक किए गए बाइट्स को परिभाषित करें, कम्प्रेशन सीमाओं की व्याख्या करें, रीडर कम्पैटिबिलिटी बनाए रखें, खराब पेजों को अलग (isolate) करें, और स्वीकृति मेट्रिक्स चुनें। यह कॉलमर-फ़ाइल इंटीग्रिटी के बारे में एक data प्रश्न है।
इंटरव्यूअर क्या मूल्यांकन करता है
- फ़ाइल-लेवल चेक से पेज CRC को अलग पहचानना और यह जानना कि फ़ील्ड वैकल्पिक (optional) है।
- चेकसम स्कोप और कम्प्रेशन सीमा को सटीक रूप से बताना।
- जब पुराने रीडर्स CRC फ़ील्ड्स को अनदेखा करते हैं, तब रोलआउट डिज़ाइन करना।
- साइलेंट पार्शियल रीड्स को रोकना और आइसोलेशन, रेप्लिकेशन रिकवरी तथा रीराइट को अलग करना।
- सटीकता (correctness), लोकलाइज़ेशन समय और CPU/IO ओवरहेड को मापना।
पूछने के लिए स्पष्टीकरण प्रश्न
- क्या टारगेट राइटर और रीडर वर्ज़न पेज CRCs को लिखते और सत्यापित करते हैं?
- क्या करप्शन ऑब्जेक्ट स्टोरेज, रेप्लिकेशन या लोकल कैश द्वारा लाया गया है?
- क्या कम्प्रेशन, एन्क्रिप्शन या पेज इंडेक्स सक्षम हैं, और क्या रीडर column chunk का पता लगा सकता है?
- क्या प्रत्येक पंक्ति को रिकवर किया जाना चाहिए, या अपस्ट्रीम डेटा से पार्टीशन को फिर से बनाया जा सकता है?
- क्या रिट्रीज़ बार-बार उसी खराब ऑब्जेक्ट वर्ज़न को कैश कर सकती हैं?
30-सेकंड का उत्तर
"मैं सबसे पहले Parquet फॉर्मेट और सटीक रीडर वर्ज़न्स के आधार पर पेज-CRC सपोर्ट को सत्यापित करूँगा, जिसमें फ़ाइल वर्ज़न, row group, column chunk, पेज टाइप और ऑब्जेक्ट वर्ज़न रिकॉर्ड किया जाएगा। वेरिफिकेशन विफलता पर पंक्तियों को छोड़ने के बजाय ऑब्जेक्ट को क्वारंटीन करना चाहिए; रिकवरी एक मैचिंग रेप्लिका का प्रयास कर सकती है या अपस्ट्रीम से फिर से लिख सकती है। पुराने रीडर्स CRCs को अनदेखा कर सकते हैं, इसलिए वे पढ़ने योग्य बने रहते हैं लेकिन इंटीग्रिटी वेरिफिकेशन का दावा नहीं कर सकते। मैं डेटा पेजों, डिक्शनरी पेजों, हेडर्स और रेप्लिकेशन टेल्स में करप्शन इंजेक्ट करूँगा, फिर डिटेक्शन रेट, लोकलाइज़ेशन समय, रिट्री कॉस्ट और परिणाम समानता की तुलना करूँगा।"
डीप-डाइव उत्तर
स्टेप 1: फॉर्मेट बाउंड्री स्थापित करें
Parquet पेज हेडर्स में डेटा और डिक्शनरी पेजों जैसे पेज प्रकारों के लिए एक वैकल्पिक 32-बिट CRC फ़ील्ड शामिल होता है। पुष्टि करें कि राइटर इसे भरता है और रीडर इसे सत्यापित करता है; केवल राइटर-साइड कॉन्फ़िगरेशन परिवर्तन डाउनस्ट्रीम रीड्स को सुरक्षित नहीं बनाता है।
write page bytes -> compute CRC32 -> persist header and payload
read page -> read header -> verify payload CRC -> decodeडायग्नोस्टिक्स में ऑब्जेक्ट वर्ज़न, row group, column chunk और पेज ऑर्डिनल शामिल करें ताकि एक रिट्री साबित कर सके कि उसने उन्हीं बाइट्स को पढ़ा है।
स्टेप 2: कम्प्रेशन और चेकसम क्रम को तय करें
फॉर्मेट स्पेसिफिकेशन और इम्प्लीमेंटेशन CRC द्वारा कवर किए गए सटीक बाइट्स को परिभाषित करते हैं। एक राइटर/रीडर वर्ज़न मैट्रिक्स बनाए रखें और डिकोड किए गए लॉजिकल वैल्यूज़ पर कभी भी चेकसम का आविष्कार न करें। डीकम्प्रेशन विफलता और CRC मिसमैच अलग-अलग विफलता श्रेणियां हैं और इनके लिए अलग मेट्रिक्स की आवश्यकता होती है।
स्टेप 3: करप्शन को सुरक्षित रूप से आइसोलेट करें
विफलता पर, फ़ाइल रीड को फ़ेल करें और ऑब्जेक्ट को URI, वर्ज़न, पेज लोकेशन और एरर टाइप के साथ एक क्वारंटीन कतार में डालें। पेज को चुपचाप न छोड़ें। उपलब्ध होने पर मैचिंग रेप्लिका पढ़ें; यदि सभी प्रतियां विफल हो जाती हैं, तो उन्हीं बाइट्स को हमेशा के लिए रिट्री करने के बजाय पार्टीशन को रीराइट करें या अपस्ट्रीम डेटा को रीप्ले करें।
स्टेप 4: पुराने रीडर्स को संभालें
एक पुराना रीडर CRC फ़ील्ड को अनदेखा कर सकता है और पंक्तियाँ लौटा सकता है, इसलिए सफल डिकोडिंग इंटीग्रिटी को साबित नहीं करती है। रोलआउट के दौरान, एक रीडर कैपेबिलिटी मैट्रिक्स बनाए रखें। स्ट्रिक्ट रीडर्स महत्वपूर्ण वर्कलोड्स को मान्य करते हैं; पुराने रीडर्स को इंटीग्रिटी वेरिफिकेशन की कमी के रूप में लेबल किया जाता है, और एक सैम्पल्ड साइडकार चेक माइग्रेशन से पहले अंतर को उजागर कर सकता है।
स्टेप 5: CRC को एन्क्रिप्शन और पेज इंडेक्स से जोड़ें
एन्क्रिप्शन ऑथेंटिकेशन, कम्प्रेशन और CRC का क्रम टारगेट इम्प्लीमेंटेशन का पालन करना चाहिए। एक CRC कोई ऑथेंटिकेशन टैग नहीं है, और एक पेज इंडेक्स पेलोड बाइट्स को मान्य नहीं करता है। डायग्नोसिस के लिए column-chunk निर्देशांकों को बनाए रखते हुए, डिकोडिंग या प्रूनिंग से पहले फॉर्मेट-आवश्यक इंटीग्रिटी चेक को पूरा करें।
स्टेप 6: करप्शन-इंजेक्शन टेस्ट्स बनाएं
एक डेटा पेज में एक बाइट फ़्लिप करें, फिर डिक्शनरी पेज, पेज हेडर, फ़ाइल टेल और रेप्लिकेटेड ऑब्जेक्ट वर्ज़न को अलग-अलग डैमेज करें। कम्प्रैस्ड पेजों, नल-हैवी पेजों, खाली पेजों और बड़े पेजों को कवर करें। स्ट्रिक्ट रीडर के लोकेशन की पुष्टि करें और पुराने रीडर्स के व्यवहार को रिकॉर्ड करें।
स्टेप 7: दोहराने योग्य स्वीकृति को परिभाषित करें
समान ऑब्जेक्ट वर्ज़न, समवर्तीता (concurrency) और कोल्ड कैश के साथ, CPU, पढ़े गए बाइट्स, p95, डिटेक्शन रेट और लोकलाइज़ेशन समय के लिए CRC ऑन और ऑफ की तुलना करें। सही इनपुट्स के परिणाम बिल्कुल मेल खाने चाहिए; इंजेक्ट किया गया करप्शन विफल होना चाहिए और क्वारंटीन में जाना चाहिए। चेकसम विफलताओं, बार-बार के रिट्रीज़ और रिकवरी सफलता दर पर अलर्ट सेट करें।
मॉडल उत्तर
"मैं Parquet फॉर्मेट और टारगेट-रीडर इम्प्लीमेंटेशन से शुरू करूँगा ताकि यह पुष्टि की जा सके कि पेज CRC वैकल्पिक है, कौन से पेज प्रकार इसे ले जाते हैं, और सटीक बाइट रेंज क्या कवर की गई है। रीड्स डीकम्प्रेशन और डिकोडिंग से पहले CRC को सत्यापित करते हैं; डीकम्प्रेशन और चेकसम एरर्स अलग-अलग मेट्रिक्स हैं। एक खराब पेज फ़ाइल को फ़ेल करता है और क्वारंटीन करता है, फिर रिकवरी किसी अन्य रेप्लिका से उसी ऑब्जेक्ट वर्ज़न का उपयोग करती है या अपस्ट्रीम से रीराइट करती है। इसे पेज को छोड़ना नहीं चाहिए या किसी खराब ऑब्जेक्ट को अंतहीन रूप से रिट्री नहीं करना चाहिए।
पुराने रीडर्स CRC को अनदेखा कर सकते हैं, इसलिए मैं एक कैपेबिलिटी मैट्रिक्स प्रकाशित करूँगा और महत्वपूर्ण जॉब्स को स्ट्रिक्ट रीडर्स पर माइग्रेट करूँगा। बाइट-फ़्लिप, पेज-हेडर, डिक्शनरी-पेज और रेप्लिकेशन-ट्रंकेशन टेस्ट्स रोलआउट का विस्तार करने से पहले डिटेक्शन, लोकलाइज़ेशन, CPU, पढ़े गए बाइट्स, रिकवरी रेट और रिज़ल्ट हैश को मापते हैं।"
सामान्य गलतियां
- CRC को ऑथेंटिकेशन मानना → CRC रैंडम करप्शन का पता लगाता है, छेड़छाड़ का नहीं → आवश्यकता पड़ने पर ऑथेंटिकेटेड एन्क्रिप्शन या सिग्नेचर जोड़ें।
- केवल राइटर को बदलना → डाउनस्ट्रीम रीडर्स फ़ील्ड को अनदेखा कर सकते हैं → वर्ज़न मैट्रिक्स का परीक्षण करें।
- खराब पेज को छोड़ना → चुपचाप गायब पंक्तियों (silent missing rows) का कारण बनता है → फ़ेल करें और क्वारंटीन करें।
- एक ही ऑब्जेक्ट को हमेशा के लिए रिट्री करना → लागत बढ़ाता है → वर्ज़न को पिन करें और रिट्रीज़ को सीमित करें।
- केवल पूरी-फ़ाइल के नुकसान का परीक्षण करना → पेज और हेडर सीमाओं को छोड़ देता है → स्तरित करप्शन (layered corruption) इंजेक्ट करें।
- डिकोड और चेकसम त्रुटियों को मिलाना → रिकवरी को अस्पष्ट करता है → मेट्रिक्स और रनबुक्स को अलग करें।
फॉलो-अप प्रश्न और उत्तर
फॉलो-अप 1: क्या CRC दुर्भावनापूर्ण छेड़छाड़ को रोकता है?
नहीं। CRC आकस्मिक करप्शन का पता लगाता है। छेड़छाड़ प्रतिरोध (tamper resistance) के लिए ऑथेंटिकेटेड एन्क्रिप्शन, सिग्नेचर या ट्रस्टेड-स्टोरेज वेरिफिकेशन का उपयोग करें।
फॉलो-अप 2: क्या पुराने रीडर्स कम्पैटिबिलिटी तोड़ते हैं?
वे आमतौर पर फॉर्मेट को डिकोड करने में सक्षम रहते हैं, लेकिन वे यह दावा नहीं कर सकते कि CRC सत्यापित किया गया था। महत्वपूर्ण जॉब्स को स्ट्रिक्ट रीडर्स का उपयोग करना चाहिए।
फॉलो-अप 3: क्या आप केवल खराब पेज को फिर से पढ़ सकते हैं?
एक रेंज रीड या मैचिंग रेप्लिका का प्रयास करें, लेकिन पूरे परिणाम को मान्य करें। यदि कोई सत्यापित प्रति मौजूद नहीं है, तो अपस्ट्रीम डेटा को फिर से लिखें या रीप्ले करें।
फॉलो-अप 4: ऑब्जेक्ट वर्ज़न्स को क्यों रिकॉर्ड करें?
रिट्री के दौरान किसी ऑब्जेक्ट को ओवरराइट किया जा सकता है। वर्ज़न आइडेंटिफ़ायर एरर और रिकवरी एक्शन को एक बाइट सीक्वेंस से जोड़ते हैं।
फॉलो-अप 5: आप ओवरहेड को कैसे नियंत्रित करते हैं?
यथार्थवादी पेज आकारों और समवर्तीता के साथ CPU, थ्रूपुट और p95 को बेंचमार्क करें, फिर व्यापक रोलआउट से पहले उच्च-जोखिम वाले पार्टीशन पर कैनरी डिप्लॉयमेंट करें।