maven工程下使用pyspark报错: key not found: _PYSPARK_DRIVER_CONN_INFO_PATH

 使用IDEA,安装了python插件,在Maven工程中使用pyspark。

执行下面这段代码的时候报错

# -*- encoding: utf-8 -*-
"""
Created on 16:07 2019/4/9

@author: fancyChuan
@email: [email protected]
@desc: 向spark传递函数 示例
"""
from pyspark import SparkConf, SparkContext


class SearchFunctionsWarn(object):
    """
    不推荐的写法,rdd.filter()传递函数的时候会把整个self都传递到集群上,可能self非常大
    """
    def __init__(self, query):
        self.query = query

    def isMatch(self, s):
        return self.query in s

    def getMatchesFunctionReference(self, rdd):
        return rdd.filter(self.isMathch)  # 有风险

    def getMatchesMemberReference(self, rdd):
        return rdd.filter(self.isMatch)  # 有风险


class SearchFunctionsRight(object):
    """
    推荐的写法,使用局部变量,把需要传递的内容赋值给局部变量,然后传递局部变量
    结论: 传递局部可序列化变量或者顶层函数始终是安全
    """
    def __init__(self, query):
        self.query = query

    def isMatch(self, s):
        return self.query in s

    def getMatchesFunctionReference(self, rdd):
        query = self.query
        return rdd.filter(lambda x: query in x)

    def getMatchesMemberReference(self, rdd):
        query = self.query
        return rdd.filter(lambda x: query in x)


if __name__ == "__main__":

    searchPython = SearchFunctionsWarn("Python")

    conf = SparkConf().setMaster("local").setAppName("passFunction")
    sc = SparkContext(conf=conf)
    linesRDD = sc.textFile("../resources/testfile.md")

    result = searchPython.getMatchesMemberReference(linesRDD)
    print(result.count())
    print(result.collect())

错误信息如下: 

Exception in thread "main" java.util.NoSuchElementException: key not found: _PYSPARK_DRIVER_CONN_INFO_PATH
    at scala.collection.MapLike$class.default(MapLike.scala:228)
    at scala.collection.AbstractMap.default(Map.scala:59)
    at scala.collection.MapLike$class.apply(MapLike.scala:141)
    at scala.collection.AbstractMap.apply(Map.scala:59)
    at org.apache.spark.api.python.PythonGatewayServer$.main(PythonGatewayServer.scala:64)
    at org.apache.spark.api.python.PythonGatewayServer.main(PythonGatewayServer.scala)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.spark.deploy.JavaMainApplication.start(SparkApplication.scala:52)
    at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:894)
    at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:198)
    at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:228)
    at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:137)
    at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)

查了很多资料,最后发现是我安装的spark版本与maven中使用的spark版本不一致

左边是修改前的,适配的是1.1.0版本的spark,而我本地安装的是2.3.3版本的。修改完pom.xml后正常

另外如果报  _PYSPARK_DRIVER_CALLBACK_HOST 的错误,很大概率也是版本不对应所引起的。排除思路是

1. 检查maven工程使用的spark版本

2. 检查本地安装的spark版本

3. 检查python下的pyspark包版本

4. 如果涉及代码更新(比如通过git),最好把maven依赖也重新导入,甚至重启IDEA

【总结】

1. 使用jupyter notebook启动pyspark,需要设置 PYSPARK_DRIVER_PYTHON,PYSPARK_DRIVER_PYTHON_OPTS 两个环节变量。从pyspark.cmd启动脚本可以发现,这个时候使用的是 %SPARK_HOME%/python 下面的pyspark包

2. 在Pycharm或者IDEA中使用pyspark包的时候,是找不到%SPARK_HOME%/python下面的包的,需要自己安装或者在代码中手动增加python查找路径(通过sys.path.append("xxxx"))

安装方法:

(1) 使用pip install pyspark==2.3.3 要注意自己使用的spark版本,这种方式需要下载200多MB的包

(2)从%SPARK_HOME%/python下面的 pyspark 文件夹 复制到 python的三方包目录下 ,比如 D:\ProgramData\Anaconda2\Lib\site-packages。然后在手动安装依赖包 pip install py4j 就可以

 

【参考资料】

1. https://stackoverflow.com/questions/50869366/issue-upgrading-to-spark-2-3-1-maintenance-release

2. http://discuss.itversity.com/t/getting-error-while-running-pyspark-in-pycharm-unable-to-load-native-hadoop-library-for-your-platform-using-builtin-java-classes-where-applicable/16587

 

你可能感兴趣的:(Spark)