पायथन और स्काला का उपयोग करते समय स्पार्क के प्रदर्शन की तुलना करने के लिए मैंने दोनों भाषाओं में समान नौकरी बनाई और रनटाइम की तुलना की। मुझे उम्मीद थी कि दोनों नौकरियों में लगभग समान समय लगेगा, लेकिन पायथन की नौकरी में केवल इतना ही 27min
समय लगा , जबकि स्काला की नौकरी में 37min
लगभग 40% लंबा समय लगा!)। मैंने जावा में भी यही काम लागू किया और इसे 37minutes
भी किया। यह कैसे संभव है कि पायथन इतना तेज है?
न्यूनतम सत्यापन योग्य उदाहरण:
पायथन नौकरी:
# Configuration
conf = pyspark.SparkConf()
conf.set("spark.hadoop.fs.s3a.aws.credentials.provider", "org.apache.hadoop.fs.s3a.AnonymousAWSCredentialsProvider")
conf.set("spark.executor.instances", "4")
conf.set("spark.executor.cores", "8")
sc = pyspark.SparkContext(conf=conf)
# 960 Files from a public dataset in 2 batches
input_files = "s3a://commoncrawl/crawl-data/CC-MAIN-2019-35/segments/1566027312025.20/warc/CC-MAIN-20190817203056-20190817225056-00[0-5]*"
input_files2 = "s3a://commoncrawl/crawl-data/CC-MAIN-2019-35/segments/1566027312128.3/warc/CC-MAIN-20190817102624-20190817124624-00[0-3]*"
# Count occurances of a certain string
logData = sc.textFile(input_files)
logData2 = sc.textFile(input_files2)
a = logData.filter(lambda value: value.startswith('WARC-Type: response')).count()
b = logData2.filter(lambda value: value.startswith('WARC-Type: response')).count()
print(a, b)
स्केल नौकरी:
// Configuration
config.set("spark.executor.instances", "4")
config.set("spark.executor.cores", "8")
val sc = new SparkContext(config)
sc.setLogLevel("WARN")
sc.hadoopConfiguration.set("fs.s3a.aws.credentials.provider", "org.apache.hadoop.fs.s3a.AnonymousAWSCredentialsProvider")
// 960 Files from a public dataset in 2 batches
val input_files = "s3a://commoncrawl/crawl-data/CC-MAIN-2019-35/segments/1566027312025.20/warc/CC-MAIN-20190817203056-20190817225056-00[0-5]*"
val input_files2 = "s3a://commoncrawl/crawl-data/CC-MAIN-2019-35/segments/1566027312128.3/warc/CC-MAIN-20190817102624-20190817124624-00[0-3]*"
// Count occurances of a certain string
val logData1 = sc.textFile(input_files)
val logData2 = sc.textFile(input_files2)
val num1 = logData1.filter(line => line.startsWith("WARC-Type: response")).count()
val num2 = logData2.filter(line => line.startsWith("WARC-Type: response")).count()
println(s"Lines with a: $num1, Lines with b: $num2")
बस कोड को देखकर, वे समान प्रतीत होते हैं। मैंने डीएजी को देखा और उन्होंने कोई जानकारी नहीं दी (या कम से कम मुझे उनके आधार पर स्पष्टीकरण के साथ आने के लिए पता नहीं है) का अभाव है।
मैं वास्तव में किसी भी संकेत की सराहना करूंगा।