我使用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,我也得到了同样的错误。
答案 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();
答案 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
源格式。