如何在运行map之前让Apache Spark worker导入库

时间:2015-03-10 08:38:08

标签: python nginx parallel-processing apache-spark traffic-measurement

我想通过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是否会提升效果?有任何改进该代码的建议吗?

1 个答案:

答案 0 :(得分:0)

使用广播变量怎么样? Here是解释其工作原理的文档。然而,它们只是只读变量,每个工作者一次传播到所有工作节点,然后在必要时访问。