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

时间:2015-08-05 19:45:42

标签: java python macos apache-spark pyspark

我试图在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?

但问题从未得到解答。请帮忙!感谢。

35 个答案:

答案 0 :(得分:19)

这应该可以帮到你

一种解决方案是将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。

答案 1 :(得分:18)

一个可能的原因是没有设置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

答案 2 :(得分:4)

Linux(ubuntu)上的iphython笔记本(IPython 3.2.1)存在同样的问题。

在我的案例中缺少的是在$ PYSPARK_SUBMIT_ARGS环境中设置主URL(假设您使用bash):

export PYSPARK_SUBMIT_ARGS="--master spark://<host>:<port>"

e.g。

export PYSPARK_SUBMIT_ARGS="--master spark://192.168.2.40:7077"

您可以将其放入.bashrc文件中。您在spark主服务器的日志中获得了正确的URL(使用/sbin/start_master.sh启动主服务器时会报告此日志的位置)。

答案 3 :(得分:2)

我将在此处重新发布 how I solved it 以供将来参考。

我是如何解决类似问题的

先决条件:

  1. anaconda 已经安装
  2. 已安装 Spark (https://spark.apache.org/downloads.html)
  3. pyspark 已安装 (https://anaconda.org/conda-forge/pyspark)

我做的步骤(注意:根据您的系统设置文件夹路径)

<块引用>
  1. 设置以下环境变量。
  2. SPARK_HOME 到“C:\spark\spark-3.0.1-bin-hadoop2.7”
  3. 将 HADOOP_HOME 设置为“C:\spark\spark-3.0.1-bin-hadoop2.7”
  4. 将 PYSPARK_DRIVER_PYTHON 设置为“jupyter”
  5. 将 PYSPARK_DRIVER_PYTHON_OPTS 设置为“笔记本”
  6. 添加'C:\spark\spark-3.0.1-bin-hadoop2.7\bin;'到 PATH 系统变量。
  7. 直接在C下更改java安装文件夹:(之前java安装在Program文件下,所以我直接重新安装 在 C:) 下
  8. 所以我的 JAVA_HOME 会变成这样 'C:\java\jdk1.8.0_271'

现在。它有效!

答案 4 :(得分:2)

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

sudo rm -rf jdk-10.jdk/

之后,请下载JDK 8然后问题就解决了。

答案 5 :(得分:1)

即使我正确设置Java gateway process exited......port number,我也遇到了相同的PYSPARK_SUBMIT_ARGS异常。我正在运行Spark 1.6并试图让pyspark与IPython4 / Jupyter(OS:ubuntu作为VM guest)一起工作。

虽然我遇到了这个异常,但我注意到生成了一个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设置增加了为我的ubuntu分配的内存,并重新启动了guest ubuntu。然后这个Java gateway例外消失了,一切都很顺利。

答案 6 :(得分:1)

我有一个相同的例外,我通过设置和重置所有环境变量来尝试所有操作。但是最终问题是在spark会话的appname属性中深入到了空间,即“ SparkSession.builder.appName(“ StreamingDemo”)。getOrCreate()”。从给appname属性的字符串中删除空间后,它立即得到解决。我在Windows 10环境中使用带有eclipse的pyspark 2.7。它为我工作。 随附必需的屏幕截图。Error_with space

No Error_without space

答案 7 :(得分:1)

对于您使用的Java版本,Spark非常挑剔。强烈建议您使用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

答案 8 :(得分:1)

如果您的计算机中未安装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

答案 9 :(得分:1)

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

答案 10 :(得分:1)

如果此错误消息在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    

答案 11 :(得分:1)

I figured out the problem in Windows system. The installation directory for Java must not have blanks in the path such as in C:\Program Files. I re-installed Java in C\Java. I set JAVA_HOME to C:\Java and the problem went away.

答案 12 :(得分:1)

我在使用 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。

答案 13 :(得分:1)

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

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

答案 14 :(得分:1)

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

sudo update-alternatives --config java 

并选择java版本

答案 15 :(得分:1)

当我尝试使用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版本号

答案 16 :(得分:0)

您可以简单地在终端中运行以下代码。那么,我希望这能解决您的错误。

sudo apt-get install default-jdk

答案 17 :(得分:0)

当我使用 Docker 容器启动 Spark 时,我遇到了同样的问题。原来我为 /tmp 文件夹设置了错误的权限。 如果spark对/tmp没有写权限,也会导致这个问题。

答案 18 :(得分:0)

使用32位jdk-1.8时出现此错误 切换到64位对我有用。

我收到此错误是因为32位Java不能分配超过Spark驱动程序(16G)所需的3G堆内存:

builder = SparkSession.builder \
        .appName("Spark NLP") \
        .master("local[*]") \
        .config("spark.driver.memory", "16G") \
        .config("spark.serializer", "org.apache.spark.serializer.KryoSerializer") \
        .config("spark.kryoserializer.buffer.max", "1000M") \
        .config("spark.driver.maxResultSize", "0")

我测试了使其达到2G,它也可以在32位上工作。

答案 19 :(得分:0)

当尝试使用远程spark.driver.host运行从Airflow触发的pyspark作业时,出现了相同的问题。就我而言,问题的原因是:

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

...

线程“ main”中的异常java.lang.Exception:使用主线程“ yarn”运行时,必须在环境中设置HADOOP_CONF_DIR或YARN_CONF_DIR。

通过添加导出来解决:

export HADOOP_CONF_DIR=/etc/hadoop/conf

并且在pyspark脚本中添加了相同的环境变量:

import os
os.environ["HADOOP_CONF_DIR"] = '/etc/hadoop/conf'

答案 20 :(得分:0)

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

尝试安装JAVA并执行pyspark语句。 可以

答案 21 :(得分:0)

该错误通常发生在您的系统未安装 java 时。

检查你是否安装了java,打开终端并执行 java --version

始终建议使用 brew install 来安装软件包。 brew install openjdk@11 用于安装 java

既然您已经安装了 java,请根据您使用的 shell 全局设置路径:Z shell 或 bash。

  1. cmd + shift + H:回家
  2. cmd + shift + [.]:查看隐藏文件(zshenv 或 bash_profile)并将其中一个文件保存在 export JAVA_HOME=/usr/local/opt/openjdk@11

答案 22 :(得分:0)

我使用以下代码修复了此错误。我已经设置了SPARK_HOME。您可以从eproblems website

开始执行以下简单步骤
spark_home = os.environ.get('SPARK_HOME', None)

答案 23 :(得分:0)

此错误有很多原因。我的原因是:pyspark的版本与spark不兼容。 pyspark版本:2.4.0,但是spark版本是2.2.0。 它总是导致python在启动spark进程时总是失败。那么spark无法将其端口告知python。因此错误将是“ Pyspark:异常:在发送驱动程序端口号之前退出了Java网关进程 “。

我建议您深入研究源代码以找出发生此错误的真正原因

答案 24 :(得分:0)

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

  1. 通过以下方式将Java 8设置为默认值: sudo update-alternatives --config java 。如果未安装Jave 8,请通过以下方式安装: sudo apt install openjdk-8-jdk
  2. 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
  3. 为了永久设置此属性,请在启动IDE / Jupyter / python解释器之前,将上面的粗体行添加到运行的文件中。这可以通过将上面的粗体行添加到 .bashrc 来实现。交互式启动bash时加载此文件ref: .bashrc

答案 25 :(得分:0)

在我的情况下,这是因为我写了SPARK_DRIVER_MEMORY=10而不是SPARK_DRIVER_MEMORY=10g中的spark-env.sh

答案 26 :(得分:0)

我使用Mac OS。我已解决问题!

下面是我的解决方法。

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文件名)

现在可以使用! 希望有帮助:)

答案 27 :(得分:0)

如果您尝试在没有hadoop二进制文件的情况下运行spark,则可能会遇到上述错误。一种解决方案是:

1)单独下载hadoop。
2)将hadoop添加到您的PATH
3)在您的SPARK安装中添加hadoop类路径

前两个步骤很简单,最后一个步骤最好是在每个Spark节点(主节点和工作节点)的$ 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

答案 28 :(得分:0)

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

答案 29 :(得分:0)

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

那应该起作用。

答案 30 :(得分:0)

对我来说,答案是在“文件”->“项目结构”->“模块”(在IntelliJ中)添加两个“内容根”:

  1. YourPath \ spark-2.2.1-bin-hadoop2.7 \ python
  2. YourPath \ spark-2.2.1-bin-hadoop2.7 \ python \ lib \ py4j-0.10.4-src.zip

答案 31 :(得分:0)

我有同样的错误。

我的故障排除程序是:

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

在我的情况下,问题是PySpark没有创建临时目录的权限,因此我只能使用sudo运行IDE

答案 32 :(得分:0)

上班时间。我的问题是Java 10安装。我卸载它并安装了Java 8,现在Pyspark正常工作。

答案 33 :(得分:0)

我有同样的例外:安装java jdk为我工作。

答案 34 :(得分:0)

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