Pyspark:异常:Java 网关进程在向驱动程序发送其端口号之前退出
Posted
技术标签:
【中文标题】Pyspark:异常:Java 网关进程在向驱动程序发送其端口号之前退出【英文标题】:Pyspark: Exception: Java gateway process exited before sending the driver its port number 【发布时间】:2022-01-21 03:11:01 【问题描述】:我正在尝试在我的 macbook air 上运行 pyspark。当我尝试启动它时,我得到了错误:
Exception: Java gateway process exited before sending the driver its port number
当 sc = SparkContext() 在启动时被调用。我试过运行以下命令:
./bin/pyspark
./bin/spark-shell
export PYSPARK_SUBMIT_ARGS="--master local[2] pyspark-shell"
无济于事。我也看过这里:
Spark + Python - Java gateway process exited before sending the driver its port number?
但这个问题从未得到解答。请帮忙!谢谢。
【问题讨论】:
你使用什么版本的 spark? 这可能会有所帮助***.com/a/30851037/296549 我通过下载不同的 tarbll 的 spark 解决了上述问题。 见我的 cmets-***.com/questions/31841509/… 除了@mt88 的评论,spark-1.6.0-bin-without-hadoop.tgz 会产生上述异常,但 spark-1.6.0-bin-hadoop2.6.tgz 不会在 Ubuntu 15.04 上对我来说 【参考方案1】:一个可能的原因是没有设置 JAVA_HOME,因为没有安装 java。
我遇到了同样的问题。它说
Exception in thread "main" java.lang.UnsupportedClassVersionError: org/apache/spark/launcher/Main : Unsupported major.minor version 51.0
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:643)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:277)
at java.net.URLClassLoader.access$000(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:212)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
at java.lang.ClassLoader.loadClass(ClassLoader.java:323)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:296)
at java.lang.ClassLoader.loadClass(ClassLoader.java:268)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:406)
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/opt/spark/python/pyspark/conf.py", line 104, in __init__
SparkContext._ensure_initialized()
File "/opt/spark/python/pyspark/context.py", line 243, in _ensure_initialized
SparkContext._gateway = gateway or launch_gateway()
File "/opt/spark/python/pyspark/java_gateway.py", line 94, in launch_gateway
raise Exception("Java gateway process exited before sending the driver its port number")
Exception: Java gateway process exited before sending the driver its port number
sc = pyspark.SparkConf()
。我通过运行解决了它
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java8-installer
来自https://www.digitalocean.com/community/tutorials/how-to-install-java-with-apt-get-on-ubuntu-16-04
【讨论】:
如需在 Ubuntu 上全自动安装 Oracle Java8,请参阅 newfivefour.com/docker-java8-auto-install.html。 这对我有用,在尝试 EXPORT 语句无济于事后 我很困惑。你怎么能没有安装java并出现这样的错误?它的第一部分是 java 堆栈跟踪!我认为您只是遇到了 JAVA_HOME 设置不正确/根本没有正确设置的问题。【参考方案2】:这应该对你有帮助
一种解决方案是将 pyspark-shell 添加到 shell 环境变量 PYSPARK_SUBMIT_ARGS:
export PYSPARK_SUBMIT_ARGS="--master local[2] pyspark-shell"
python/pyspark/java_gateway.py 有一个变化,如果用户设置了 PYSPARK_SUBMIT_ARGS 变量,则要求 PYSPARK_SUBMIT_ARGS 包含 pyspark-shell。
【讨论】:
在哪里可以阅读更多关于这个 pyspark-shell 参数的信息?我在任何地方都找不到它。【参考方案3】:在 Ubuntu 上运行 pyspark 时出现此错误消息,通过安装 openjdk-8-jdk
包摆脱它
from pyspark import SparkConf, SparkContext
sc = SparkContext(conf=SparkConf().setAppName("MyApp").setMaster("local"))
^^^ error
安装 Open JDK 8:
apt-get install openjdk-8-jdk-headless -qq
在 MacOS 上
在 Mac OS 上也是如此,我在终端中输入:
$ java -version
No Java runtime present, requesting install.
系统提示我从 Oracle's download site 安装 Java,选择 MacOS 安装程序,单击 jdk-13.0.2_osx-x64_bin.dmg
,然后检查 Java 是否已安装
$ java -version
java version "13.0.2" 2020-01-14
编辑要安装 JDK 8,您需要转到 https://www.oracle.com/java/technologies/javase-jdk8-downloads.html(需要登录)
之后,我可以使用 pyspark 启动 Spark 上下文。
检查是否有效
在 Python 中:
from pyspark import SparkContext
sc = SparkContext.getOrCreate()
# check that it really works by running a job
# example from http://spark.apache.org/docs/latest/rdd-programming-guide.html#parallelized-collections
data = range(10000)
distData = sc.parallelize(data)
distData.filter(lambda x: not x&1).take(10)
# Out: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
请注意,您可能需要设置环境变量 PYSPARK_PYTHON
和 PYSPARK_DRIVER_PYTHON
,并且它们的 Python 版本必须与您用于运行 pyspark(驱动程序)的 Python(或 IPython)相同。
【讨论】:
如何在Windows上安装openjdk-8-jdk-headless?【参考方案4】:我使用 Mac 操作系统。我解决了这个问题!
下面是我修复它的方法。
JDK8 似乎工作正常。 (https://github.com/jupyter/jupyter/issues/248)
所以我检查了我的 JDK /Library/Java/JavaVirtualMachines,这条路径中只有 jdk-11.jdk。
我downloaded JDK8(我点击了链接)。 即:
brew tap caskroom/versions
brew cask install java8
在这之后,我添加了
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home
export JAVA_HOME="$(/usr/libexec/java_home -v 1.8)"
到 ~/.bash_profile 文件。 (你应该检查你的 jdk1.8 文件名)
现在可以了! 希望对您有所帮助:)
【讨论】:
澄清一下,这里的修复是export JAVA_HOME="$(/usr/libexec/java_home -v 1.8)"
,在 Github github.com/jupyter/jupyter/issues/248#issuecomment-926782387 上有一个扩展的讨论。是的,链接是 Jupyter,但它是关于 PySpark 的问题。将第一个赋值添加到 JAVA_HOME 没有任何作用。【参考方案5】:
我将在此处转发how I solved it 以供将来参考。
我是如何解决类似问题的
先决条件:
-
anaconda 已经安装
Spark 已安装 (https://spark.apache.org/downloads.html)
pyspark 已安装 (https://anaconda.org/conda-forge/pyspark)
我做的步骤(注意:根据您的系统设置文件夹路径)
设置以下环境变量。 SPARK_HOME 到 'C:\spark\spark-3.0.1-bin-hadoop2.7' 将 HADOOP_HOME 设置为 'C:\spark\spark-3.0.1-bin-hadoop2.7' 将 PYSPARK_DRIVER_PYTHON 设置为“jupyter” 将 PYSPARK_DRIVER_PYTHON_OPTS 设置为“笔记本” 添加'C:\spark\spark-3.0.1-bin-hadoop2.7\bin;'到 PATH 系统变量。 更改C下直接java安装文件夹:(之前java是安装在Program files下的,所以我直接重新安装了 在 C 下:) 所以我的 JAVA_HOME 会变成这样 'C:\java\jdk1.8.0_271'
现在。它有效!
【讨论】:
【参考方案6】:我在 Linux (ubuntu) 上的 iphython 笔记本 (IPython 3.2.1) 遇到了同样的问题。
在我的例子中缺少的是像这样在 $PYSPARK_SUBMIT_ARGS 环境中设置主 URL(假设您使用 bash):
export PYSPARK_SUBMIT_ARGS="--master spark://<host>:<port>"
例如
export PYSPARK_SUBMIT_ARGS="--master spark://192.168.2.40:7077"
你可以把它放到你的 .bashrc 文件中。您在日志中获得了 spark master 的正确 URL(当您使用 /sbin/start_master.sh 启动 master 时会报告此日志的位置)。
【讨论】:
由于我无法对 user1613333 的回答发表评论,所以我在这里做,我还发现使用 Anaconda 可以让事情变得更顺利。 也可以使用import os; os.environ['PYSPARK_SUBMIT_ARGS'] = "--master ..."
设置环境变量
@quax 我使用了 'os.environ['PYSPARK_SUBMIT_ARGS']= "--master spark://localhost:8888" ' 但我不知道我是否做错了,仍然没有工作
什么 bash 文件在哪里以及为什么? WTH 是/sbin/
(我在 Windows 上)? @BallpointBen 感谢添加,但与以前相同的错误。
@Denis 我会尝试为 PYSPARK_SUBMIT_ARGS 设置一个 Windows 环境变量。尽管在 Windows 上无法提供日志位置。 (现在很少接触 Windows)。【参考方案7】:
在花费数小时尝试许多不同的解决方案后,我可以确认 Java 10 SDK 会导致此错误。在 Mac 上,请导航到 /Library/Java/JavaVirtualMachines 然后运行此命令以完全卸载 Java JDK 10:
sudo rm -rf jdk-10.jdk/
之后,请下载JDK 8 即可解决问题。
【讨论】:
【参考方案8】:Spark 对您使用的 Java 版本非常挑剔。强烈建议您使用 Java 1.8(开源的 AdoptOpenJDK 8 也很好用)。
安装后,将JAVA_HOME
设置为您的 bash 变量,如果您使用 Mac/Linux:
export JAVA_HOME=$(/usr/libexec/java_home -v 1.8)
export PATH=$JAVA_HOME/bin:$PATH
【讨论】:
【参考方案9】:我在使用 PySpark 时遇到了同样的错误,将 JAVA_HOME 设置为 Java 11 对我有用(最初设置为 16)。我正在使用 MacOS 和 PyCharm。
您可以通过 echo $JAVA_HOME
来检查您当前的 Java 版本。
以下是对我有用的。在我的 Mac 上,我使用了以下 homebrew 命令,但您可以使用不同的方法来安装所需的 Java 版本,具体取决于您的操作系统。
# Install Java 11 (I believe 8 works too)
$ brew install openjdk@11
# Set JAVA_HOME by assigning the path where your Java is
$ export JAVA_HOME=/usr/local/opt/openjdk@11
注意:如果您使用自制软件安装并且需要查找路径的位置,您可以使用$ brew --prefix openjdk@11
,它应该返回这样的路径:/usr/local/opt/openjdk@11
此时,我可以从终端运行我的 PySpark 程序 - 但是,在我全局更改 JAVA_HOME 变量之前,我的 IDE (PyCharm) 仍然有同样的错误。
要更新变量,首先通过在命令行上运行 echo $SHELL
来检查您使用的是 zsh 还是 bash shell。对于 zsh,您将编辑 ~/.zshenv
文件,对于 bash,您将编辑 ~/.bash_profile
。
# open the file
$ vim ~/.zshenv
OR
$ vim ~/.bash_profile
# once inside the file, set the variable with your Java path, then save and close the file
export JAVA_HOME=/usr/local/opt/openjdk@11
# test if it was set successfully
$ echo $JAVA_HOME
/usr/local/opt/openjdk@11
在这一步之后,我也可以通过我的 PyCharm IDE 运行 PySpark。
【讨论】:
【参考方案10】:即使我正确设置了PYSPARK_SUBMIT_ARGS
,我也得到了相同的Java gateway process exited......port number
异常。我正在运行 Spark 1.6 并试图让 pyspark 与 IPython4/Jupyter 一起工作(操作系统:ubuntu 作为 VM 来宾)。
当我遇到这个异常时,我注意到生成了一个 hs_err_*.log,它的开头是:
There is insufficient memory for the Java Runtime Environment to continue. Native memory allocation (malloc) failed to allocate 715849728 bytes for committing reserved memory.
所以我通过 VirtualBox Setting 增加了为我的 ubuntu 分配的内存并重新启动了 guest ubuntu。然后这个Java gateway
异常消失,一切正常。
【讨论】:
在哪里可以找到该日志文件? 繁荣,很好的答案【参考方案11】:我在 Cloudera VM 中尝试使用 CSV 支持启动 IPython 时遇到了相同的 Exception: Java gateway process exited before sending the driver its port number
语法错误:
PYSPARK_DRIVER_PYTHON=ipython pyspark --packages com.databricks:spark-csv_2.10.1.4.0
会抛出错误,而:
PYSPARK_DRIVER_PYTHON=ipython pyspark --packages com.databricks:spark-csv_2.10:1.4.0
不会。
不同之处在于最后一个(工作)示例中的最后一个 冒号,将 Scala 版本号与 包版本号分开。
【讨论】:
【参考方案12】:在我的情况下,这个错误来自之前运行良好的脚本。所以我想这可能是由于我的 JAVA 更新。在我使用 java 1.8 之前,我不小心更新到了 java 1.9。当我切换回 java 1.8 时,错误消失了,一切运行正常。 对于那些因为同样的原因得到这个错误但不知道如何在 ubuntu 上切换回旧 Java 版本的人: 运行
sudo update-alternatives --config java
选择java版本
【讨论】:
Thx - 这解决了我在 KDE Neon 上的问题(基于 Ubuntu 16.04)。【参考方案13】:我在 Windows 系统中发现了问题。 Java 的安装目录路径中不能有空格,如C:\Program Files
。我在C\Java
中重新安装了Java。我将JAVA_HOME
设置为C:\Java
,问题就消失了。
【讨论】:
【参考方案14】:如果您尝试在没有 hadoop 二进制文件的情况下运行 spark,您可能会遇到上述错误。一种解决方案是:
1) 单独下载hadoop。 2) 将 hadoop 添加到您的 PATH 3) 将 hadoop 类路径添加到您的 SPARK 安装中
前两步很简单,最后一步最好通过在每个 spark 节点(master 和 worker)的 $SPARK_HOME/conf/spark-env.sh 中添加以下内容来完成
### in conf/spark-env.sh ###
export SPARK_DIST_CLASSPATH=$(hadoop classpath)
更多信息请查看:https://spark.apache.org/docs/latest/hadoop-provided.html
【讨论】:
【参考方案15】:我收到此错误是因为磁盘空间不足。
【讨论】:
【参考方案16】:遇到同样的问题,使用下面几行安装java后解决了这个问题!
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java8-installer
【讨论】:
【参考方案17】:我有同样的错误。
我的故障排除程序是:
-
查看 Spark 源代码。
遵循错误消息。就我而言:
pyspark/java_gateway.py
,第 93 行,launch_gateway
。
检查代码逻辑找到根本原因,然后你会解决它。
在我的情况下,问题是 PySpark 无权创建一些临时目录,所以我只是使用 sudo 运行我的 IDE
【讨论】:
【参考方案18】:我在 pycharm 中运行 pyspark 时遇到同样的错误。 我通过在pycharm的环境变量中添加JAVA_HOME解决了这个问题。
【讨论】:
【参考方案19】:我有同样的例外,我通过设置和重置所有环境变量尝试了一切。但问题最终深入到 spark session 的 appname 属性中的空间,即“SparkSession.builder.appName("StreamingDemo").getOrCreate()”。从赋予 appname 属性的字符串中删除空间后,它立即得到解决。我在 windows 10 环境中使用 pyspark 2.7 和 eclipse。它对我有用。 随信附上截图。
【讨论】:
【参考方案20】:对于存在 JAVA_HOME 问题的 Linux (Ubuntu 18.04),关键是将其指向 master 文件夹:
-
通过
sudo update-alternatives --config java
将 Java 8 设置为默认值。如果未安装 Jave 8,请通过以下方式安装:sudo apt install openjdk-8-jdk
。
将JAVA_HOME
环境变量设置为master java 8 文件夹。该位置由上面删除jre/bin/java
的第一个命令给出。即:export JAVA_HOME="/usr/lib/jvm/java-8-openjdk-amd64/"
。如果在命令行上完成,这将仅与当前会话相关 (ref: export command on Linux)。验证:echo $JAVA_HOME
。
要永久设置此设置,请将上面的粗体行添加到启动 IDE/Jupyter/python 解释器之前运行的文件中。这可以通过将上面的粗体线添加到 .bashrc
来实现。此文件在 bash 以交互方式启动时加载 ref: .bashrc
【讨论】:
谢谢,这对我有用,我正在使用 Fedora。必须将 JAVA 路径设置为 /usr/lib/jvm/java-(无论 JDK 版本)。这需要时间弄清楚,再次感谢您【参考方案21】:由于机器上没有安装 JAVA 而发生错误。 Spark 是在 Scala 中开发的,通常在 JAVA 上运行。
尝试安装 JAVA 并执行 pyspark 语句。 它会起作用的
【讨论】:
【参考方案22】:如果您的计算机中没有安装 java,通常会发生这种情况。
转到命令提示符并检查您的 java 版本:
输入:java -version
你应该得到这样的输出
java version "1.8.0_241"
Java(TM) SE Runtime Environment (build 1.8.0_241-b07)
Java HotSpot(TM) 64-Bit Server VM (build 25.241-b07, mixed mode)
如果没有,去orcale下载jdk。 查看此视频,了解如何下载 java 并将其添加到构建路径。
https://www.youtube.com/watch?v=f7rT0h1Q5Wo
【讨论】:
【参考方案23】:在这个问题上花了很多时间后,我能够解决这个问题。我拥有 MacOs Catalina,在 Anaconda 环境中使用 Pycharm。
Spark 当前仅支持 Java8。如果通过命令行安装Java,默认会安装最新的Java10+,会带来各种麻烦。要解决此问题,请按照以下步骤操作 -
1. Make sure you have Homebrew, else install Homebrew
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
2. Install X-code
xcode-select –-install
3. Install Java8 through the official website (not through terminal)
https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html
4. Install Apache-Spark
brew install apache-spark
5. Install Pyspark and Findspark (if you have anaconda)
conda install -c conda-forge findspark
conda install -c conda-forge/label/gcc7 findspark
conda install -c conda-forge pyspark
Viola!这应该让您运行 PySpark 没有任何问题
【讨论】:
【参考方案24】:这里有许多有价值的提示,但是,没有一个能完全解决我的问题,所以我将展示在 Windows 上的 Anaconda Jupyter Notebook 中工作的过程:
在没有空格的目录中下载并安装 java 和 pyspark。 [可能不需要] 在 anaconda 提示符下,键入where conda
和 where python
并使用 Windows 环境变量工具将 .exe 文件目录的路径添加到您的 Path 变量中。在此处添加变量 JAVA_HOME
和 SPARK_HOME
及其对应的路径。
即使这样做,我也必须在 Notebook 中手动设置这些变量以及 PYSPARK_SUBMIT_ARGS
(使用您自己的 SPARK_HOME
和 JAVA_HOME
路径):
import os
os.environ["SPARK_HOME"] = r"C:\Spark\spark-3.2.0-bin-hadoop3.2"
os.environ["PYSPARK_SUBMIT_ARGS"] = "--master local[3] pyspark-shell"
os.environ["JAVA_HOME"] = r"C:\Java\jre1.8.0_311"
使用 !pip install findspark
从笔记本安装 findspark。
运行import findspark
和findspark.init()
运行from pyspark.sql import SparkSession
和spark = SparkSession.builder.getOrCreate()
一些有用的链接:
https://towardsdatascience.com/installing-apache-pyspark-on-windows-10-f5f0c506bea1
https://sparkbyexamples.com/pyspark/pyspark-exception-java-gateway-process-exited-before-sending-the-driver-its-port-number/
https://www.datacamp.com/community/tutorials/installing-anaconda-windows
【讨论】:
【参考方案25】:我遇到了这个问题,实际上不是因为 JAVE_HOME 设置。我假设您使用的是 Windows,并使用 Anaconda 作为您的 Python 工具。请检查您是否可以使用命令提示符。由于 cmd 崩溃,我无法运行 spark。修复此问题后,spark 可以在我的电脑上正常运行。
【讨论】:
how to fix your cmd 这并不能真正回答问题。如果您有其他问题,可以点击 提问。要在此问题有新答案时收到通知,您可以follow this question。一旦你有足够的reputation,你也可以add a bounty 来引起对这个问题的更多关注。 - From Review【参考方案26】:在这方面的工作时间。我的问题是安装 Java 10。我卸载了它并安装了 Java 8,现在 Pyspark 可以工作了。
【讨论】:
但是如果你输入 java -version 会显示另一个版本而不是 8?【参考方案27】:对我来说,答案是在“文件”->“项目结构”->“模块”(在 IntelliJ 中)中添加两个“内容根”:
-
YourPath\spark-2.2.1-bin-hadoop2.7\python
YourPath\spark-2.2.1-bin-hadoop2.7\python\lib\py4j-0.10.4-src.zip
【讨论】:
【参考方案28】:这是一个旧线程,但我正在为使用 mac 的人添加我的解决方案。
问题在于JAVA_HOME
。您必须将其包含在您的 .bash_profile
中。
检查您的java -version
。如果您下载了最新的 Java 但它没有显示为最新版本,那么您就知道路径错误。通常,默认路径是export JAVA_HOME= /usr/bin/java
。
所以尝试将路径更改为:
/Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin/java
您也可以下载最新的 JDK。
https://www.oracle.com/technetwork/java/javase/downloads/index.html 这将自动将usr/bin/java
替换为最新版本。您可以再次通过java -version
确认这一点。
那应该可以了。
【讨论】:
【参考方案29】:确保您的 Java 目录(在您的路径中找到)和您的 Python 解释器都位于其中没有空格的目录中。这些是我的问题的原因。
【讨论】:
【参考方案30】:就我而言,这是因为我在spark-env.sh
中写了SPARK_DRIVER_MEMORY=10
而不是SPARK_DRIVER_MEMORY=10g
【讨论】:
以上是关于Pyspark:异常:Java 网关进程在向驱动程序发送其端口号之前退出的主要内容,如果未能解决你的问题,请参考以下文章
在AWS lambda函数上使用pyspark二进制文件,在向驱动程序发送其端口号之前退出错误Java网关进程
如何在 Windows 的虚拟环境中让 pyspark 在 Jupyter Notebook 中工作?
Pyspark:Spyder 中的 SparkContext 定义引发 Java 网关错误
kotlin协程硬核解读(5. Java异常本质&协程异常传播取消和异常处理机制)