कम विलंबता के साथ एक OLTP डेटाबेस (जैसे, Oracle, PostgreSQL, MySQL) से BigQuery में परिवर्तनों को लगातार दोहराएं (replicate)।
→Change Data Capture (CDC) करने के लिए Datastream का उपयोग करें। इसे सीधे BigQuery पर परिवर्तनों को स्ट्रीम करने के लिए कॉन्फ़िगर करें, जो अपनी `MERGE` क्षमता का उपयोग करके उन्हें लागू करता है।
क्यों: Datastream एक प्रबंधित, सर्वरलेस CDC सेवा है जो कस्टम पाइपलाइन या महत्वपूर्ण स्रोत डेटाबेस लोड की आवश्यकता के बिना रियल-टाइम डेटाबेस रेप्लिकेशन को सरल बनाती है।
संदर्भ↗
एक Dataflow स्ट्रीमिंग पाइपलाइन को सटीक इवेंट-टाइम विंडो वाले परिणाम उत्पन्न करने चाहिए, भले ही कुछ इवेंट घंटों देर से आएं।
→विलंब को समायोजित करने के लिए `allowedLateness` के साथ इवेंट-टाइम विंडोज़ कॉन्फ़िगर करें। प्रारंभिक परिणामों के लिए शुरुआती फ़ायरिंग और देर से आए डेटा को शामिल करने के लिए संचित फ़ायर्ड पेन्स के साथ ट्रिगर्स का उपयोग करें।
क्यों: Dataflow का वॉटरमार्क, ट्रिगर्स और अनुमत विलंब का मॉडल आउट-ऑफ-ऑर्डर डेटा से निपटने के दौरान पूर्णता और विलंबता को संतुलित करने के लिए एक मजबूत ढांचा प्रदान करता है।
BigQuery में लिखने वाली एक Dataflow पाइपलाइन को रीस्टार्ट या क्षणिक विफलताओं के बाद डुप्लिकेट का अनुभव होता है।
→BigQuery Storage Write API सिंक (`STORAGE_WRITE_API`) का उपयोग करें जिसमें विधि को `at-least-once` (डिफ़ॉल्ट, पहले `STREAMING_INSERTS`) या `exactly-once` (`COMMITTED` मोड) पर सेट किया गया हो।
क्यों: `COMMITTED` मोड में Storage Write API स्ट्रीमिंग के लिए बिल्ट-इन `exactly-once` सिमेंटिक्स प्रदान करता है, जिससे कस्टम deduplication लॉजिक की आवश्यकता समाप्त हो जाती है।
Dataflow का उपयोग करके एक पेजिनटेड, रेट-लिमिटेड REST API से डेटा इन्जेस्ट करें।
→पेजिनटेड स्रोत को समानांतर में प्रोसेस करने के लिए `SplittableDoFn` का उपयोग करें। DoFn के भीतर रिट्री के लिए रेट-लिमिटिंग लॉजिक (जैसे, Guava RateLimiter का उपयोग करके) और एक्सपोनेंशियल बैकऑफ़ लागू करें।
क्यों: एक `SplittableDoFn` गतिशील कार्य पुनर्संतुलन की अनुमति देता है। इसे रेट-लिमिटिंग और रिट्री लॉजिक के साथ संयोजित करने से बाहरी API को संभालने के लिए एक लचीला और कुशल पैटर्न बनता है।
एक सिंगल डेटा स्ट्रीम को कई गंतव्यों (जैसे, BigQuery, Bigtable, Cloud Storage) पर लिखने की आवश्यकता है।
→एक सिंगल Dataflow पाइपलाइन में, प्रारंभिक प्रोसेसिंग के बाद, उसी अंतिम `PCollection` पर कई `PTransform` राइटर लागू करें।
क्यों: फैन-आउट पैटर्न अत्यधिक कुशल है क्योंकि डेटा को केवल एक बार प्रोसेस किया जाता है। यह एक ही स्रोत से पढ़ने वाली कई अलग-अलग पाइपलाइनों को चलाने की लागत और जटिलता से बचाता है।
एक उच्च-मात्रा वाली स्ट्रीम को धीरे-धीरे बदलने वाले आयाम तालिका (जैसे, उपयोगकर्ता प्रोफाइल) के साथ जुड़कर समृद्ध किया जाना चाहिए जो समय-समय पर अपडेट होती है।
→Dataflow में साइड इनपुट पैटर्न का उपयोग करें। आयाम तालिका को `PCollectionView` के रूप में लोड करें। पाइपलाइन रीस्टार्ट को रोकने के लिए, एक शेड्यूल पर साइड इनपुट को रीफ़्रेश करने के लिए एक आवधिक ट्रिगर कॉन्फ़िगर करें।
क्यों: साइड इनपुट तेज़ इन-मेमोरी लुकअप के लिए सभी वर्करों को आयाम डेटा प्रसारित करते हैं, प्रति-एलिमेंट API/DB कॉल से बचते हैं। आवधिक रीफ़्रेश अपडेट को कुशलता से संभालता है।
Dataproc क्लस्टर वर्कलोड्स में काफी भिन्नता होती है, जिससे या तो अत्यधिक प्रावधान (over-provisioning) या कम प्रदर्शन होता है।
→एक ऑटोस्केलिंग नीति के साथ एक Dataproc क्लस्टर बनाएं। न्यूनतम/अधिकतम प्राथमिक और माध्यमिक वर्कर गणना परिभाषित करें। नीति YARN मेट्रिक्स के आधार पर क्लस्टर को स्केल करेगी।
क्यों: ऑटोस्केलिंग क्लस्टर संसाधनों को नौकरी की मांग से मिलाकर लागतों को अनुकूलित करता है, भारी लोड के लिए स्केल अप करता है और निष्क्रिय अवधि के दौरान स्केल डाउन करता है।
एक Dataflow पाइपलाइन को कस्टम बाइनरीज़, प्रोप्राइटरी लाइब्रेरीज़, या मानक वर्कर इमेज में नहीं होने वाले विशिष्ट संस्करणों की आवश्यकता होती है, और इसे बिना इंटरनेट के VPC में चलना चाहिए।
→सभी डिपेंडेंसी प्री-इंस्टॉल के साथ एक कस्टम कंटेनर इमेज बनाएं। इमेज को Artifact Registry पर पुश करें। कस्टम कंटेनर को संदर्भित करने वाले Flex Template का उपयोग करके पाइपलाइन को डिप्लॉय करें।
क्यों: कस्टम कंटेनरों वाले Flex Templates रनटाइम वातावरण और डिपेंडेंसी पर पूर्ण नियंत्रण प्रदान करते हैं, जो ऑफ़लाइन या विशेष वातावरण के लिए महत्वपूर्ण है।
एक Dataflow या Spark जॉब जो `GroupByKey` कर रहा है वह धीमा है क्योंकि कुछ कुंजियों में असंगत रूप से कई मान होते हैं ("हॉट कुंजी")।
→दो-चरण एकत्रीकरण (कुंजी सॉल्टिंग) लागू करें। सबसे पहले, हॉट कुंजी को कई वर्करों में विभाजित करने के लिए कुंजी में एक रैंडम सफ़िक्स जोड़ें। आंशिक रूप से एकत्रित करें। दूसरा, सफ़िक्स हटा दें और आंशिक परिणामों को एकत्रित करें।
क्यों: यह फैनआउट तकनीक मैन्युअल रूप से हॉट कुंजी के लिए काम को तोड़ती है, जिससे इसे समानांतर में संसाधित किया जा सकता है और बॉटलनेक को दूर किया जा सकता है।
एक स्ट्रीमिंग पाइपलाइन को गलत फॉर्मेट वाले रिकॉर्ड के कारण विफल नहीं होना चाहिए। अमान्य रिकॉर्ड को प्रोसेसिंग को रोके बिना विश्लेषण के लिए अलग किया जाना चाहिए।
→एक `DoFn` में, पार्सिंग के लिए एक try-catch ब्लॉक का उपयोग करें। मुख्य आउटपुट पर वैध रिकॉर्ड और अलग त्रुटि आउटपुट पर अमान्य रिकॉर्ड (त्रुटि संदर्भ के साथ) को रूट करने के लिए `TupleTag` के साथ एक मल्टी-आउटपुट DoFn का उपयोग करें। त्रुटि PCollection को एक dead-letter गंतव्य जैसे Pub/Sub टॉपिक या BigQuery टेबल पर सिंक करें।
क्यों: यह पैटर्न खराब डेटा को अलग करके, पाइपलाइन विफलताओं को रोककर, और डिबगिंग और रीप्रोसेसिंग के लिए विफल रिकॉर्ड कैप्चर किए जाने को सुनिश्चित करके लचीलापन प्रदान करता है।