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

Pyspark: Exception: Java gateway process exited before sending the driver its port number

我正试图在macbook air上运行pyspark。 当我尝试启动它时,我收到错误:

1
Exception: Java gateway process exited before sending the driver its port number

当sc =启动时调用SparkContext()。 我试过运行以下命令:

1
2
3
./bin/pyspark
./bin/spark-shell
export PYSPARK_SUBMIT_ARGS="--master local[2] pyspark-shell"

无济于事。 我也看过这里:

Spark + Python - 在向驱动程序发送端口号之前退出Java网关进程?

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


这应该对你有帮助

一种解决方案是将pyspark-shell添加到shell环境变量PYSPARK_SUBMIT_ARGS中:

1
export PYSPARK_SUBMIT_ARGS="--master local[2] pyspark-shell"

python / pyspark / java_gateway.py有一个变化,如果用户设置了PYSPARK_SUBMIT_ARGS变量,则需要PYSPARK_SUBMIT_ARGS包含pyspark-shell。


一个可能的原因是没有设置JAVA_HOME,因为没有安装java。

我遇到了同样的问题。它说

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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()。我通过跑步解决了它

1
2
3
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


我的iphython笔记本(IPython 3.2.1)在Linux(ubuntu)上遇到了同样的问题。

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

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

例如

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

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


如果在Ubuntu上运行pyspark这条错误消息,请通过安装openjdk-8-jdk软件包来解决它

1
2
3
from pyspark import SparkConf, SparkContext
sc = SparkContext(conf=SparkConf().setAppName("MyApp").setMaster("local"))
^^^ error

安装Open JDK 8:

1
apt-get install openjdk-8-jdk-headless -qq


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

1
sudo rm -rf jdk-10.jdk/

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


即使我正确设置PYSPARK_SUBMIT_ARGS,我也得到了相同的Java gateway process exited......port number异常。我正在运行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异常就消失了,一切都很顺利。


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

将抛出错误,同时:

<5233>

将不会。

区别在于最后一个(工作)示例中的最后一个冒号,从包版本号中分离Scala版本号。


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

1
sudo update-alternatives --config java

并选择java版本


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

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


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


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


我有同样的例外,我通过设置和重置所有环境变量来尝试所有内容。但最后问题是在spark会话的appname属性中向下钻取空间,即"SparkSession.builder.appName("StreamingDemo")。getOrCreate()"。从给予appname属性的字符串中删除空格后,它立即得到解决。我在windows 10环境中使用了带有eclipse的pyspark 2.7。它对我有用。
随附的是必需的屏幕截图。Error_with space

No Error_without space


我使用下面的代码修复了这个错误。我已经设置了SPARK_HOME。您可以从eproblems网站关注这个简单的步骤

1
spark_home = os.environ.get('SPARK_HOME', None)

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

  • YourPath 火花2.2.1彬hadoop2.7 Python
  • YourPath 火花2.2.1彬hadoop2.7 python的 LIB py4j-0.10.4-src.zip

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

    那应该有用。


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


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


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


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

    1)分开下载hadoop。
    2)在你的PATH中加入hadoop
    3)将hadoop classpath添加到SPARK安装中

    前两个步骤是微不足道的,最后一步可以通过在每个spark节点(master和workers)中的$ SPARK_HOME / conf / spark-env.sh中添加以下内容来做到最好

    1
    2
    3
    ### in conf/spark-env.sh ###

    export SPARK_DIST_CLASSPATH=$(hadoop classpath)

    有关更多信息,请查看:https://spark.apache.org/docs/latest/hadoop-provided.html


    我用的是Mac OS。我解决了这个问题!

    以下是我修复它的方法。

    JDK8似乎工作正常。 (https://github.com/jupyter/jupyter/issues/248)

    所以我检查了我的JDK / Library / Java / JavaVirtualMachines,我在这条路径中只有jdk-11.jdk。

    我下载了JDK8(我按照链接)。
    这是:

    1
    2
    brew tap caskroom/versions
    brew cask install java8

    在此之后,我补充道

    1
    2
    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文件。 (你sholud检查你的jdk1.8文件名)

    它现在有效!
    希望这有帮助:)


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


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


    对于带有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上的ref:export命令)。验证:echo $JAVA_HOME
  • 为了永久设置,请在启动IDE / Jupyter / python解释器之前将上面的粗体线添加到运行的文件中。这可以通过将上面的粗体线添加到.bashrc。当bash以交互方式启动时加载此文件ref:.bashrc

  • 这个错误有很多原因。我的理由是:pyspark的版本与spark不兼容。
    pyspark版本:2.4.0,但spark版本是2.2.0。
    它始终会导致python在启动spark进程时始终失败。然后spark无法告诉它的端口是python。所以错误将是"Pyspark:例外:在向驱动程序发送端口号之前退出Java网关进程
    "。

    我建议你深入了解源代码,找出发生此错误的真正原因


    我有同样的错误。

    我的麻烦射击程序是:

  • 查看Spark源代码。
  • 请按照错误消息。就我而言:pyspark/java_gateway.py,第93行,launch_gateway
  • 检查代码逻辑以找到根本原因然后您将解决它。
  • 在我的情况下,问题是PySpark没有权限创建一些临时目录,所以我只用sudo运行我的IDE