1

Я хотел сделать отчет о трафике в стране из файла 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 для каждого рабочего, а не для каждой строки? Будет ли это повышать производительность? Любое предложение улучшить этот код?

ответ

0

Как насчет использования широковещательных переменных? Here - это документ, в котором объясняется, как они работают. Однако они являются просто переменными только для чтения, которые распространяются на все рабочие узлы один раз на одного работника, а затем доступны по мере необходимости.

+0

Я уже пробовал передавать его, но он не работал. Я думаю, что geolite2 содержит слишком много ссылок на сложные объекты. – vutran

+0

Что значит «это не работает»? Что именно произошло? – mgaido

+0

Пожалуйста, взгляните на мой смысл: https://gist.github.com/tranvictor/fc5e7338abd4fdaffedc – vutran