2016-03-22 4 views
6

पर शफल करता है मैं स्कैला (2.11)/स्पार्क (1.6.1) स्ट्रीमिंग प्रोजेक्ट पर काम कर रहा हूं और पिछले बैचों से देखे गए डेटा का ट्रैक रखने के लिए mapWithState() का उपयोग कर रहा हूं।स्पार्क नक्शा WithState सभी डेटा को एक नोड

राज्य 20 विभाजनों में विभाजित है, StateSpec.function(trackStateFunc _).numPartitions(20) के साथ बनाया गया है। मैंने पूरे क्लस्टर में राज्य को वितरित करने की आशा की थी, लेकिन ऐसा लगता है कि प्रत्येक नोड में पूर्ण राज्य होता है और निष्पादन हमेशा एक ही नोड निष्पादित होता है।

Locality Level Summary: Node local: 50 प्रत्येक बैच के लिए यूआई में दिखाया गया है और पूरा बैच घसीटना पढ़ा है। बाद में, मैं कफका को लिखता हूं और विभाजन फिर से क्लस्टर में फैल जाते हैं। मुझे लगता है कि mapWithState() को एक नोड पर चलाने की आवश्यकता क्यों नहीं है। क्या यह राज्य को विभाजित करने की अवधारणा को बर्बाद नहीं करता है अगर यह पूर्ण क्लस्टर के बजाय एक नोड द्वारा सीमित है? क्या कुंजी को राज्य द्वारा वितरित करना संभव नहीं था?

+0

मुझे लगता है कि आपको अपना स्पार्क डीएजी जोड़ना चाहिए, और 'mapWithState' के साथ उपयोग किए जा रहे प्रकारों के बारे में थोड़ा और विवरण जोड़ें। –

उत्तर

2

मैं क्यों mapWithState एक एकल नोड

पर चलने के लिए यह नहीं है की जरूरत है पता लगाने के लिए नहीं कर पा रहे। डिफ़ॉल्ट रूप से स्पार्क आपके क्लस्टर में विभिन्न कार्यकर्ता नोड्स के बीच अपनी कुंजी को विभाजित करने के लिए HashPartitioner का उपयोग करता है। अगर किसी कारण से आप अपने सभी डेटा को एक अलग नोड पर संग्रहीत कर रहे हैं, तो अपनी चाबियों के वितरण की जांच करें। यदि यह एक कस्टम ऑब्जेक्ट है जिसका उपयोग आप कुंजी के रूप में कर रहे हैं, तो सुनिश्चित करें कि यह hashCode विधि ठीक से लागू की गई है। यह तब हो सकता है जब कुंजी वितरण में कुछ गलत हो। यदि आप इसका परीक्षण करना चाहते हैं, तो यादृच्छिक संख्याओं को अपनी चाबियों के रूप में उपयोग करने और स्पार्क UI को देखने का प्रयास करें और यह व्यवहार बदलते हुए देखें।

मैं mapWithState चल रहा हूँ और डेटा में आ रहा है, कुंजी के आधार पर विभाजित है के रूप में मैं भी एक reduceByKey विधि कॉल राज्य पकड़े, और जब स्पार्क यूआई पर Storage टैब पर नज़र करने से पहले है, मैं देख सकता हूँ विभिन्न आरडीडी क्लस्टर में विभिन्न कार्यकर्ता नोड्स पर संग्रहीत किया जा रहा है।

+0

मेरा डेटा कफका के माध्यम से कुंजी द्वारा विभाजित स्पार्क स्ट्रीमिंग में आता है लेकिन मेरे पास एक ही समस्या है। क्या आप अपने उत्तर का विस्तार करना चाहते हैं? मैं हैश विभाजनकर्ता को कैसे एक्सेस/संपादित कर सकता हूं, और डेटाबेस पर लिखने से पहले आप कैसे कम करते हैं ByKey? – Andreas

+0

@ एंड्रियास आप किस समस्या का सामना कर रहे हैं? विभाजन पूर्वाग्रह? –

+0

प्रतिक्रिया देने के लिए धन्यवाद, मैं सीखना चाहता हूं कि कफका और स्पार्क दोनों के लिए विभाजन से विभाजन को कैसे नियंत्रित किया जाए, क्योंकि मेरी समस्या में डेटा को शफल करने की आवश्यकता नहीं है। प्रैक्टिस में मैं शफलिंग देखता हूं, क्योंकि मेरे कंपाउंड कुंजी पर हैश फ़ंक्शन डेटा को भेजता है। नीचे मेरी समस्या का विवरण। – Andreas

0

क्या आप - तैनाती-मोड क्लस्टर पर स्पार्क चला रहे हैं? कृपया इसे जांचें।

यह भी सुनिश्चित करें कि आप --num-execors 20 --executor-cores 10 सेट कर रहे हैं क्योंकि जब तक आप डिफ़ॉल्ट रूप से गतिशील आवंटन के साथ नहीं चलते हैं, तो यह 2 निष्पादकों को असाइन करेगा।

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