找不到密钥:_PYSPARK_DRIVER_CALLBACK_HOST

时间:2018-06-22 12:27:39

标签: python apache-spark pyspark

我正在尝试运行以下代码:

import pyspark
from pyspark.sql import SparkSession

spark = SparkSession.builder \
        .master("local") \
        .appName("Word Count") \
        .getOrCreate()

df = spark.createDataFrame([
    (1, 144.5, 5.9, 33, 'M'),
    (2, 167.2, 5.4, 45, 'M'),
    (3, 124.1, 5.2, 23, 'F'),
    (4, 144.5, 5.9, 33, 'M'),
    (5, 133.2, 5.7, 54, 'F'),
    (3, 124.1, 5.2, 23, 'F'),
    (5, 129.2, 5.3, 42, 'M'),
   ], ['id', 'weight', 'height', 'age', 'gender'])

df.show()
print('Count of Rows: {0}'.format(df.count()))
print('Count of distinct Rows: {0}'.format((df.distinct().count())))

spark.stop()

出现错误

18/06/22 11:58:39 ERROR SparkUncaughtExceptionHandler: Uncaught exception in thread Thread[main,5,main]
java.util.NoSuchElementException: key not found: _PYSPARK_DRIVER_CALLBACK_HOST
    ...
Exception: Java gateway process exited before sending its port number

我正在使用PyCharm和MacOS,Python 3.6,Spark 2.3.1

此错误的可能原因是什么?

6 个答案:

答案 0 :(得分:12)

此错误是版本不匹配的结果。在回溯(_PYSPARK_DRIVER_CALLBACK_HOST中引用的环境变量已在update Py4j dependency to 0.10.7期间删除,并在2.3.1中反向移植到2.3分支。

考虑版本信息:

  

我正在使用PyCharm和MacOS,Python 3.6,Spark 2.3.1

看起来您已经安装了2.3.1软件包,但是SPARK_HOME指向较旧(2.3.0或更早)的安装。

答案 1 :(得分:9)

我将要呈现的此分辨率还解决了“找不到密钥:_PYSPARK_DRIVER_CALLBACK_HOST / Java Gateway / PySpark 2.3.1”错误!添加到您的bashrc或/ etc / environment或/ etc / profile

export PYTHONPATH=$SPARK_HOME/python/:$PYTHONPATH
export PYTHONPATH=$SPARK_HOME/python/lib/py4j-0.8.2.1-src.zip:$PYTHONPATH

那应该在那做杜比。您可以提前感谢我。 #thumbsup:)

答案 2 :(得分:0)

.bash_profile或/ etc / profile中的env var可能无法被您的代码访问,请将它们直接放入代码中。

import os
import sys

os.environ['SPARK_HOME'] = "/opt/cloudera/parcels/SPARK2/lib/spark2"
os.environ['PYSPARK_SUBMIT_ARGS'] = "--master yarn pyspark-shell" 




sys.path.append(os.path.join(os.environ['SPARK_HOME'], "python"))
sys.path.append(os.path.join(os.environ['SPARK_HOME'], "python/lib/py4j-0.10.6-src.zip"))


try:
    from pyspark import SparkContext
    from pyspark.sql import SparkSession

    from pyspark import SparkConf

    print("success")

except ImportError as e:
    print("error importing spark modules", e)
    sys.exit(1)

答案 3 :(得分:0)

我有类似的错误: java.util.NoSuchElementException:找不到密钥:_PYSPARK_DRIVER_CALLBACK_HOST和 例外:Java网关进程在发送其端口号之前已退出

运行命令“ export PYTHONPATH = $ SPARK_HOME / python /:$ PYTHONPATH”或将其设置为.bashrc可解决此问题。

还请检查是否设置了映射器的credentails。

答案 4 :(得分:0)

我遇到了同样的问题,以上所有设置均不适用于我。实际上我已经设置了SPARK_HOME。最后的问题是因为我只是使用pip install pyspark安装了pyspark而没有验证版本。 在代码中进行了大量调试之后,弄清楚

内的 _PYSPARK_DRIVER_CALLBACK_HOST

anaconda3 / lib / python3.7 / site-packages / pyspark / java_gateway.py

没有此变量,而较早版本的pyspark有此变量(我使用的是anaconda,因此该文件路径位置。其他文件的确切位置可能有所不同)

最后得出的结论是这是由于版本不匹配所致。看起来非常愚蠢,但是我想这可能会帮助其他人很多调试时间。

解决方案是找出为2.3.0版安装的spark版本,然后确保安装相同版本pip install pyspark==2.3.0的pyspark。之后,它就像一种魅力。

注意:仅当我在python中调用 SparkSession.builder.appName 时,才会出现此问题。即使pysparkspark-submit命令的版本不匹配,它也能很好地工作,这就是为什么它轻易地跳过了我可能是由于版本不匹配的原因。

答案 5 :(得分:0)

pip install pyspark==2.3.0

还可以