使用pyspark on访问Spark的log4j记录器的正确方法是什么 遗嘱执行人? 在驱动程序中这样做很容易,但我似乎不明白如何访问 executor上的日志记录功能,以便我可以在本地进行日志记录并 纱线收集当地的原木。 有什么方法可以访问本地记录器吗? 标准的日志记录过程是不够的,因为我无法访问spark 执行器的上下文。
不能对执行器使用本地log4j记录器。Python工作人员由 执行器jvm没有到java的“回调”连接,它们只是接收 命令。但是有一种方法可以使用标准python从执行者那里进行日志记录 伐木并用纱线捕捉它们。 在HDFS上,将每个python配置一次日志记录的python模块文件放入其中 worker和proxy日志记录函数(命名为logger.py):
logger.py
import os import logging import sys class YarnLogger: @staticmethod def setup_logger(): if not 'LOG_DIRS' in os.environ: sys.stderr.write('Missing LOG_DIRS environment variable, pyspark logging disabled') return file = os.environ['LOG_DIRS'].split(',')[0] + '/pyspark.log' logging.basicConfig(filename=file, level=logging.INFO, format='%(asctime)s.%(msecs)03d %(levelname)s %(module)s - %(funcName)s: %(message)s') def __getattr__(self, key): return getattr(logging, key) YarnLogger.setup_logger()
然后在应用程序中导入此模块:
spark.sparkContext.addPyFile('hdfs:///path/to/logger.py') import logger logger = logger.YarnLogger()
您可以在pyspark函数内部使用,例如普通的日志记录库:
def map_sth(s): logger.info("Mapping " + str(s)) return s spark.range(10).rdd.map(map_sth).count()
在pyspark.log日志将在资源管理器上可见并将在上收集 应用程序完成,这样以后可以使用’yarn logs访问这些日志 -应用程序ID….`。
pyspark.log日志