运行pyspark时获取Java输出



我在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 Context时以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(使用PySpark/jupyter/Ubuntu)运行的Java进程的stdout,以了解Java崩溃的真正原因?

这取决于你的运行方式。您是刚刚启动pyspark本地模式还是针对集群(yarn, standalone等)运行?

如果你只是指向jupyter然后运行"pyspark"-在本地模式下运行spark。通常,您可以从启动pyspark的终端看到日志输出。默认的日志模式只有警告。你可以在jupyter笔记本中修改:

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_type .12-0.4.0- snapshot .jar——conf spark.driver.extraJavaOptions=-Duser. jarconf spark.sql.session. timezone=GMT。——conf spark.executor.extraJavaOptions=-Duser. timeZone=UTC——conf spark.plugins=com.nvidia.spark. confSQLPlugin——相依——配置spark.rapids.sql.explain ="NOT_ON_GPU">

一般来说,即使对yarn和standalone模式部署,我也希望你的驱动程序日志显示在你启动pyspark的地方,除非你在集群模式下运行,否则在集群上运行的executor日志可能会在其他地方。

还要注意,这个配置对spark-rapids插件无效:conf.set("spark.executor.resource.gpu.amount","8")conf.set("spark.task.resource.gpu.amount","8")这个插件只支持每个执行器1个gpu。

你也不需要任何驱动gpu:conf.set("spark.driver.resource.gpu.amount","8")但是如果你想的话也可以。

如果您还有其他问题,请随时在spark-rapids的repo中提交问题。

最新更新