2014-11-20 11 views
15

जब एक coalesce, जो क्योंकि यह एक फेरबदल का कारण नहीं है महान है और तुरंत काम करने के लिए लगता है का उपयोग कर सकते विभाजन की संख्या कम (एक अतिरिक्त काम चरण की आवश्यकता नहीं है)।स्पार्क: बिना किसी शफल के विभाजन की संख्या बढ़ाएं?

मैं कभी कभी विपरीत करना चाहते हैं, लेकिन repartition एक फेरबदल प्रेरित करता है। मैं कुछ महीने पहले लगता है कि मैं वास्तव में CoalescedRDDbalanceSlack = 1.0 साथ का उपयोग करके यह काम कर रहे हो गया - तो क्या होगा यह एक विभाजन विभाजित होता है तो यह है कि जिसके परिणामस्वरूप विभाजन स्थान जहां एक ही नोड (इतना छोटा शुद्ध आईओ) पर सभी।

कार्यक्षमता इस तरह की Hadoop में स्वचालित है, एक बस विभाजन आकार बदलाव करता। यह स्पार्क में इस तरह से काम नहीं करता है जब तक कि कोई विभाजन की संख्या कम नहीं कर लेता है। मुझे लगता है कि समाधान कस्टम आरडीडी के साथ एक कस्टम विभाजनकर्ता लिखना हो सकता है जहां हम getPreferredLocations परिभाषित करते हैं ... लेकिन मैंने सोचा कि यह इतना आसान और सामान्य बात है कि निश्चित रूप से ऐसा करने का एक सीधा आगे होना चाहिए?

बातें करने की कोशिश की: मेरे SparkConf पर

.set("spark.default.parallelism", partitions), और पढ़ने छत के संदर्भ में मैं sqlContext.sql("set spark.sql.shuffle.partitions= ..., जो 1.0.0 पर एक त्रुटि का कारण बनता है और वास्तव में, मैं चाहता हूँ चाहता हूँ मैं विभाजन चाहते हैं की कोशिश की है जब सभी प्रकार की नौकरी में बदलने की संख्या, सिर्फ शफल नहीं।

+0

कोई भाग्य इसके लिए समाधान ढूंढ रहा है? – nbubis

उत्तर

3

घड़ी इस स्थान

https://issues.apache.org/jira/browse/SPARK-5997

बहुत आसान स्पष्ट सुविधा इस तरह अंत में लागू किया जाएगा - मुझे लगता है कि बस के बाद वे Dataset रों में सभी अनावश्यक सुविधाओं को समाप्त।

0

मुझे बिल्कुल सही नहीं लगता कि आपका बिंदु क्या है। क्या आपका मतलब है कि अब आपके पास 5 विभाजन हैं, लेकिन अगले ऑपरेशन के बाद आप डेटा को 10 में वितरित करना चाहते हैं? क्योंकि 10 होने के बावजूद, लेकिन अभी भी 5 का उपयोग करना ज्यादा समझ में नहीं आता है ... नए विभाजनों को डेटा भेजने की प्रक्रिया कभी-कभी होती है।

जब coalesce कर रही है, आप, unsued विभाजन से छुटकारा प्राप्त कर सकते हैं, उदाहरण के लिए: यदि आप शुरू में 100 था, लेकिन उसके बाद reduceByKey के बाद आप 10 (के रूप में वहाँ जहां केवल 10 चाबियाँ) मिला है, तो आप coalesce सेट कर सकते हैं।

आप इस प्रक्रिया के अन्य रास्ता तय करना चाहते हैं, तो आप सिर्फ विभाजन किसी तरह मजबूर कर सकता है:

[RDD].partitionBy(new HashPartitioner(100)) 

मुझे यकीन है कि आप जो खोज रहे हैं, लेकिन इतना आशा है नहीं कर रहा हूँ।

+3

प्रत्येक विभाजन में एक स्थान होता है, यानी एक नोड, मान लीजिए मेरे पास 5 विभाजन और 5 नोड्स हैं। यदि मैं 10 विभाजनों में 'रिपर्टिशन' या आपका कोड कहता हूं, तो यह डेटा को घुमाएगा - यह कि प्रत्येक 5 नोड्स के लिए डेटा अन्य नोड्स पर नेटवर्क से गुज़र सकता है। मैं क्या चाहता हूं, यह है कि स्पार्क बस प्रत्येक विभाजन को चारों ओर किसी भी डेटा को घुमाने के बिना विभाजित करता है - यह हैडपॉप में होता है जब विभाजन सेटिंग्स को ट्वीव करता है। – samthebest

+0

मुझे यकीन नहीं है कि आप इसे कर सकते हैं या नहीं। मुझे लगता है कि आपको किसी प्रकार की'forEachNode' फ़ंक्शन की आवश्यकता होगी। लेकिन मैंने कभी ऐसा कुछ नहीं देखा। और मुझे यकीन नहीं है कि इसे आसानी से कार्यान्वित किया जा सकता है या नहीं। विभाजनकर्ता को हर बार एक ही ऑब्जेक्ट के लिए एक ही विभाजन को वापस करना होगा। डिफ़ॉल्ट रूप से स्पार्क 'हैशपार्टिशनर' का उपयोग करें, जो ** हैशकोड मॉड्यूलो संख्या_of_partitions ** करता है। यदि आप डेटा को दो नए विभाजनों में विभाजित करते हैं, तो वे निश्चित रूप से अपने स्थानों पर समाप्त नहीं होंगे। यही कारण है कि शफल निरंतर है। हो सकता है कि यदि आपके पास अपना स्वयं का विभाजनकर्ता है, तो यह नेट पर शफल होने के दौरान विभाजन की संख्या में वृद्धि कर सकता है। – szefuf

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