我想通过nginx access.log文件在国家/地区制作流量报告。这是我在Python上使用Apache Spark的代码片段:
from pyspark import SparkContext
if __name__ == "__main__":
sc = SparkContext(appName="PythonAccessLogAnalyzer")
def get_country_from_line(line):
try:
from geoip import geolite2
ip = line.split(' ')[0]
match = geolite2.lookup(ip)
if match is not None:
return match.country
else:
return "Unknown"
except IndexError:
return "Error"
rdd = sc.textFile("/Users/victor/access.log").map(get_country_from_line)
ips = rdd.countByValue()
print ips
sc.stop()
在一个6GB的日志文件上,完成任务需要一个小时(我在我的Macbook Pro上运行,4个核心)这太慢了。我认为瓶颈是每当spark映射一行时,它必须导入geolite2
,我必须加载一些数据库。 我是否还要在每个工作人员而不是每一行上导入geolite2
?是否会提升效果?有任何改进该代码的建议吗?