Я хотел сделать отчет о трафике в стране из файла nginx access.log. Это мой фрагмент кода с помощью Apache искру на 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
для каждого рабочего, а не для каждой строки? Будет ли это повышать производительность? Любое предложение улучшить этот код?
Я уже пробовал передавать его, но он не работал. Я думаю, что geolite2 содержит слишком много ссылок на сложные объекты. – vutran
Что значит «это не работает»? Что именно произошло? – mgaido
Пожалуйста, взгляните на мой смысл: https://gist.github.com/tranvictor/fc5e7338abd4fdaffedc – vutran