Để so sánh hiệu suất của Spark khi sử dụng Python và Scala, tôi đã tạo ra cùng một công việc trong cả hai ngôn ngữ và so sánh thời gian chạy. Tôi dự kiến cả hai công việc sẽ mất khoảng thời gian như nhau, nhưng công việc Python chỉ mất 27min
, trong khi công việc Scala mất 37min
(lâu hơn gần 40%!). Tôi cũng đã thực hiện công việc tương tự trong Java và nó 37minutes
cũng vậy. Làm thế nào điều này có thể là Python nhanh hơn nhiều?
Ví dụ kiểm chứng tối thiểu:
Công việc 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)
Công việc 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")
Chỉ cần nhìn vào mã, chúng dường như giống hệt nhau. Tôi đã xem một DAG và họ không cung cấp bất kỳ thông tin chi tiết nào (hoặc ít nhất là tôi thiếu bí quyết để đưa ra lời giải thích dựa trên chúng).
Tôi thực sự sẽ đánh giá cao bất kỳ con trỏ.