我有一个 emr 版本为 6.10.0 的 emr 集群,我尝试在代码中使用 pyspark udf,但它始终失败并出现相同的错误。
data = [("AAA",), ("BBB",), ("CCC",)]
df = spark.createDataFrame(data, ["col1"])
udf_f = F.udf(lambda x: str.lower(x), StringType())
df.withColumn("col_udf", udf_f(F.col("col1"))).show()
An error was encountered:
An error occurred while calling o203.showString.
: org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 8.0 failed 4 times, most recent failure: Lost task 0.3 in stage 8.0 (TID 39) (ip-xxxxxx.ec2.internal executor 2): java.lang.RuntimeException: Failed to run command: /usr/bin/virtualenv -p python3 --no-pip --system-site-packages virtualenv_application_1681977466645_0017_0
这里整个错误:https://pastebin.com/ZkAHp2JU
我尝试过 6.10.0 以下的 emr 版本,最新版本是 6.5.0,但我需要让它在 6.10.0 上运行。我还尝试关闭 virtualenv
"spark.pyspark.virtualenv.enabled": "false"
,然后它起作用了,但我无法使用 sc.install_pypi_package(),它停止了工作,还有其他一些东西。
任何帮助表示赞赏。
我遇到了同样的问题,并设法通过将
spark.python.use.daemon
设置为 false
来解决该问题。
从执行程序日志来看,Spark 似乎在 PySpark 守护进程已使用 Python 虚拟环境后尝试重新创建该环境。
根据 Spark 源代码中的注释 (
PythonWorkerFactory.scala
),停用 PySpark 守护进程可能会对性能产生负面影响。
本页深入介绍了 Python 工作线程是如何生成的 https://books.japila.pl/pyspark-internals/PythonWorkerFactory/.
另一种解决方案可能是停用虚拟环境
"spark.pyspark.virtualenv.enabled": "false"
,而使用传统的 Spark Python 包管理解决方案(https://spark.apache.org/docs/latest/api/python/user_guide/python_packaging.html ).
问题是如何解决的?在 EMR 版本 6.13.0 上运行 pyspark 时,我遇到了同样的问题(相同的错误消息)