除非使用--packages,为什么spark-submit无法找到kafka数据源?

时间:2017-09-01 13:44:24

标签: maven apache-spark apache-kafka apache-spark-sql spark-structured-streaming

我正在尝试将Kafka集成到我的Spark应用程序中,这是我的POM文件所需条目:

<dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-streaming-kafka-0-10_2.11</artifactId>
        <version>${spark.stream.kafka.version}</version>
</dependency>
<dependency>
        <groupId>org.apache.kafka</groupId>
        <artifactId>kafka_2.11</artifactId>
        <version>${kafka.version}</version>
</dependency>

相应的工件版本是:

<kafka.version>0.10.2.0</kafka.version>
<spark.stream.kafka.version>2.2.0</spark.stream.kafka.version>

我一直在挠头:

Exception in thread "main" java.lang.ClassNotFoundException: Failed to find data source: kafka. Please find packages at http://spark.apache.org/third-party-projects.html

我也尝试为jar提供--jars参数,但它没有帮助。我在这里错过了什么?

代码:

private static void startKafkaConsumerStream() {

        Dataset<HttpPackage> ds1 = _spark
                .readStream()
                .format("kafka")
                .option("kafka.bootstrap.servers", getProperty("kafka.bootstrap.servers"))
                .option("subscribe", HTTP_FED_VO_TOPIC)
                .load() // Getting the error here
                .as(Encoders.bean(HttpPackage.class));

        ds1.foreach((ForeachFunction<HttpPackage>)  req ->System.out.print(req));

    }

_spark定义为:

_spark = SparkSession
                .builder()
                .appName(_properties.getProperty("app.name"))
                .config("spark.master", _properties.getProperty("master"))
                .config("spark.es.nodes", _properties.getProperty("es.hosts"))
                .config("spark.es.port", _properties.getProperty("es.port"))
                .config("spark.es.index.auto.create", "true")
                .config("es.net.http.auth.user", _properties.getProperty("es.net.http.auth.user"))
                .config("es.net.http.auth.pass", _properties.getProperty("es.net.http.auth.pass"))
                .getOrCreate();

我的进口商品是:

import org.apache.kafka.clients.producer.Producer;
import org.apache.kafka.common.serialization.StringDeserializer;
import org.apache.kafka.common.serialization.StringSerializer;
import org.apache.spark.api.java.function.ForeachFunction;
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Encoders;
import org.apache.spark.sql.SparkSession;

然而,当我运行我提到的代码here并且使用包选项时:

--packages org.apache.spark:spark-sql-kafka-0-10_2.11:2.1.0

它有效

3 个答案:

答案 0 :(得分:3)

Spark Structured Streaming支持使用外部kafka-0-10-sql模块将Apache Kafka作为流媒体源和接收器。

kafka-0-10-sql模块不适用于使用spark-submit提交执行的Spark应用程序。该模块是外部模块,并且可以将其定义为依赖项。

除非您在Spark应用程序中使用kafka-0-10-sql特定于模块的代码,否则您不必在dependency中将模块定义为pom.xml。您根本不需要模块上的编译依赖,因为没有代码使用模块的代码。您对接口进行编码,这是Spark SQL使用起来非常愉快的原因之一(即,只需很少的代码就可以拥有相当复杂的分布式应用程序)。

spark-submit但是需要--packages命令行选项,您已经报告它运行良好。

  

然而,当我运行我在这里提到的代码时,使用的是package选项:

--packages org.apache.spark:spark-sql-kafka-0-10_2.11:2.1.0

它与--packages一起使用的原因是你必须告诉Spark基础设施在哪里找到kafka格式的定义。

这将我们引向另一个&#34;问题&#34; (或要求)使用Kafka运行流式Spark应用程序。您必须在spark-sql-kafka模块上指定运行时依赖性

使用--packages命令行选项指定运行时依赖项(在spark-submit Spark应用程序之后下载必要的jar)或创建所谓的uber-jar(或胖块) )。

pom.xml发挥作用的地方(这就是为什么人们使用pom.xml和模块作为dependency提供帮助的原因。)

因此,首先,您必须在pom.xml中指定依赖项。

<dependency>
  <groupId>org.apache.spark</groupId>
  <artifactId>spark-sql-kafka-0-10_2.11</artifactId>
  <version>2.2.0</version>
</dependency>

最后但并非最不重要的是,你必须使用Apache Maven Shade Plugin构建一个在pom.xml中配置的超级jar。

使用Apache Maven Shade插件,您create an Uber JAR将包含所有&#34;基础设施&#34;使用kafka格式,在Spark应用程序jar文件中。事实上,优步JAR将包含所有必要的运行时依赖性,因此您可以单独使用jar spark-submit(并且没有--packages选项或类似的选项。)

答案 1 :(得分:1)

将以下依赖项添加到您的pom.xml文件中。

<dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-sql-kafka-0-10_2.11</artifactId>
        <version>2.2.0</version>
</dependency>

答案 2 :(得分:0)

更新您的依赖项和版本。下面给出的依赖项应该可以正常工作:

    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-core_2.11</artifactId>
        <version>2.1.1</version>
        <scope>provided</scope>
    </dependency>

    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-streaming_2.11</artifactId>
        <version>2.1.1</version>
        <scope>provided</scope>
    </dependency>

    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-streaming-kafka-0-10_2.11</artifactId>
        <version>2.1.1</version>
    </dependency>

PS:注意在前两个依赖项中提供了范围。