记录层次结构并将Spark log4j Logger附加到

时间:2016-12-01 16:49:44

标签: java python logging apache-spark pyspark

我在python中有一个主脚本和其他模块文件,目前它们都在一个文件夹中。 我现在试图在任何地方注入日志消息,但我并不是真正理解日志层次结构python,尽管我一直在阅读它。

  1. 所以只是为了检查,因为这是我的测试中发生的事情: 如果我在主模块上配置了一个记录器,只要我用logging.getLogger(__name__)调用记录器,就会自动将我导入到该主模块的模块的记录附加到它上面,对吗?那么导入的模块不必在子文件夹中或其他什么东西?

  2. 我在我的脚本中使用PySpark,因此我按照Spark>中的建议创建一个Spark会话。 2.0,并在我的模块中使用它。但是,我希望将Spark记录器配置为我的脚本记录器,并将其消息与我的模块记录器一起输出到文件或我配置的任何处理程序上。

  3. 到目前为止,我只能发现我可以通过

    获取Spark记录器
    log4jLogger = sc._jvm.org.apache.log4j
    LOGGER = log4jLogger.LogManager.getLogger(__name__)
    

    但我不想使用log4j进行日志记录,但相反。我希望将Spark的记录器附加到我的记录器,这将是父记录器。

    此外,即使我使用Spark的log4j,我也不想通过在conf目录中使用静态log4j.properties文件来更改整个Spark的日志配置,但我想记录取决于调用脚本。

    有没有办法做到这一点?如果没有,那么将这两个记录器组合成一个配置和输出的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

配置spark以将日志转发到python logger是不可能的 - python和spark jvm是分开的进程。

但是,正如您所注意到的,您可以使用py4j网关将事件从pyspark记录到log4j(仅限驱动程序)。您的log4j配置不需要对所有脚本都是静态的,您可以创建许多log4j配置并在运行时加载它们:

./bin/spark-submit --driver-java-options \
     '-Dlog4j.configuration=file:/tmp/custom_logging.properties' script.py

如果您使用yarn-cluster在YARN中运行应用程序,请记住使用--files发送配置文件,例如:

./bin/spark-submit --master yarn --deploy-mode cluster \
    --driver-java-options '-Dlog4j.configuration=file:logging.properties' \
    --files /tmp/logging.properties script.py