说明:本文意在对源码进行分析,说明Spark SQL加载kafka数据并将查询结果写出到kafka的过程,如果错误,欢迎指出,大家共同进步 ^ _ ^。
一、加载kafka数据的代码样例
// 这段代码加载kafka数据源,指定了数据源格式,topic、bootstrap server、offset信息等
Dataset<Row> dataset = this.sparkSession.readStream().format("kafka")
.options(this.getSparkKafkaCommonOptions(sparkSession))
.option("kafka.bootstrap.servers", ConfigConstMdt.MDT_STREAMING_KAFKA_SERVERS)
.option("subscribe", ConfigConstMdt.MDT_STREAMING_KAFKA_TOPICS)
.option("startingOffsets", ConfigConstMdt.MDT_STREAMING_KAFKA_OFFSETS)
.load();
我们看看load源码
def load(): DataFrame = {
// 这里的source就是.format("kafka")中的"kafka"
if (source.toLowerCase(Locale.ROOT) == DDLUtils.HIVE_PROVIDER) {
throw new AnalysisException("Hive data source can only be used with tables, you can not " +
"read files of Hive data source directly.")
}
// 1 、这里得到的ds是一个KafkaSourceProvider实例
val ds = DataSource.lookupDataSource(source, sparkSession.sqlContext.conf).newInstance()
// 2、v1DataSource 确切地讲是对kafka数据源基本信息(配置、schema)的一种封装
val v1DataSource = DataSource(
sparkSession,
userSpecifiedSchema = userSpecifiedSchema,
className = source,
options = extraOptions.toMap)
val v1Relation = ds