我正在尝试运行以下代码:
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
此错误的可能原因是什么?
答案 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而没有验证版本。
在代码中进行了大量调试之后,弄清楚
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
时,才会出现此问题。即使pyspark
和spark-submit
命令的版本不匹配,它也能很好地工作,这就是为什么它轻易地跳过了我可能是由于版本不匹配的原因。
答案 5 :(得分:0)
pip install pyspark==2.3.0
还可以