AWS EMR pyspark notebook 失败并显示“Failed to 运行 command /usr/bin/virtualenv (...)”

AWS EMR pyspark notebook fails with `Failed to run command /usr/bin/virtualenv (...)`

我已经在 AWS 中创建了一个基本的 EMR 集群,并且正在尝试使用通过 AWS 控制台提供的 Jupyter 笔记本。启动笔记本似乎工作正常,我也能够 运行 基本 python 笔记本中的代码以 pyspark 内核启动。笔记本中设置了两个变量:spark是一个SparkSession实例,sc是一个SparkContext实例。显示 sc 会产生 <SparkContext master=yarn appName=livy-session-0>(输出当然会因会话而略有不同)。

一旦我执行实际击中火花机的操作,就会出现问题。例如:

sc.parallelize(list(range(10))).map(lambda x: x**2).collect()

我不是 spark 专家,但我相信这段代码应该将 0 到 9 的整数分布在整个集群中,对它们进行平方,然后 return 将结果放在一个列表中。相反,我得到了一个冗长的堆栈跟踪,主要来自 JVM,但也有一些 python 组件。我相信堆栈跟踪的中心部分如下:

py4j.protocol.Py4JJavaError: An error occurred while calling z:org.apache.spark.api.python.PythonRDD.collectAndServe.
: org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 4.0 failed 4 times, most recent failure: Lost task 0.3 in stage 4.0 (TID 116, ip-XXXXXXXXXXXXX.eu-west-1.compute.internal, executor 17): java.lang.RuntimeException: Failed to run command: /usr/bin/virtualenv -p python3 --system-site-packages virtualenv_application_1586243436143_0002_0

完整的堆栈跟踪是 here

在 AWS 门户中进行了一些挖掘后,我记录了节点的输出。 stdout from one of the nodes 包括以下内容:

The path python3 (from --python=python3) does not exist

我尝试 运行在主节点上手动执行 /usr/bin/virtualenv 命令(通过登录后),并且工作正常,但在我这样做之后错误当然仍然存在。

虽然此错误大部分时间都会发生,但我能够在一个会话中完成此操作,在那里我可以 运行 对 spark 集群进行多项操作,正如我所期望的那样。

关于集群设置的技术信息:

知道我做错了什么吗?请注意,我对 EMR 和 Spark 完全陌生。

编辑:添加了 stdout 日志和有关 运行通过 ssh 在主节点上手动执行 virtualenv 命令的信息。

我已经改用 emr-5.29.0,这似乎解决了问题。也许这是 emr-6.0.0 的问题?无论如何,我有一个功能性的解决方法。

对我来说,问题是 virtualenv 是在具有 python 路径的执行器上创建的,该路径不存在。将执行者指向正确的执行者为我完成了工作:

"spark.pyspark.python": "/usr/bin/python3.7"

以下是我在笔记本开头重新配置 spark 应用程序的方式:

{"conf":{"spark.pyspark.python": "/usr/bin/python3.7",
         "spark.pyspark.virtualenv.enabled": "true",
         "spark.pyspark.virtualenv.type": "native",
         "spark.pyspark.virtualenv.bin.path":"/usr/bin/virtualenv"}
}