No module named 'pyspark.streaming.kafka'
一、問題描述
直接使用from pyspark.streaming.kafka import KafkaUtils
會提示這個錯誤。
二、解決方法
1、使用新的api
https://stackoverflow.com/questions/61891762/spark-3-x-integration-with-kafka-in-python
https://spark.apache.org/docs/latest/structured-streaming-kafka-integration.html
2、 spark 2.4.x 版本繼續使用pyspark.streaming.kafka
https://sandeepkattepogu.medium.com/streaming-data-from-apache-kafka-topic-using-apache-spark-2-4-5-and-python-4073e716bdca
因為伺服器spark版本為2.4.7,所以考慮使用
pyspark.streaming.kafka
。如連結中部落格所言,需要findspark模組。
import findspark
findspark.init()
from pyspark.streaming.kafka import KafkaUtils
這樣就不會報錯。
問題:findspark.init()
完成了什麼功能,使得可以找到pyspark.streaming.kafka
。
其核心原始碼如下:
if not spark_home: spark_home = find() if not python_path: python_path = os.environ.get("PYSPARK_PYTHON", sys.executable) # ensure SPARK_HOME is defined os.environ["SPARK_HOME"] = spark_home # ensure PYSPARK_PYTHON is defined os.environ["PYSPARK_PYTHON"] = python_path # add pyspark to sys.path spark_python = os.path.join(spark_home, "python") try: py4j = glob(os.path.join(spark_python, "lib", "py4j-*.zip"))[0] except IndexError: raise Exception( "Unable to find py4j, your SPARK_HOME may not be configured correctly" ) sys.path[:0] = [spark_python, py4j]
找到了環境變數中的SPARK_HOME
,/home/software/install/spark-2.4.7-bin-hadoop2.7
。同時把SPARK_HOME
下面的python目錄新增到系統變數中
/home/software/install/spark-2.4.7-bin-hadoop2.7/python
進入到該python目錄,可以發現存在pyspark/streaming/kafka.py
。ps:spark3.x 對應python目錄下沒有了kafka.py。
綜上所述:通過執行find.init()
,系統變數裡就有了/home/software/install/spark-2.4.7-bin-hadoop2.7/python
kafka.py
就可以import
匯入。這裡溫習
import
相關知識:https://blog.csdn.net/weixin_38256474/article/details/81228492
只要模組儲存到了
sys.path
中,python就可以找到它。