我正在学习如何将spark
与kafka
集成在一起。目前,我创建了一个virtualenv
并安装了pyspark
,py4j
个软件包。
我还配置了以下环境:
C:\learn_new\learn_utils\venv\Scripts\python.exe
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
这是什么问题? 非常感谢。
答案 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版本内的其他位置。而且有效