2015-06-11 9 views
5

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

उत्तर

8

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

अवलोकन
वसंत बैच नौकरियों स्केलिंग के लिए पांच विकल्प होते हैं: रिमोट बेडौल

  1. थ्रेड कदम
  2. समानांतर चरणों
  3. विभाजन
  4. AsyncItemProcessor/AsyncItemWriter

प्रत्येक के अपने फायदे और नुकसान होते हैं। एक के माध्यम से चलना करते हैं:

थ्रेड कदम
एक बहु कदम एक ही चरण लेता है और एक अलग थ्रेड पर उस चरण के भीतर प्रत्येक हिस्सा निष्पादित करता है। इसका मतलब है कि प्रत्येक बैच घटकों (पाठकों, लेखकों, आदि) के समान उदाहरण धागे में साझा किए जाते हैं। यह ज्यादातर मामलों में पुनरारंभ करने की लागत पर कदम के लिए कुछ समांतरता जोड़कर प्रदर्शन बढ़ा सकता है। आप पुनरारंभ करने की बलिदान करते हैं क्योंकि ज्यादातर मामलों में, पुनरारंभ करने की क्षमता पाठक/लेखक/आदि के भीतर बनाए गए राज्य पर आधारित होती है। उस राज्य को अद्यतन करने वाले कई धागे के साथ, यह अमान्य हो जाता है और पुनरारंभ करने के लिए बेकार हो जाता है। इस वजह से, आपको आम तौर पर अलग-अलग घटकों पर राज्य को बचाने की आवश्यकता होती है और पुन: प्रारंभ करने योग्य ध्वज को नौकरी पर झूठा सेट करना पड़ता है।

समानांतर चरणों
समानांतर चरणों एक विभाजन के माध्यम से हासिल किया जाता है। यह आपको धागे के माध्यम से समानांतर में एकाधिक, स्वतंत्र चरणों को निष्पादित करने की अनुमति देता है। यह पुनरारंभ करने योग्यता का त्याग नहीं करता है, लेकिन एक चरण या व्यावसायिक तर्क के टुकड़े के प्रदर्शन में सुधार करने में मदद नहीं करता है।

विभाजन
विभाजन डेटा का विभाजन, अग्रिम में, छोटे मात्रा (बुलाया विभाजन) एक मास्टर कदम से में है और उसके बाद होने दास विभाजन पर स्वतंत्र रूप से काम करते हैं। स्प्रिंग बैच में, मास्टर और प्रत्येक दास दोनों एक स्वतंत्र कदम है ताकि आप पुनरारंभ करने के बिना एक ही चरण में समांतरता के लाभ प्राप्त कर सकें। विभाजन में एक एकल जेवीएम से आगे बढ़ने की क्षमता भी प्रदान की जाती है जिसमें गुलामों को स्थानीय नहीं होना चाहिए (आप दूरस्थ गुलामों के साथ संवाद करने के लिए विभिन्न संचार तंत्र का उपयोग कर सकते हैं)।

विभाजन के बारे में एक महत्वपूर्ण नोट यह है कि मास्टर और दास के बीच एकमात्र संचार डेटा के विवरण विवरण डेटा नहीं है।उदाहरण के लिए, मास्टर दास 1 को रिकॉर्ड 1-100, गुलाम 2 को रिकॉर्ड करने के लिए बता सकता है, रिकॉर्ड 101-200 आदि को संसाधित करने के लिए। मास्टर वास्तविक डेटा नहीं भेजता है, केवल दास के लिए आवश्यक जानकारी प्राप्त करने के लिए आवश्यक जानकारी । इस वजह से, डेटा दास प्रक्रियाओं के लिए स्थानीय होना चाहिए और मास्टर कहीं भी स्थित हो सकता है।

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

विभाजन और दूरदराज के बेडौल के बीच महत्वपूर्ण अंतर यह है कि एक वर्णन तार पर जाने के बजाय, दूरस्थ बेडौल वास्तविक डेटा भेजता तार खत्म हो गया है। तो एक सिंगल पैकेट की बजाय प्रक्रिया 1-100 रिकॉर्ड करती है, रिमोट चंकिंग वास्तविक रिकॉर्ड 1-100 भेजने जा रही है। इसका एक कदम के I/O प्रोफ़ाइल पर बड़ा प्रभाव हो सकता है, लेकिन यदि प्रोसेसर पर्याप्त बाधा है, तो यह उपयोगी हो सकता है।

AsyncItemProcessor/AsyncItemWriter
वसंत बैच प्रक्रियाओं स्केलिंग के लिए अंतिम विकल्प AsyncItemProcessor/AsycnItemWriter संयोजन है। इस मामले में, AsyncItemProcessor आपके ItemProcessor कार्यान्वयन को लपेटता है और आपके कार्यान्वयन को एक अलग थ्रेड में कॉल निष्पादित करता है। AsyncItemProcessor फिर Future देता है जो AsyncItemWriter पर जाता है जहां यह अनचाहे होता है और ItemWriter कार्यान्वयन प्रतिनिधि को पास किया जाता है।

कैसे डेटा की प्रकृति के कारण

इस विकल्प के माध्यम से बहती है, कुछ श्रोता परिदृश्यों का समर्थन कर रहे नहीं (क्योंकि हम ItemWriter अंदर तक ItemProcessor कॉल के परिणाम पता नहीं है) लेकिन कुल मिलाकर, इसके लिए एक उपयोगी उपकरण प्रदान कर सकते हैं पुनरारंभ करने के बिना केवल एक JVM में ItemProcessor तर्क समानांतर करना।

+0

आपके उत्तर के लिए धन्यवाद जो बहुत प्रबुद्ध था। असल में प्रोजेक्ट में जहां मैं काम करता हूं वहां चुनने के लिए सीमित विकल्प हैं। हम अभी भी स्प्रिंग-बैच 2 का उपयोग करते हैं जिसमें AsyncItemProcessor/AsyncItemWriter नहीं है। – mettok

+0

स्प्रिंग बैच 2 के लिए, यह स्प्रिंग बैच व्यवस्थापक में मौजूद था। –

+0

मेरे पास विभाजन के बारे में एक सवाल है। यदि मास्टर और गुलाम विभिन्न जेवीएम में हैं। मैसेजिंग के अलावा हम किस तरह के संचार तरीकों का उपयोग कर सकते हैं? (हमारे पास मैसेजिंग के लिए बुनियादी ढांचा नहीं है) – mettok

संबंधित मुद्दे