เพื่อเปรียบเทียบประสิทธิภาพของ Spark เมื่อใช้ Python และ Scala ฉันสร้างงานเดียวกันทั้งสองภาษาและเปรียบเทียบรันไทม์ ฉันคาดว่างานทั้งสองจะใช้เวลาเท่ากัน แต่งาน Python ใช้เวลาเท่านั้น27min
ในขณะที่งาน Scala ใช้เวลา37min
(เกือบ 40% อีกต่อไป!) ฉันใช้งานเดียวกันใน Java เช่นกันและก็ใช้37minutes
ด้วย วิธีนี้เป็นไปได้อย่างไรที่ Python เร็วขึ้นมาก?
ตัวอย่างที่ตรวจสอบได้น้อยที่สุด:
งาน Python:
# 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)
งาน Scala:
// 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")
เพียงแค่ดูที่รหัสพวกเขาดูเหมือนจะเหมือนกัน ฉันดู DAGs และพวกเขาไม่ได้ให้ข้อมูลเชิงลึกใด ๆ (หรืออย่างน้อยฉันก็ขาดความรู้ที่จะอธิบายด้วยคำอธิบายเหล่านั้น)
ฉันจะขอบคุณพอยน์เตอร์ใด ๆ