为什么spark-submit会忽略我作为spark会话配置的一部分包含的软件包?

问题描述 投票:0回答:1

我正在尝试将org.apache.spark:spark-sql-kafka-0-10_2.11:2.4.3软件包作为我的Spark代码的一部分(通过SparkSession Builder创建)。我了解我可以自己下载JAR并将其包含在内,但我想弄清楚为什么以下各项无法按预期进行:

from pyspark.sql import SparkSession
import pyspark
import json

if __name__ == "__main__":
    spark = SparkSession.builder \
        .master("local") \
        .appName("App Name") \
        .config("spark.jars.packages", "org.apache.spark:spark-sql-kafka-0-10_2.11:2.4.3") \
        .getOrCreate()

    df = spark \
        .readStream \
        .format("kafka") \
        .option("kafka.bootstrap.servers", "localhost:9092") \
        .option("subscribe", "first_topic") \
        .load() \
        .selectExpr("CAST(key AS STRING)", "CAST(value AS STRING)")

    query = df \
        .writeStream \
        .format("console") \
        .outputMode("update") \
        .start()

当我执行工作时:

spark-submit main.py

我收到以下错误:

py4j.protocol.Py4JJavaError: An error occurred while calling o48.load.
: org.apache.spark.sql.AnalysisException: Failed to find data source: kafka. Please deploy the application as per the deployment section of "Structured Streaming + Kafka Integration Guide".;
    at org.apache.spark.sql.execution.datasources.DataSource$.lookupDataSource(DataSource.scala:652)
    at org.apache.spark.sql.streaming.DataStreamReader.load(DataStreamReader.scala:161)
    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 py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:244)
    at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:357)
    at py4j.Gateway.invoke(Gateway.java:282)
    at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132)
    at py4j.commands.CallCommand.execute(CallCommand.java:79)
    at py4j.GatewayConnection.run(GatewayConnection.java:238)
    at java.lang.Thread.run(Thread.java:748)

如果我改为通过--packages标志包含软件包,则将下载依赖项,并且代码将按预期运行:

spark-submit --packages org.apache.spark:spark-sql-kafka-0-10_2.11:2.4.3 main.py

如果打开PySpark shell并将代码粘贴到上面,代码也将起作用。是否有spark-submit忽略配置的原因?

apache-spark pyspark apache-spark-sql
1个回答
0
投票

我认为对于“ spark.jars.packages”之类的配置,应将它们配置为spark-defaults或通过命令行参数传递,在运行时进行设置不起作用。


更好的判断

[我记得有人声称这种方法对他们有用,但我会说依赖项已经存在于此(安装在本地仓库中),刚刚被加载。

conf = pyspark.SparkConf()
conf.set("spark.jars.packages", "org.apache.spark:spark-sql-kafka-0-10_2.11:2.4.3")

spark = SparkSession.builder \
        .master("local") \
        .appName("App Name") \
        .config(conf = conf) \
        .getOrCreate()
© www.soinside.com 2019 - 2024. All rights reserved.