sc._jvm.org.apache.spark.streaming.kafka.KafkaUtilsPythonHelper()TypeError:使用时无法调用“ JavaPackage”对象

时间:2019-07-15 07:57:08

标签: apache-spark spark-streaming

我正在学习如何将sparkkafka集成在一起。目前,我创建了一个virtualenv并安装了pysparkpy4j个软件包。

我还配置了以下环境:

  1. PYSPARK_PYTHON:C:\learn_new\learn_utils\venv\Scripts\python.exe
  2. SPARK_HOME:C:\spark-2.4.3-bin-hadoop2.7

然后我想在C:\spark-2.4.3-bin-hadoop2.7\examples\src\main\python\streaming\direct_kafka_wordcount.py下运行示例python源代码

脚本代码是这样的:

    from __future__ import print_function
    import sys


    from pyspark import SparkContext
    from pyspark.streaming import StreamingContext
    from pyspark.streaming.kafka import KafkaUtils


    if __name__ == "__main__":
        if len(sys.argv) != 3:
            print("Usage: direct_kafka_wordcount.py <broker_list> <topic>", file=sys.stderr)
        sys.exit(-1)

    sc = SparkContext(appName="PythonStreamingDirectKafkaWordCount")
    ssc = StreamingContext(sc, 2)

    brokers, topic = sys.argv[1:]
    kvs = KafkaUtils.createDirectStream(ssc, [topic], {"metadata.broker.list": brokers})
    lines = kvs.map(lambda x: x[1])
    counts = lines.flatMap(lambda line: line.split(" ")) \
        .map(lambda word: (word, 1)) \
        .reduceByKey(lambda a, b: a+b)
    counts.pprint()

    ssc.start()
    ssc.awaitTermination()

virtualenv下运行python代码的命令行是这样的:

python --default --client --host localhost --port 60614 c:\spark-2.4.3-bin-hadoop2.7\examples\src\main\python\streaming\direct_kafka_wordcount.py kafka_host_name:9092 topic_name

然后我得到了这个错误:

    File "c:\spark-2.4.3-bin-hadoop2.7\examples\src\main\python\venv\lib\site-packages\pyspark\streaming\kafka.py", line 138, in createDirectStream
        helper = KafkaUtils._get_helper(ssc._sc)
    File "c:\spark-2.4.3-bin-hadoop2.7\examples\src\main\python\venv\lib\site-packages\pyspark\streaming\kafka.py", line 217, in _get_helper
        return sc._jvm.org.apache.spark.streaming.kafka.KafkaUtilsPythonHelper()
    TypeError: 'JavaPackage' object is not callable

这是什么问题? 非常感谢。

2 个答案:

答案 0 :(得分:0)

我主要想在本地调试代码,所以我不想使用spark-submit并添加--jars  或--packages参数来运行代码。

但是它确实需要spark-streaming-kafka-0-8-assembly_2.11-2.4.3.jar软件包。(请根据您的spark版本更改软件包版本)

所以我尝试下载该软件包并将其保存到C:\ spark-2.4.3-bin-hadoop2.7 \ jars(将其更改为您的spark安装路径,然后找到jars文件夹)。

然后问题解决了。希望对其他人有帮助。

答案 1 :(得分:0)

我遇到了类似的问题,只是将罐子分别添加到两个地方,所有地方都有火花。其次,将罐子添加到pyspark的罐子中,该罐子存放在当前python版本内的其他位置。而且有效