ChatGPT解决这个技术问题 Extra ChatGPT

Pyspark:异常:Java 网关进程在向驱动程序发送其端口号之前退出

我正在尝试在我的 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?

但这个问题从未得到回答。请帮忙!谢谢。

你用什么版本的火花?
这可能会有所帮助stackoverflow.com/a/30851037/296549
我通过下载不同的 tarbll 的 spark 解决了上述问题。
除了@mt88 的评论,spark-1.6.0-bin-without-hadoop.tgz 产生上述异常,但 spark-1.6.0-bin-hadoop2.6.tgz 在 Ubuntu 15.04 上不适合我

K
Kamil Sindi

一个可能的原因是未设置 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 设置不正确/根本没有设置的问题。
D
David Arenburg

这应该可以帮助你

一种解决方案是将 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 论点的更多信息?我在任何地方都找不到提到它。
u
user2314737

在 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_PYTHONPYSPARK_DRIVER_PYTHON,并且它们必须是与您用于运行 pyspark(驱动程序)的 Python(或 IPython)相同的 Python 版本。


如何在 Windows 上安装 openjdk-8-jdk-headless?
s
shihs

我使用 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 没有任何作用。
k
kitokid

我将在此处重新发布 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 系统变量。把java安装的文件夹直接改到C下:(之前java是安装在Program files下的,所以我直接重新安装在C下:)这样我的JAVA_HOME就会变成这样'C:\java\jdk1.8.0_271'

现在。有用 !


q
quax

我在 Linux (ubuntu) 上的 iphython notebook (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)。
K
Kiem Nguyen

在花费数小时尝试许多不同的解决方案后,我可以确认 Java 10 SDK 会导致此错误。在 Mac 上,请导航到 /Library/Java/JavaVirtualMachines 然后运行此命令以完全卸载 Java JDK 10:

sudo rm -rf jdk-10.jdk/

之后,请下载 JDK 8 即可解决问题。


a
answerzilla

我在使用 PySpark 时遇到了同样的错误,将 JAVA_HOME 设置为 Java 11 对我有用(最初设置为 16)。我正在使用 MacOS 和 PyCharm。您可以通过执行 echo $JAVA_HOME 检查您当前的 Java 版本。

以下是对我有用的。在我的 Mac 上,我使用了以下自制命令,但您可以使用不同的方法来安装所需的 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。


M
Marcelo Tournier

Spark 对您使用的 Java 版本非常挑剔。强烈建议您使用 Java 1.8(开源的 AdoptOpenJDK 8 也很好用)。安装后,如果您使用 Mac/Linux,请将 JAVA_HOME 设置为您的 bash 变量:

export JAVA_HOME=$(/usr/libexec/java_home -v 1.8)

export PATH=$JAVA_HOME/bin:$PATH


I
Ida

即使我正确设置了 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 分配的内存并重新启动了来宾 ubuntu。然后这个 Java gateway 异常消失,一切正常。


我在哪里可以找到该日志文件?
繁荣,很好的答案
P
Pim Schaaf

尝试使用 CSV 支持启动 IPython 时,我在 Cloudera VM 中得到了相同的 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 版本号与包版本号分开。


P
Pankaj Kumar

在我的情况下,这个错误来自之前运行良好的脚本。所以我想这可能是由于我的 JAVA 更新。在我使用 java 1.8 之前,我不小心更新到了 java 1.9。当我切换回 java 1.8 时,错误消失了,一切运行正常。对于那些因为同样的原因得到这个错误但不知道如何在 ubuntu 上切换回旧 Java 版本的人:运行

sudo update-alternatives --config java 

并选择java版本


Thx - 这解决了我在 KDE Neon 上的问题(基于 Ubuntu 16.04)。
M
Mickael Maison

我在Windows系统中发现了问题。 Java 的安装目录路径中不能有空格,例如 C:\Program Files。我在 C\Java 中重新安装了 Java。我将 JAVA_HOME 设置为 C:\Java,问题就消失了。


n
natbusa

如果您尝试在没有 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


J
Josh Terrell

我收到此错误是因为我的磁盘空间不足。


S
Soumyaansh

有同样的问题,在使用下面的行安装java后解决了这个问题!

sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java8-installer

K
Kerberos

我有同样的错误。

我的故障排除程序是:

查看 Spark 源代码。按照错误消息进行操作。在我的例子中:pyspark/java_gateway.py,第 93 行,在 launch_gateway 中。检查代码逻辑以找到根本原因,然后您将解决它。

在我的情况下,问题是 PySpark 无权创建一些临时目录,所以我只是用 sudo 运行我的 IDE


J
Joon

我在 pycharm 中运行 pyspark 时遇到同样的错误。我通过在 pycharm 的环境变量中添加 JAVA_HOME 解决了这个问题。


A
A known

https://i.stack.imgur.com/ztNog.png

https://i.stack.imgur.com/FJkqD.png


R
Ran Feldesh

对于具有 JAVA_HOME 问题的 Linux (Ubuntu 18.04),关键是将其指向主文件夹:

通过以下方式将 Java 8 设置为默认值:sudo update-alternatives --config java。如果未安装 Jave 8,请通过以下方式安装:sudo apt install openjdk-8-jdk。将 JAVA_HOME 环境变量设置为主 java 8 文件夹。该位置由上面删除 jre/bin/java 的第一个命令给出。即:export JAVA_HOME="/usr/lib/jvm/java-8-openjdk-amd64/"。如果在命令行上完成,这将仅与当前会话相关(参考:Linux 上的导出命令)。验证:echo $JAVA_HOME。为了永久设置此设置,请将上面的粗体行添加到启动 IDE/Jupyter/python 解释器之前运行的文件中。这可以通过将上面的粗体行添加到 .bashrc 来实现。当 bash 以交互方式启动时加载此文件参考:.bashrc


谢谢,这对我有用,我正在使用 Fedora。必须将 JAVA 路径设置为 /usr/lib/jvm/java-(无论 JDK 版本)。这需要时间弄清楚,再次感谢
T
Tarun Reddy

由于机器上未安装 JAVA,因此发生错误。 Spark 是在 scala 中开发的,通常在 JAVA 上运行。

尝试安装 JAVA 并执行 pyspark 语句。它会起作用


D
Dharman

如果您的机器上没有安装 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


S
Sahana M

在花了很多时间解决这个问题之后,我能够解决这个问题。我拥有 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

中提琴!这应该让您运行 PySpark 没有任何问题


S
Shritam Kumar Mund

步骤1

从终端检查 java 版本。

java -version

如果您看到 bash: java: command not found,则表示您的系统中没有安装 java。

第2步

使用以下命令安装 Java,

sudo apt-get install default-jdk

步骤:3

不检查java版本,你会看到版本已经下载。

java -version

结果:

openjdk version "11.0.11" 2021-04-20
OpenJDK Runtime Environment (build 11.0.11+9-Ubuntu-0ubuntu2.20.04)
OpenJDK 64-Bit Server VM (build 11.0.11+9-Ubuntu-0ubuntu2.20.04, mixed mode, sharing)

第4步

现在运行 pyspark 代码,你将永远不会看到这样的错误。


C
CAV

这里有很多有价值的提示,但是,没有一个能完全解决我的问题,所以我将展示在 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()

从 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


R
Ray

我遇到了这个问题,实际上不是因为 JAVE_HOME 设置。我假设您使用的是 Windows,并使用 Anaconda 作为您的 Python 工具。请检查您是否可以使用命令提示符。由于 cmd 崩溃,我无法运行 spark。修复此问题后,spark 可以在我的电脑上正常工作。


这并没有真正回答这个问题。如果您有其他问题,可以点击 Ask Question 提出问题。要在此问题有新答案时收到通知,您可以follow this question。一旦你有足够的reputation,你也可以通过add a bounty来引起对这个问题的更多关注。 - From Review
a
aghd

为此工作了几个小时。我的问题是安装 Java 10。我卸载了它并安装了 Java 8,现在 Pyspark 可以工作了。


但是如果你输入 java -version 显示另一个版本而不是 8?
Y
Yuuura87

对我来说,答案是在“文件”->“项目结构”->“模块”(在 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


n
noiivice

这是一个旧线程,但我正在为那些使用 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 来确认这一点。

那么这应该工作。


S
Steven

确保您的 Java 目录(在您的路径中找到)和您的 Python 解释器都位于其中没有空格的目录中。这些是我的问题的原因。


关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅