2015-03-12 10 views
29

मैं एचडीएफएस का उपयोग कर क्लस्टर पर अपाचे स्पार्क के साथ काम कर रहा हूं। जहां तक ​​मैं समझता हूं, एचडीएफएस डेटा-नोड्स पर फाइलें वितरित कर रहा है। तो यदि फाइल सिस्टम पर एक "file.txt" डाला गया है, तो इसे विभाजन में विभाजित किया जाएगा। अब मैंस्पार्क विभाजन (आईएनजी) एचडीएफएस में फाइलों पर कैसे काम करता है?

rdd = SparkContext().textFile("hdfs://.../file.txt") 
अपाचे स्पार्क से फोन कर रहा हूँ

। क्या अब फाइल सिस्टम पर "file.txt" के रूप में स्वचालित रूप से समान विभाजन हैं? क्या होता है जब मैं

rdd.repartition(x) 

जहां x> तो विभाजन HDFS द्वारा इस्तेमाल किया कहते हैं? स्पार्क शारीरिक रूप से एचडीएफएस पर डेटा को स्थानीय रूप से काम करने के लिए पुनर्व्यवस्थित करेगा?

उदाहरण: मैंने एचडीएफएस-सिस्टम पर 30 जीबी टेक्स्टफाइल डाला, जो इसे 10 नोड्स पर वितरित कर रहा है। स्पार्क ए) उसी 10 पार्टिटन्स का उपयोग करेगा? और बी) जब मैं पुनर्गठन (1000) कहता हूं तो क्लस्टर में 30 जीबी को घुमाएं?

उत्तर

51

जब स्पार्क एचडीएफएस से एक फ़ाइल पढ़ता है, तो यह एक इनपुट विभाजन के लिए एक एकल विभाजन बनाता है। इनपुट विभाजन को हडोप InputFormat द्वारा इस फ़ाइल को पढ़ने के लिए उपयोग किया जाता है। उदाहरण के लिए, यदि आप textFile() का उपयोग करते हैं तो यह हैडोप में TextInputFormat होगा, जो आपको एचडीएफएस के एक ब्लॉक के लिए एक एकल विभाजन देगा (लेकिन विभाजन के बीच विभाजित लाइन विभाजन पर किया जाएगा, सटीक ब्लॉक विभाजन नहीं), जब तक आपके पास न हो एक संपीड़ित पाठ फ़ाइल। संपीड़ित फ़ाइल के मामले में आपको एक फ़ाइल के लिए एक एकल विभाजन मिलेगा (क्योंकि संकुचित पाठ फ़ाइलें विभाजित नहीं हैं)।

जब आप फोन rdd.repartition(x) यह N partititons आप rddx को विभाजन में आप करना चाहते हैं से डेटा का एक मिश्रण का प्रदर्शन करेंगे, विभाजन राउंड रोबिन आधार पर किया जाना होगा।

यदि आपके पास एचडीएफएस पर संग्रहीत 30 जीबी असम्पीडित टेक्स्ट फ़ाइल है, तो डिफ़ॉल्ट एचडीएफएस ब्लॉक आकार सेटिंग (128 एमबी) के साथ इसे 235 ब्लॉक में संग्रहीत किया जाएगा, जिसका अर्थ है कि इस फ़ाइल से पढ़े गए आरडीडी में 235 विभाजन होंगे। जब आप फोन repartition(1000) अपने RDD के रूप में चिह्नित किया जाएगा repartitioned हो सकता है, लेकिन वास्तव में यह 1000 विभाजन करने के लिए फेरबदल किया जाएगा केवल जब आप इस RDD के शीर्ष (आलसी निष्पादन अवधारणा)

+2

तो, मैं RDD = SparkContext() 'है कि इस से लेने में सही कर textfile (" HDFS: //.../file.txt ")।' परिणामस्वरूप एक आरडीडी होगा जो ब्लॉक की समान संख्या में विभाजित है क्योंकि फाइल एचडीएफएस में संग्रहीत है? और यदि आप इसे 'rdd.repartition (x) 'reparation करते हैं तो इसे अधिक विभाजन में प्राप्त करना संभव है? – monster

+7

बिल्कुल नहीं। आदर्श रूप से आपको एचडीएफएस में दिखाई देने वाले ब्लॉक की एक ही संख्या मिल जाएगी। लेकिन अगर आपकी फ़ाइल में रेखाएं बहुत लंबी हैं (ब्लॉक आकार से अधिक), विभाजन की मात्रा कम होगी। इस मामले में विभाजन की संख्या को बदलने का पसंदीदा तरीका सीधे इसे 'rdd = स्पार्ककॉन्टेक्स्ट() पर पाठित करना है। टेक्स्टफाइल ("hdfs: //.../file.txt", 400) ', जहां 400 है विभाजन की संख्या। इस मामले में 400 विभाजन में विभाजन करना हैडोप टेक्स्ट इनपुटपुट द्वारा किया जाएगा, स्पार्क नहीं और यह बहुत तेज़ काम करेगा। स्पार्क 'रिपर्टिशन()' क्लस्टर में डेटा को घुमाएगा, वास्तव में कुशल नहीं है – 0x0FFF

+0

आपके महान प्रश्न और उत्तर के लिए धन्यवाद! क्या आप कृपया "400 स्प्लिट्स में विभाजन करना हैडोप टेक्स्ट इनपुटपुट द्वारा किया जाएगा" के मामले की व्याख्या कर सकते हैं? –

6

अलावा @ करने के लिए पर कोई क्रिया निष्पादित करेंगे 0x0FFF यदि यह इनपुट फ़ाइल के रूप में एचडीएफएस से लिया जाता है तो यह इस rdd = SparkContext().textFile("hdfs://.../file.txt") के लिए गणना करेगा और जब आप rdd.getNumPatitions करेंगे तो इसका परिणाम Max(2, Number of HDFS block) होगा। मैंने बहुत सारे प्रयोग किए और परिणामस्वरूप इसे पाया। फिर स्पष्ट रूप से आपके rdd = SparkContext().textFile("hdfs://.../file.txt", 400) कर सकते हैं 400 विभाजन के रूप में प्राप्त करने के लिए या यहां तक ​​कि rdd.repartition द्वारा फिर से विभाजन करते हैं या द्वारा rdd.coalesce(10)

+0

मैंने हमेशा महसूस किया है कि एक्स> ब्लॉक गिनती टुकड़ों में डेटासेट को विभाजित करना आवश्यक नहीं है। इसलिए महसूस किया कि डिफ़ॉल्ट संस्करण योजना पहले से ही एक सही काम कर रही है। हमें एक्स> ब्लॉक गिनती पैरामीटर में फिर से विभाजित करने की आवश्यकता है? – zinking

+0

ठीक है, हो सकता है कि जब आपको ब्लॉक गिनती टुकड़ों से प्राप्त होने की तुलना में विभाजन की अधिक संख्या की आवश्यकता हो। @zinking – ChikuMiku

+1

दाएं, जैसे फ़ाइल स्ट्रिंग के एक ब्लॉक को लाइनों में विभाजित किया गया है और विभिन्न प्रोसेसर द्वारा संसाधित किया गया है? और क्या यह अन्य ओवरहेड्स – zinking

3

यहाँ से 10 कम कर सकते हैं "का स्नैपशॉट है कैसे HDFS में ब्लॉक विभाजन के रूप में स्पार्क कार्यकर्ताओं में लोड कर रहे हैं "

इस छवियों 4 HDFS ब्लॉक 3 श्रमिकों स्मृति अंदर चिंगारी विभाजन के रूप में लोड किए गए हैं में

Dataset in HDFS broken into partitions


उदाहरण: मैंने एचडीएफएस-सिस्टम पर 30 जीबी टेक्स्टफाइल डाला, जो इसे 10 नोड्स पर वितरित कर रहा है।

स्पार्क करेंगे

एक) एक ही 10 विभाजन का उपयोग करें?

स्पार्क लोड विभाजन के रूप में श्रमिक स्मृति के लिए समान 10 एचडीएफएस बॉक्स लोड करें। मैं 30 जीबी फ़ाइल के ब्लॉक आकार ग्रहण 3 जीबी 10 विभाजन/ब्लॉक (डिफ़ॉल्ट conf के साथ)

ख) क्लस्टर भर में 30GB शफ़ल जब मैं पुनः विभाजन (1000 कहते हैं) प्राप्त करने के लिए किया जाना चाहिए?

हाँ, स्पार्क कार्यकर्ता नोड्स के बीच डेटा आदेश श्रमिकों स्मृति में 1000 विभाजन बनाने के लिए शफ़ल।

नोट:

HDFS Block -> Spark partition : One block can represent as One partition (by default) 
Spark partition -> Workers  : Many/One partitions can present in One workers 
+0

करता है क्या स्पार्क विभाजन मेमोरी या एचडीडी में रहता है? क्या ब्लॉक का आकार 3 जीबी हो सकता है। एचडीएफएस ब्लॉक आकार 128 एमबी है। – Kannan

+0

@Kannan: हम अपने पसंद के ब्लॉक/विभाजन आकार सेट कर सकते हैं, लेकिन हम नंबर और क्यों कि संख्या के साथ स्पष्ट करने के लिए है। विभाजन मेमोरी और/या डिस्क में उपस्थित हो सकता है, लेकिन स्पार्क ढांचे की पसंद डिफ़ॉल्ट रूप से स्मृति होगी। इसे जांचें [आरडीडी और मेमोरी पर अधिक के लिए उत्तर] (https://stackoverflow.com/a/40733821/1592191) – mrsrinivas

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