【问题标题】:Pyspark: Exception: Java gateway process exited before sending the driver its port numberPyspark:异常:Java 网关进程在向驱动程序发送其端口号之前退出
【发布时间】:2015-10-28 18:15:04
【问题描述】:

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

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

【问题讨论】:

标签: java python macos apache-spark pyspark


【解决方案1】:

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

【讨论】:

【解决方案2】:

这里有许多有价值的提示,但是,没有一个能完全解决我的问题,所以我将展示在 Windows 上的 Anaconda Jupyter Notebook 中工作的过程:

  • 在没有空格的目录中下载并安装 java 和 pyspark。
  • [可能不需要] 在 anaconda 提示符下,键入 where condawhere python 并使用 Windows 环境变量工具将 .exe 文件目录的路径添加到您的 Path 变量中。在此处添加变量 JAVA_HOMESPARK_HOME 及其对应的路径。
  • 即使这样做,我也必须在 Notebook 中手动设置这些变量以及 PYSPARK_SUBMIT_ARGS(使用您自己的 SPARK_HOMEJAVA_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 findsparkfindspark.init()

  • 运行from pyspark.sql import SparkSessionspark = 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

【讨论】:

    【解决方案3】:

    步骤: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 代码, 你永远不会看到这样的错误。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        该错误通常发生在您的系统未安装 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 下的任一文件

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

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

            sudo apt-get install default-jdk
            

            【讨论】:

              【解决方案8】:

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

              【讨论】:

                【解决方案9】:

                我将在此处转发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 files下,所以我直接重新安装了 在 C 下:)
                8. 所以我的 JAVA_HOME 会变成这样 'C:\java\jdk1.8.0_271'

                现在。它有效!

                【讨论】:

                  【解决方案10】:

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

                  我收到此错误是因为 32 位 java 无法分配 spark 驱动程序所需的超过 3G 堆内存 (16G):

                  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 位中运行。

                  【讨论】:

                    【解决方案11】:

                    在尝试使用远程 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'
                    

                    【讨论】:

                      【解决方案12】:

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

                      【讨论】:

                        【解决方案13】:

                        由于机器上没有安装 JAVA 而发生错误。 Spark 是在 Scala 中开发的,通常在 JAVA 上运行。

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

                        【讨论】:

                          【解决方案14】:

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

                          【讨论】:

                          • 如何在Windows上安装openjdk-8-jdk-headless?
                          【解决方案15】:

                          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

                          【讨论】:

                            【解决方案16】:

                            我使用下面的代码修复了这个错误。我已经设置了 SPARK_HOME。你可以按照eproblems website的这个简单步骤进行操作

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

                            【讨论】:

                              【解决方案17】:

                              这个错误有很多原因。我的原因是:pyspark 的版本与 spark 不兼容。 pyspark 版本:2.4.0,但 spark 版本是 2.2.0。 它总是导致python在启动火花过程时总是失败。然后 spark 无法将其端口告诉 python。所以错误将是“Pyspark:异常:Java 网关进程在向驱动程序发送其端口号之前退出 ”。

                              我建议你深入源码,找出这个错误发生的真正原因

                              【讨论】:

                                【解决方案18】:

                                对于存在 JAVA_HOME 问题的 Linux (Ubuntu 18.04),关键是将其指向 ma​​ster 文件夹:

                                1. 通过 sudo update-alternatives --config java 将 Java 8 设置为默认值。如果未安装 Jave 8,请通过以下方式安装:sudo apt install openjdk-8-jdk
                                2. JAVA_HOME 环境变量设置为ma​​ster 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

                                【讨论】:

                                  【解决方案19】:

                                  我有同样的例外,我通过设置和重置所有环境变量尝试了一切。但问题最终深入到 spark session 的 appname 属性中的空间,即“SparkSession.builder.appName("StreamingDemo").getOrCreate()”。从赋予 appname 属性的字符串中删除空间后,它立即得到解决。我在 windows 10 环境中使用 pyspark 2.7 和 eclipse。它对我有用。 随信附上截图。

                                  【讨论】:

                                    【解决方案20】:

                                    就我而言,这是因为我在spark-env.sh 中写了SPARK_DRIVER_MEMORY=10 而不是SPARK_DRIVER_MEMORY=10g

                                    【讨论】:

                                      【解决方案21】:

                                      我使用 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 没有任何作用。
                                      【解决方案22】:

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

                                      【讨论】:

                                        【解决方案23】:

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

                                        【讨论】:

                                          【解决方案24】:

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

                                          那应该可以了。

                                          【讨论】:

                                            【解决方案25】:

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

                                            【讨论】:

                                              【解决方案26】:

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

                                              【讨论】:

                                                【解决方案27】:

                                                我有同样的错误。

                                                我的故障排除程序是:

                                                1. 查看 Spark 源代码。
                                                2. 遵循错误消息。就我而言:pyspark/java_gateway.py,第 93 行,launch_gateway
                                                3. 检查代码逻辑找到根本原因,然后你会解决它。

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

                                                【讨论】:

                                                  【解决方案28】:

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

                                                  【讨论】:

                                                    【解决方案29】:

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

                                                    sudo rm -rf jdk-10.jdk/
                                                    

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

                                                    【讨论】:

                                                      【解决方案30】:

                                                      在这方面的工作时间。我的问题是安装 Java 10。我卸载了它并安装了 Java 8,现在 Pyspark 可以工作了。

                                                      【讨论】:

                                                      • 但是如果你输入 java -version 会显示另一个版本而不是 8?
                                                      猜你喜欢
                                                      • 1970-01-01
                                                      • 1970-01-01
                                                      • 2019-06-08
                                                      • 2017-07-15
                                                      • 2018-09-12
                                                      • 2015-10-27
                                                      • 1970-01-01
                                                      相关资源
                                                      最近更新 更多