No module named 'pyspark.streaming.kafka'


一、問題描述

spark版本:2.4.7
pyspark版本:3.1.1
直接使用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就可以找到它。

3、降低pyspark版本,舊的pyspark中自帶pyspark.streaming.kafka
https://stackoverflow.com/questions/63053460/no-module-named-pyspark-streaming-kafka-even-with-older-spark-version


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM