我想从 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 核),这太慢了。我认为瓶颈是每当火花映射一条线时,它必须导入geolite2
我认为必须加载一些数据库。无论如何我要geolite2
在每个工人而不是每条线上导入吗?它会提高性能吗?有什么建议可以改进该代码吗?