2017-12-15 87 views
12

मैं क्लस्टर ssh का उपयोग कर से कनेक्ट हूं और मैं क्लस्टर का उपयोग करक्लस्टर पर फ़ाइल सहेजने का कैसे

spark-submit --master yarn myProgram.py 

मैं एक पाठ फ़ाइल में परिणाम सहेजना चाहते करने के लिए कार्यक्रम भेज सकते हैं और मैं उपयोग करने की कोशिश निम्नलिखित पंक्तियां:

counts.write.json("hdfs://home/myDir/text_file.txt") 
counts.write.csv("hdfs://home/myDir/text_file.csv") 

हालांकि, उनमें से कोई भी काम नहीं करता है। प्रोग्राम खत्म हो जाता है और मुझे myDir में टेक्स्ट फ़ाइल नहीं मिल रही है। क्या आपको कोई विचार है कि मैं यह कैसे कर सकता हूं?

इसके अलावा, क्या मेरी स्थानीय मशीन पर सीधे लिखने का कोई तरीका है?

संपादित करें: मुझे पता चला कि home निर्देशिका तो मौजूद नहीं है अब मैं के रूप में परिणाम को बचाने: counts.write.json("hdfs:///user/username/text_file.txt") लेकिन इस text_file.txt नाम के एक निर्देशिका बनाता है और अंदर मैं अंदर आंशिक परिणामों के साथ फ़ाइलों की एक बहुत कुछ है। लेकिन मुझे एक फ़ाइल अंतिम परिणाम के साथ चाहिए। कोई विचार मैं यह कैसे कर सकता हूं?

+3

यह एक निर्देशिका एक फ़ाइल नहीं बना देता है, वैसे –

+0

@ cricket_007 धन्यवाद मुझे पता नहीं था कि – lads

+0

आप की 'HDFS DFS -LS HDFS उत्पादन दिखाने कृपया:// घर/myDir'? –

उत्तर

7

स्पार्क गणना को वितरित करने के बाद से कई फ़ाइलों में परिणाम सहेज लेगा। इसलिए लिख:

counts.write.csv("hdfs://home/myDir/text_file.csv") 

फ़ोल्डरtext_file.csv में एक अलग फाइल के रूप में प्रत्येक विभाजन पर डेटा को बचाने के लिए मायने रखता है। आप एक एकल फाइल के रूप में सहेजे गए डेटा चाहते हैं, coalesce(1) पहले का उपयोग करें: इस प्रकार हालांकि 1. हो जाएगा

counts.coalesce(1).write.csv("hdfs://home/myDir/text_file.csv") 

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

+1

आप इसका उपयोग कर सकते हैं: 'counts.repartition (1) .write.csv (" hdfs: //home/myDir/text_file.csv ")'। लेकिन कृपया ध्यान दें कि 'पुनरावृत्ति' एल्गोरिदम डेटा का पूर्ण शफल करता है और डेटा के बराबर आकार के विभाजन बनाता है। एक पूर्ण शफल से बचने के लिए 'coalesce' मौजूदा विभाजन को जोड़ती है। 'पुनरावृत्ति' विधि का उपयोग डेटाफ्रेम में विभाजनों की संख्या को बढ़ाने या घटाने के लिए किया जा सकता है। हालांकि, 'coalesce' एल्गोरिदम स्पष्ट रूप से विभाजन की संख्या में वृद्धि नहीं कर सकता है। – deadbug

0

क्या आपको कोई त्रुटि है? हो सकता है कि आप जांच सकें कि क्या आपके पास उस फ़ोल्डर से लिखने/पढ़ने के लिए सही अनुमतियां हैं या नहीं।

यह भी सोचें कि डिफ़ॉल्ट रूप से स्पार्क आपके द्वारा विभाजित विभाजनों की संख्या के आधार पर, कुछ फ़ाइलों के साथ text_file.txt नामक फ़ोल्डर बना देगा।

यदि आप अपनी स्थानीय मशीन में लिखना चाहते हैं तो आप file:///home/myDir/text_file.txt के साथ पथ निर्दिष्ट कर सकते हैं। यदि आप डिफ़ॉल्ट रूप से /user/hdfs/... जैसे पथ का उपयोग करते हैं तो एचडीएफएस

+0

अगर मुझे लिखने की अनुमति है तो क्या मैं टर्मिनल से जांच सकता हूं? मैं मैक – lads

+0

पर हूं आप अनुमतियों और फ़ोल्डर के मालिक को देखने के लिए 'hdfs dfs -ls/home/myDir' का उपयोग कर सकते हैं, और यह भी जांच सकते हैं कि' स्पार्क-सबमिट 'चलाने पर आप किस उपयोगकर्ता का उपयोग कर रहे हैं। शायद आप '/ home/spark/...' को '/ home' के बजाय फ़ोल्डर के रूप में उपयोग करने का प्रयास कर सकते हैं। होम फ़ोल्डर डिफ़ॉल्ट रूप से एचडीएफएस में मौजूद नहीं है। –

+0

क्या आप पूरे परिणाम को एक txt फ़ाइल में कैसे लिख सकते हैं? क्योंकि जैसा कि आपने कहा था कि यह एक निर्देशिका बनाता है और अंदर मेरे पास आंशिक परिणाम हैं। लेकिन मुझे अंतिम परिणाम के साथ केवल एक फ़ाइल चाहिए। – lads

-1

एक अनन्य फ़ाइल (जैसा कि आप चाहते हैं नामित नहीं) के लिए आपको .repartition(1), look here की आवश्यकता है, जो आपके आरडीडी पर पाइप किया गया है। मुझे लगता है कि आपका hdfs पथ गलत है। टेक्स्ट फ़ाइल के लिए स्पार्क एचडीएफएस में डिफ़ॉल्ट है और हडोप में (डिफ़ॉल्ट रूप से) रूट डीआईआर में घर डीआईआर नहीं है, जब तक कि आपने इसे पहले नहीं बनाया हो। यदि आप एक सीएसवी/टीटीटी फ़ाइल (इस विस्तार के साथ) लिखने का एकमात्र तरीका चाहते हैं, तो आरडीडी या डीएफ कार्यों के बिना है, लेकिन आपके द्वारा एकत्र किए जाने के बाद, पाइथन सीएसवी और आईओ के सामान्य पुस्तकालयों का उपयोग करके, .collect() के साथ, आपका आरडीडी एक मार्टिक्स (डेटासेट बड़ा नहीं है)।

आप अपनी फाइल सिस्टम (और HDFS पर नहीं) पर सीधे लिखने के लिए चाहते हैं

counts.write.csv("file:///home/myDir/text_file.csv") 

का उपयोग लेकिन इस सीएसवी विस्तार के साथ एक एकल फाइल नहीं लिखेगा। यह आपके डेटासेट के एन विभाजन के भाग-एम -0000 एन के साथ एक फ़ोल्डर बनाएगा।

2

आप कमांड लाइन से एक फ़ाइल में अपने परिणामों को जोड़ सकते हैं:

hadoop fs -cat hdfs:///user/username/text_file.txt/* > path/to/local/file.txt 

यह coalesce का उपयोग कर से अधिक तेजी से होना चाहिए - मेरे अनुभव में सभी collect() प्रकार संचालन धीमी गति से कर रहे हैं क्योंकि डेटा के सभी के माध्यम से funneled है मास्टर नोड। इसके अलावा, यदि आप अपने मास्टर नोड पर मेमोरी से अधिक हैं तो आप collect() के साथ परेशानियों में भाग सकते हैं।

हालांकि, इस दृष्टिकोण के साथ एक संभावित गड़बड़ी यह है कि आपको पिछले रन से फ़ाइलों को स्पष्ट रूप से निकालना होगा (क्योंकि वर्तमान रन वास्तव में फ़ाइलों की एक ही संख्या का उत्पादन नहीं कर सकता है)। प्रत्येक रन के साथ ऐसा करने के लिए एक झंडा हो सकता है, लेकिन मुझे यकीन नहीं है।

निकालने के लिए:

hadoop fs -rm -r hdfs:///user/username/text_file.txt/* 
संबंधित मुद्दे