मैं ऐसे एप्लिकेशन का निर्माण कर रहा हूं जिसे 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 से एचडीएफएस में कॉपी करने के लिए कुछ विकसित करें?
शायद 'flatMap'/ – maxymoo
चलाने से पहले' df.cache() 'को आजमाएं, मैंने कोशिश की, लेकिन इसका कोई प्रभाव नहीं पड़ा या वास्तव में पाइपलाइन को लटका दिया गया (जब मैंने कोशिश की तो मैं एक अलग मशीन उदाहरण पर था वह प्रयोग)। –