运行 pyspark 时获取 Java 输出

Posted

技术标签:

【中文标题】运行 pyspark 时获取 Java 输出【英文标题】:Getting Java output when running pyspark 【发布时间】:2021-02-02 14:23:14 【问题描述】:

在 Ubuntu 上的 Jupyter Notebook 中运行 PySpark 时,有时 Java 会失败。我想要的是从 Java 端看到错误,因为我所看到的通常是 Python 的很长的一般错误,可以总结为:

ERROR:root:Exception while sending command.
Traceback (most recent call last):
  File "/opt/conda/lib/python3.6/site-packages/py4j/java_gateway.py", line 1207, in send_command
    raise Py4JNetworkError("Answer from Java side is empty")
py4j.protocol.Py4JNetworkError: Answer from Java side is empty

这个错误可能意味着很多事情,但它根本没有帮助。通常这意味着 Java 崩溃了,但我想知道具体原因。

我需要这些日志的示例是,例如,我尝试在 DGX-1 机器上的 PySpark 上运行 Rapids,但在初始化 Spark 上下文时,它会像 abo 一样以 Java 崩溃告终。这不是这些错误的唯一原因,但这段代码很容易在我这边导致这些错误。

import pyspark
import os
cudf = "cudf-0.17-cuda10-1.jar"
rapids = "rapids-4-spark_2.12-0.2.0.jar"
script = "getGpuResources.sh"
separator = ","
conf = pyspark.SparkConf()
conf.set("spark.jars",cudf + "," + rapids)
conf.set("spark.plugins","com.nvidia.spark.SQLPlugin")
conf.set("spark.driver.memory","48g")
conf.set("spark.executor.memory","48g")
conf.set("spark.driver.cores","80")
conf.set("spark.executor.cores","80")
conf.set("spark.task.cpus","80")
conf.set("spark.dynamicAllocation.enabled","false")
conf.set("spark.rapids.sql.concurrentGpuTasks","8")
conf.set("spark.dynamicAllocation.enabled","false")
conf.set("spark.sql.extensions","ai.rapids.spark.Plugin")
conf.set("spark.driver.resource.gpu.amount","8")
conf.set("spark.driver.resource.gpu.discoveryScript",script)
conf.set("spark.executor.resource.gpu.amount","8")
conf.set("spark.executor.resource.gpu.discoveryScript",script)
conf.set("spark.task.resource.gpu.amount","8")
sc = pyspark.SparkContext(appName="rapids", conf = conf)

我的问题:有没有办法以某种方式捕获 PySpark 运行的 Java 进程的标准输出(使用 pyspark/jupyter/Ubuntu)以了解 Java 崩溃的真正原因?

【问题讨论】:

【参考方案1】:

所以这将取决于你的跑步方式。您是刚刚启动 pyspark 本地模式还是针对集群(纱线、独立等)运行?

如果您只是指向 jupyter 并运行“pyspark” - 它在本地模式下运行的 spark。通常,您可以从启动 pyspark 的终端看到日志输出。默认的日志模式虽然只是警告。您可以在 jupyter notebook 中更改:

sc.setLogLevel("INFO")

但无论哪种方式,您都会看到出现错误。

如果您在本地模式下运行,您应该按照此处的 rapids 插件说明进行操作:https://nvidia.github.io/spark-rapids/docs/get-started/getting-started-on-prem.html#local-mode

特别是本地模式下的 Spark 不支持 gpu 调度,因此您应该删除所有这些配置。

我建议您在启动它时在命令行上指定选项。 我使用 jupyter 在本地模式下对 pyspark 进行了快速测试,方法是:

pyspark --master local[4] --jars cudf-0.18-SNAPSHOT-cuda10-1.jar,rapids-4-spark_2.12-0.4.0-SNAPSHOT.jar --conf spark.driver.extraJavaOptions= -Duser.timezone=GMT --conf spark.sql.session.timeZone=UTC --conf spark.executor.extraJavaOptions=-Duser.timezone=GMT --conf spark.plugins=com.nvidia.spark.SQLPlugin --conf --conf spark.rapids.sql.explain="NOT_ON_GPU"

通常,即使针对 yarn 和独立模式部署,我希望您的驱动程序日志会出现在您启动 pyspark 的位置,除非您在集群模式下运行,否则将在集群上运行的执行程序日志可能会在其他地方。

另请注意,此配置不适用于 spark-rapids 插件: conf.set("spark.executor.resource.gpu.amount","8") conf.set("spark.task.resource.gpu.amount","8") 该插件仅支持每个执行程序 1 个 gpu。

您也不需要任何驱动 gpus: conf.set("spark.driver.resource.gpu.amount","8") 但如果你愿意,也可以。

如果您还有其他问题,请随时在 spark-rapids 存储库中提出问题。

【讨论】:

是的,我正在运行本地模式。关于我的“入门”,配置不起作用,您编写的配置也不起作用,并以“Java 端的答案为空”结尾。 Regualr Spark 工作正常。感谢您的回复,我会尝试提出我认为的问题。另外,问题是我无法设置日志级别,因为我无法创建火花上下文。

以上是关于运行 pyspark 时获取 Java 输出的主要内容,如果未能解决你的问题,请参考以下文章

PySpark shell 命令不产生任何输出

Python pyspark 将 DF 写入 .csv 并存储在本地 C 盘

我只需要在 pyspark 数据框中附加那些具有非空值的人

MetaException(消息:java.lang.IllegalArgumentException:java.net.UnknownHostException)在pyspark上运行sql查询时

当我在 pyspark EMR 5.x 中运行用 Java 编写的 hive UDF 时出错

如何在安装 spark 2.4.4 后尝试运行 pyspark 时修复“TypeError:需要一个整数(获取类型字节)”错误