2016-09-29 10 views
6

मैं ऐसे एप्लिकेशन का निर्माण कर रहा हूं जिसे S3 से डेटा सेट लोड करने की आवश्यकता है। कार्यक्षमता सही ढंग से काम कर रही है, लेकिन प्रदर्शन आश्चर्यजनक रूप से धीमा है।एस 3 से एसएसवी फ़ाइल को स्पार्क डेटाफ्रेम में इतनी धीमी होने की उम्मीद है?

डेटासेट CSV प्रारूप में हैं। प्रत्येक फ़ाइल में लगभग 7 एम रिकॉर्ड (रेखाएं) हैं, और प्रत्येक फ़ाइल 600-700 एमबी है।

val spark = SparkSession 
     .builder() 
     .appName("MyApp") 
     .getOrCreate() 

val df = spark 
    .read 
    .option("header", "true") 
    .option("inferSchema", "true") 
    .csv(inFileName:_*) 
    // inFileName is a list that current contains 2 file names 
    // eg. s3://mybucket/myfile1.csv 

val r = df.rdd.flatMap{ row => 
     /* 
     * Discard poorly formated input records 
     */ 
     try { 
     totalRecords.add(1) 

     // this extracts several columns from the dataset 
     // each tuple of indexColProc specifies the index of the column to 
     // select from the input row, and a function to convert 
     // the value to an Int 
     val coords = indexColProc.map{ case (idx, func) => func(row.get(idx).toString) } 

     List((coords(0), coords)) 
     } 
     catch { 
     case e: Exception => {  
      badRecords.add(1) 
      List() 
     } 
     } 
    } 

println("Done, row count " + r.count) 

मैंने इसे 5 मशीनों के एडब्ल्यूएस क्लस्टर पर चलाया, प्रत्येक एक m3.xlarge। MaximizeResourceAllocation पैरामीटर को सत्य पर सेट किया गया था, और यह क्लस्टर पर चलने वाला एकमात्र एप्लिकेशन था।

मैंने एप्लिकेशन को दो बार भाग लिया। पहली बार 'इनफाइलनाम' के साथ S3 पर फ़ाइलों पर इशारा करते हुए, और दूसरी बार हडूप फ़ाइल सिस्टम में फ़ाइलों की स्थानीय प्रति पर इशारा करते हुए।

जब मैं स्पार्क इतिहास सर्वर को देखता हूं और अंतिम r.count कार्रवाई से संबंधित नौकरी पर ड्रिल करता हूं, तो मुझे लगता है कि एस 3 पर फ़ाइलों तक पहुंचने में 2.5 मिनट लगते हैं, और 18s स्थानीय रूप से फ़ाइलों तक पहुंचते समय HDFS। जब मैं एक छोटे क्लस्टर पर या मास्टर = स्थानीय विन्यास में एक ही प्रयोग चलाने मैं "आनुपातिक इसी तरह के परिणाम मिल गया है।

जब मैं क्लस्टर

aws s3 cp <file> 

का उपयोग करने के S3 फ़ाइलों की प्रतिलिपि यह केवल 6.5s लेता है एक 600-700 एमबी फ़ाइल को स्थानांतरित करने के लिए। ऐसा लगता है कि मशीन इंस्टेंस का कच्चा I/O धीमा होने के लिए बहुत योगदान दे रहा है।

एस 3 की अपेक्षा करते समय इस तरह का धीमी प्रदर्शन है? यदि नहीं, क्या कोई यह बता सकता है कि मैं कहां गलत हो रहा हूं। अगर इसकी उम्मीद है, तो ऐसा करने के अन्य तरीके हैं जो बेहतर प्रदर्शन करेंगे? या मुझे इसकी आवश्यकता है आवेदन चलाने से पहले फ़ाइलों को आसानी से एस 3 से एचडीएफएस में कॉपी करने के लिए कुछ विकसित करें?

+0

शायद 'flatMap'/ – maxymoo

+0

चलाने से पहले' df.cache() 'को आजमाएं, मैंने कोशिश की, लेकिन इसका कोई प्रभाव नहीं पड़ा या वास्तव में पाइपलाइन को लटका दिया गया (जब मैंने कोशिश की तो मैं एक अलग मशीन उदाहरण पर था वह प्रयोग)। –

उत्तर

6

कुछ और खुदाई के बाद मुझे पता चला कि एस 3 देशी का उपयोग करना एक बड़ा अंतर बनाता है। मैंने यूआरआई उपसर्ग को s3n: // में बदल दिया है और प्रश्न में नौकरी के लिए प्रदर्शन 2.5 मिनट से 21 तक चला गया है। तो एस 3 बनाम एचडीएफएस तक पहुंचने के लिए केवल 3 एस जुर्माना, जो कि काफी उचित है।

इस विषय की खोज करते समय एस 3 एन का उल्लेख है कि कई पदों में 5 जीबी की अधिकतम फ़ाइल आकार सीमा है। हालांकि, मैं this पर आया जो कहता है कि हैडोप 2.4.0 में अधिकतम फाइल आकार सीमा 5TB तक बढ़ी थी।

"एस 3 ब्लॉक फ़ाइल सिस्टम का उपयोग अब अनुशंसित नहीं है।"

0

क्या आपने स्पार्क-सीएसवी पैकेज को आजमाया था? सीएसवी पढ़ने के लिए बहुत अनुकूलन है और आप फ़िल्टर करने की कोशिश कर रहे खराब लाइनों को ड्रॉप करने के लिए मोड = MALFORMED का उपयोग कर सकते हैं। आप S3 सीधे इस तरह से पढ़ सकते हैं:

csv_rdf<- read.df(sqlContext,"s3n://xxxxx:[email protected]/file1.csv",source="com.databricks.spark.csv") 

अधिक जानकारी यहां पाया जा सकता है https://github.com/databricks/spark-csv

+0

मैंने अतीत में स्पार्क-सीएसवी की कोशिश की थी, लेकिन प्रदर्शन में कोई अंतर नहीं था। लेकिन मोड = सूचक पर पॉइंटर के लिए धन्यवाद। मुझे उस मोड के बारे में पता नहीं था, और मेरे कोड को सरल बनाने में मदद कर सकता था। धन्यवाद –

0

हम पहले कुछ महीनों के बारे में ठीक उसी मुद्दे का सामना करना पड़ा है, सिवाय हमारे डेटा 1TB था कि इतने मुद्दा था अधिक उच्चारित।

हमने इसमें खोला और आखिरकार निम्नलिखित निष्कर्ष पर पहुंचा: चूंकि हमारे पास 30 निष्पादकों के साथ 5 उदाहरण थे, हर बार एक मंच निर्धारित किया गया था (और पहली बात यह है कि कार्य एस 3 से डेटा प्राप्त करेगा), इसलिए इन कार्यों को नेटवर्क बैंडविड्थ पर बोतल-गर्दन होगी, फिर वे सभी कार्य के भाग की गणना करने के लिए आगे बढ़ते हैं और सीपीयू के साथ-साथ संघर्ष कर सकते हैं।

इसलिए मूल रूप से कार्य सभी एक ही समय में एक ही काम कर रहे हैं, वे हमेशा एक ही संसाधन के लिए संघर्ष कर रहे हैं।

हमने पाया कि किसी भी बिंदु पर केवल k कार्यों की संख्या उन्हें जल्दी से डाउनलोड करने और गणना भाग में जाने की अनुमति देगी और k कार्यों के अगले सेट में आकर डाउनलोड शुरू हो सकता है। इस तरह, अब k (सभी के विपरीत) कार्यों को पूर्ण बैंडविड्थ मिल रही है और कुछ कार्य एक साथ कुछ सामान्य संसाधनों पर एक दूसरे के इंतजार किए बिना CPU या I/O पर कुछ उपयोगी कर रहे हैं।

उम्मीद है कि इससे मदद मिलती है।

+0

एक कोशिश के लायक लगता है। क्या आप कार्य निष्पादन के उस प्रकार के दानेदार नियंत्रण को कार्यान्वित करने के तरीके पर कुछ पॉइंटर्स प्रदान कर सकते हैं? मेरे मामले में केवल 8 निष्पादक हैं, जिनमें से लगभग 4 कोर हैं। वर्तमान में मैं एक m3.xlarge पर प्रयोग चला रहा हूं, लेकिन अगर मैं इस I/O बाधा को पार कर सकता हूं तो यह अधिक भौतिक कोर के साथ एक उदाहरण में जाने के लिए समझ में आता है। –

+0

मेरे पास कोड सार्वजनिक रूप से उपलब्ध नहीं है, लेकिन हमने जो किया वह अनिवार्य रूप से किया गया था - नेटवर्क गहन कॉल में प्रवेश करने से पहले प्रत्येक कार्य के भीतर हम एक केंद्रीय सेवा को कॉल करेंगे जो ट्रैक करेगा कि एक ही ब्लॉक में कितने अन्य कार्य हैं और यदि यह कुछ के से कम है यह अन्यथा इस काम को एक सेकेंड के लिए एक व्यस्त स्पिन के लिए जाने और पुनः प्रयास करने की अनुमति देगा। और फिर जब नेटवर्क कॉल के साथ कोई कार्य किया जाता है तो यह केंद्रीय सेवा को अपडेट करेगा। माना जाता है कि सबसे खूबसूरत चीज नहीं है, लेकिन हम नौकरी के समय को 90 मिनट से 50 मिनट से कम करने में सक्षम थे। –

+0

कुछ और खुदाई के बाद मैंने पाया कि एस 3 देशी का उपयोग करना एक बड़ा अंतर बनाता है। मैंने यूआरआई उपसर्ग को s3n: // में बदल दिया है और प्रश्न में नौकरी के लिए प्रदर्शन 2.5 मिनट से 21 तक चला गया है। तो एस 3 बनाम एचडीएफएस तक पहुंचने के लिए केवल 3 एस जुर्माना, जो कि काफी उचित है। सुनिश्चित नहीं है कि यह आपकी समस्या पर लागू होगा, हालांकि मैंने जो दस्तावेज़ों को देखा है, अब संकेत मिलता है कि s3 मूल का उपयोग करते समय 5GB की फ़ाइल आकार सीमा है। –

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