相关疑难解决方法(0)

除日志文件外,使Python记录器还将所有消息输出到stdout

有没有办法使用logging模块自动将事物输出到stdout 以及它们应该去的日志文件?例如,我想所有呼叫logger.warning,logger.critical,logger.error去他们预期的地方,但除了总是被复制到stdout.这是为了避免重复消息,如:

mylogger.critical("something failed")
print "something failed"
Run Code Online (Sandbox Code Playgroud)

python logging error-logging

417
推荐指数
8
解决办法
32万
查看次数

PySpark记录?

我想用Python编写的Spark驱动程序来输出一些基本的日志信息.我可以通过三种方式来做到这一点:

  1. 使用PySpark py4j桥来访问Spark使用的Java log4j日志记录工具.

log4jLogger = sc._jvm.org.apache.log4j LOGGER = log4jLogger.LogManager.getLogger(__name__) LOGGER.info("pyspark script logger initialized")

  1. 只需使用标准控制台打印.

  2. loggingPython标准库模块.这似乎是理想的和最Pythonic方法,但是,至少开箱即用,它不起作用,并且记录的消息似乎不可恢复.当然,这可以配置为记录到py4j-> log4j和/或控制台.

因此,官方编程指南(https://spark.apache.org/docs/1.6.1/programming-guide.html)根本没有提到日志记录.这令人失望.应该有标准的文档建议方法来记录Spark驱动程序.

搜索了这个问题,发现了这个问题:如何从我的Python Spark脚本中进行登录

但该线程的内容并不令人满意.

具体来说,我有以下问题:

  • 我错过了从PySpark驱动程序登录的标准方法吗?
  • 是否有任何利弊记录到py4j-> log4j vs console?

logging apache-spark pyspark

19
推荐指数
1
解决办法
1万
查看次数

AWS EMR Spark Python日志记录

我在AWS EMR上运行一个非常简单的Spark作业,似乎无法从我的脚本中获取任何日志输出.

我试过打印到stderr:

from pyspark import SparkContext
import sys

if __name__ == '__main__':
    sc = SparkContext(appName="HelloWorld")
    print('Hello, world!', file=sys.stderr)
    sc.stop()
Run Code Online (Sandbox Code Playgroud)

并采用火花记录器如图所示在这里:

from pyspark import SparkContext

if __name__ == '__main__':
    sc = SparkContext(appName="HelloWorld")

    log4jLogger = sc._jvm.org.apache.log4j
    logger = log4jLogger.LogManager.getLogger(__name__)
    logger.error('Hello, world!')

    sc.stop()
Run Code Online (Sandbox Code Playgroud)

作业运行后EMR给我两个日志文件:controllerstderr.两个日志都不包含"Hello, world!"字符串.这是我的理解,stdout重定向到stderr火花.该stderr日志显示作业被接受,运行和顺利完成.

所以我的问题是,我在哪里可以查看我的脚本的日志输出?或者我应该在脚本中更改什么才能正确记录?

编辑:我使用此命令提交步骤:

aws emr add-steps --region us-west-2 --cluster-id x-XXXXXXXXXXXXX --steps Type=spark,Name=HelloWorld,Args=[--deploy-mode,cluster,--master,yarn,--conf,spark.yarn.submit.waitAppCompletion=true,s3a://path/to/simplejob.py],ActionOnFailure=CONTINUE
Run Code Online (Sandbox Code Playgroud)

python emr apache-spark

15
推荐指数
1
解决办法
2781
查看次数

使用数据块中的 python 日志记录模块将日志写入 azure 数据湖不起作用

我正在尝试在 Databricks 中的 Python 笔记本中将自己的日志文件写入 Azure Datalake Gen 2。我试图通过使用 Python 日志记录模块来实现这一点。

不幸的是我不能让它工作。不会引发错误,会创建文件夹,但不会创建包含日志内容的文件。即使文件存在,也不会写入任何内容。

本地 python 脚本工作正常,但我无法在 Databricks 中使用它。

这是我的代码:

# mount
if not any(mount.mountPoint == '/mnt/log' for mount in dbutils.fs.mounts()):
  dbutils.fs.mount(
    source = "abfss://log@datalake.dfs.core.windows.net/",
    mount_point = "/mnt/log",
    extra_configs = configs)

# vars
folder_log = '/mnt/log/test/2019'
file_log = '201904.log'

# add folder if not existent
dbutils.fs.mkdirs(folder_log)

# setup logging
import logging
logging.basicConfig(
  filename=folder_log+'/'+file_log,
  format='%(asctime)s | %(name)s | %(levelname)s | %(message)s',
  datefmt='%Y-%m-%d %H:%M:%S UTC (%z)',
  level=logging.NOTSET
)

# test
logging.info('Hello World.')
Run Code Online (Sandbox Code Playgroud)

安装似乎没问题。

使用 …

python logging azure azure-data-lake azure-databricks

10
推荐指数
2
解决办法
4860
查看次数

如何从 Pyspark 中的 UDF 函数发送日志

如果您在 PySpark 的 UDF 函数中添加任何类型的登录,它就不会出现在任何地方。是否有某种方法可以实现这一目标?

到目前为止,我尝试了标准的 python 日志记录、py4j 和打印。

我们在 AWS EMR 集群上运行带有 YARN 集群管理器的 PySpark 2.3.2。

例如。这是我想使用的一个函数:

def parse_data(attr):
    try:
        # execute something
    except Exception as e:
        logger.error(e)
        return None
Run Code Online (Sandbox Code Playgroud)

我将其转换为 UDF:

import pyspark.sql.functions as F
parse_data_udf = F.udf(parse_data, StringType())
Run Code Online (Sandbox Code Playgroud)

我将在数据帧上使用它:

from pyspark.sql import types as pst
dataframe = dataframe.withColumn("new_column", parse_data_udf("column").cast(pst.StringType())
Run Code Online (Sandbox Code Playgroud)

该函数的日志不会出现在任何地方。

logging user-defined-functions pyspark

5
推荐指数
1
解决办法
1123
查看次数

如何在pyspark中使用log4j配置特定记录器的日志级别?

这个StackOverflow 线程中,我知道如何在 pyspark 中获取和使用 log4j 记录器,如下所示:

from pyspark import SparkContext
sc = SparkContext()
log4jLogger = sc._jvm.org.apache.log4j
LOGGER = log4jLogger.LogManager.getLogger('MYLOGGER')
LOGGER.info("pyspark script logger initialized")
Run Code Online (Sandbox Code Playgroud)

这适用于spark-submit脚本。

我的问题是如何修改log4j.properties文件以配置此特定记录器的日志级别或如何动态配置它?

logging log4j apache-spark pyspark

3
推荐指数
1
解决办法
4852
查看次数

PySpark打印到控制台

在数据采集服务器上运行PySpark作业时

gcloud --project <project_name> dataproc jobs submit pyspark --cluster <cluster_name> <python_script>
Run Code Online (Sandbox Code Playgroud)

我的打印报表没有显示在我的终端中.

在云上运行作业时,有没有办法在PySpark中将数据输出到终端?

编辑:我想在转换中打印/记录信息.例如:

def print_funct(l):
    print(l)
    return l

rddData.map(lambda l: print_funct(l)).collect()
Run Code Online (Sandbox Code Playgroud)

应该打印RDD中的每一行数据rddData.

做一些挖掘,我找到了这个日志记录的答案,然而,测试它为我提供了这个问题的结果,其答案表明在转换过程中无法进行日志记录

python-2.7 pyspark google-cloud-dataproc

2
推荐指数
1
解决办法
9331
查看次数