为什么spark-submit失败并出现“AnalysisException:kafka不是有效的Spark SQL数据源”?

时间:2017-06-29 11:42:43

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

我使用Spark 2.1.0和Kafka 0.10.2.1。

我编写了一个Spark应用程序,它从Kafka主题中读取数据集。

代码如下:

package com.example;

import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.sql.SparkSession;

import org.apache.spark.sql.SQLContext;
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;

public class MLP {

    public static void main(String[] args) {
        SparkSession spark = SparkSession
            .builder()
            .appName("MLP")
            .getOrCreate();

        Dataset<Row> df = spark
            .read()
            .format("kafka")
            .option("kafka.bootstrap.servers","localhost:9092,localhost:9093")
            .option("subscribe", "resultsTopic")
            .load();
        df.show();
        spark.stop();
    }
}

我的部署脚本如下:

spark-submit \
  --verbose \
  --jars${echo /home/hduser1/spark/jars/*.jar | tr ' ' ',') \
  --packages org.apache.spark:spark-sql-kafka-0-10_2.11:2.10 \
  --class com.**** \
  --master (Spark Master URL) /path/to/jar 

然而我收到错误:

Exception in thread "main" org.apache.spark.sql.AnalysisException:
kafka is not a valid Spark SQL Data Source.;

我尝试将相同的应用程序与非Jafka数据源一起使用,并正确创建了数据帧。我也尝试在客户端模式下使用yarn,我也得到了同样的错误。

2 个答案:

答案 0 :(得分:3)

Kafka作为非流数据框架的数据源 - 数据集将可从Spark 2.2,reference in this issue on Spark JIRA

获得

正如@JacekLaskowski所提到的,将包更改为(修改后的Jacek版本使用2.2):

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

更重要的是,使用readStream来读取数据流。

您不能将show用于流数据源,而是使用console格式。

StreamingQuery query = df.writeStream()
  .outputMode("append")
  .format("console")
  .start();

query.awaitTermination();

See this link

答案 1 :(得分:1)

首先,您应该使用以下内容替换--packages org.apache.spark:spark-sql-kafka-0-10_2.11:2.10(我怀疑有效):

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

我认为版本2.10不可用。如果您使用2.1.0(而不是2.1.0),您可能已经考虑过2.10可能有效。

其次,除了一些额外的罐子,比如Kafka来源的罐子,除去Spark加载的--jars${echo /home/hduser1/spark/jars/*.jar | tr ' ' ',')

这应该可以让您访问kafka源格式。