2

我想从 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在每个工人而不是每条线上导入吗?它会提高性能吗?有什么建议可以改进该代码吗?

4

1 回答 1

0

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

于 2015-03-10T10:30:58.343 回答