它只是一个计算日志文件中行数的简单程序。日志文件大约为6GB。我运行了两个程序如下:
常规Python程序
import datetime
begining = datetime.datetime.now()
if __name__ == "__main__":
num_lines = sum(1 for line in open('/Users/victor/access.log'))
print "The file contains of %s lines" % num_lines
ending = datetime.datetime.now()
print "processed in: %s" % (ending - begining)
使用Python的Spark版本
import sys
from operator import add
from pyspark import SparkContext
if __name__ == "__main__":
sc = SparkContext(appName="PythonAccessLogAnalyzer")
lines = sc.textFile("/Users/victor/access.log")
# count number of line
counts = lines.count()
print "The file contains of %s lines" % counts
sc.stop()
因为spark是并行处理的,我认为它应该比常规的python程序更快。但是,在我使用4个处理内核运行spark版本后,几乎 45s 完成任务,而常规程序只需 8s 。 为什么?如何改进Spark版本以使其比常规版本更快?
据我所知,Spark将文件拆分为多个块并并行处理它们,但仍需要一些时间来初始化作业。在这种情况下,与常规python程序处理时间(主要是加载文件)相比,初始化作业的时间太长。如果我更正, Spark版本优于常规版本的文件大小是什么?