RuntimeError: Java gateway process exited before sending its port number,求大佬解答

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RuntimeError: Java gateway process exited before sending its port number,求大佬解答相关的知识,希望对你有一定的参考价值。

在pycharm中使用pyspark时出现了RuntimeError: Java gateway process exited before sending its port number
完整代码:
from pyspark import SparkConf,SparkContext
from pyspark.sql import SparkSession

import os
os.environ['JAVA_HOME'] = 'C:\\Program Files (x86)\\Java\\jdk1.8.0_121' # 这里的路径为java的bin目录所在路径

conf = SparkConf().setMaster("local[*]").setAppName("test_spark_app")
sc = SparkContext(conf=conf)
print(sc.version)
完整提示信息:
Traceback (most recent call last):
File "F:\Python_learning\PySpark.py", line 9, in <module>
sc = SparkContext(conf=conf)
^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\Administrator\AppData\Roaming\Python\Python311\site-packages\pyspark\context.py", line 195, in __init__
SparkContext._ensure_initialized(self, gateway=gateway, conf=conf)
File "C:\Users\Administrator\AppData\Roaming\Python\Python311\site-packages\pyspark\context.py", line 417, in _ensure_initialized
SparkContext._gateway = gateway or launch_gateway(conf)
^^^^^^^^^^^^^^^^^^^^
File "C:\Users\Administrator\AppData\Roaming\Python\Python311\site-packages\pyspark\java_gateway.py", line 106, in launch_gateway
raise RuntimeError("Java gateway process exited before sending its port number")
RuntimeError: Java gateway process exited before sending its port number

这个错误通常是由于Java或Spark配置问题引起的。下面是几种可能的解决方法:

    检查Java是否正确安装并配置在系统环境变量中,确认环境变量JAVA_HOME的值是否正确,可以尝试在终端窗口中运行java命令来确认Java是否可以正常运行。

    确认Spark的版本与Java版本是否兼容,可以通过在Spark官方网站查看Spark版本和Java版本之间的兼容性矩阵。

    检查防火墙或网络代理是否阻止Spark与Java通信。尝试关闭防火墙或暂时禁用网络代理,然后再次运行代码。

    尝试在SparkConf中设置spark.driver.host属性,如下所示:

    pythonCopy codeconf = SparkConf().setMaster("local[*]").setAppName("test_spark_app") \\
    .set("spark.driver.host", "127.0.0.1")

    这将指示Spark驱动程序使用指定的IP地址作为其主机名,可以尝试设置为本地IP地址。

    尝试删除.pycache目录。如果您使用Python 3,可能会在代码文件所在的目录中找到.pycache目录,其中可能会包含与Spark上下文相关的缓存文件。尝试删除.pycache目录并重新运行代码。

追问

如何查看spark版本呢,而且我只安装了pyspark,难道下载pyspark会默认下载spark吗

追答

在Python中,可以通过Pyspark的版本来确定所使用的Spark版本。您可以通过以下代码查看Pyspark的版本:
pythonCopy codeimport pysparkprint(pyspark.__version__)

这将输出安装的Pyspark版本号。一般情况下,Pyspark会依赖于Spark,所以在安装Pyspark时会自动下载并安装Spark。如果您已经安装了Pyspark,则可以假设Spark已经正确安装。但是,您可以尝试运行以下代码来检查Spark的版本:
pythonCopy codefrom pyspark.sql import SparkSession

spark = SparkSession.builder.appName("test").getOrCreate()print(spark.version)

这将创建一个SparkSession对象并打印出Spark的版本。如果这段代码能够正常运行并输出版本号,则可以确认Spark已经正确安装。

追问

没有正确打印出Spark,那我该怎么搞呢

参考技术A 这是由于Java网关进程在发送端口号之前退出导致的报错。可能的原因有:1、Java网关进程没有正确启动;2、Java网关进程可能已经被杀死;3、Java网关进程可能已经被其他程序占用;4、Java网关进程可能已经被系统终止。追问

那该怎么解决呢

multiprocessing进程开发RuntimeError

windows环境下multiprocessing报如下异常信息:

RuntimeError:

An attempt has been made to start a new process before the
current process has finished its bootstrapping phase.

This probably means that you are not using fork to start your
child processes and you have forgotten to use the proper idiom
in the main module:

if __name__ == ‘__main__‘:
freeze_support()
...

The "freeze_support()" line can be omitted if the program
is not going to be frozen to produce an executable.

解决办法:

在启进程的代码前面添加 if __name__ == "__main__":

代码如下:

import multiprocessing as mp
import os
import time

def th1():
    print("this is th1,the time is {0}".format(time.ctime()))
    #getppid获取父进程ID, getpid获取当前进程ID
    print("th1",os.getppid(), "---", os.getpid())

def setproc():
    p1 = mp.Process(target = th1)
    p1.start()
    print("main", os.getppid(), "---", os.getpid())
    
if __name__ == "__main__":
    #p1 = mp.Process(target = th1)
    #p1.start()

    setproc()
    print("main end")

 

 

 







以上是关于RuntimeError: Java gateway process exited before sending its port number,求大佬解答的主要内容,如果未能解决你的问题,请参考以下文章

API-GATEWAY 不起作用。抛出 java.net.UnknownHostException:无法解决

RuntimeError:python 多处理错误

Python:循环数据时继续通过“RuntimeError”

RuntimeError: tf.placeholder() 与急切执行不兼容

Java如何捕获应用程序的Runtime error

RuntimeError:预期的标量类型 Double 但发现 Float