需求
- Structured Streaming作为消费者读取kafka生产的内容
- 输出内容到控制台
案例
启动kafka生产者
kafka-console-producer.sh \
--broker-list mypc01:9092,mypc02:9092,mypc03:9092 \
--topic pet
import org.apache.spark.sql.streaming.OutputMode
import org.apache.spark.sql.{DataFrame, SparkSession}
object kafkaSource extends App {
//构建spark Session
private val session: SparkSession = SparkSession.builder().master("local[2]").appName("test")
.getOrCreate()
//读取kafka上内容,指定format为kafka,以及订阅主题,服务器地址
private val df: DataFrame = session.readStream.format("kafka")
.option("kafka.bootstrap.servers","mypc01:9092,mypc02:9092,mypc03:9092")
.option("subscribe","pet")
//可选项,设置offset
.option("staringOffsets", "earliest")
// 可选项,设置消费者组
.option("kafka.consumer.commit.groupid", "test1")
.load()
//输出数据到控制台
//不可以用show方法
df.writeStream
.outputMode(OutputMode.Update())
.format("console")
.start()
.awaitTermination()
}
之后利用生产者生产数据,即可在控制台看到输出,示例如下
因为没有key,所以为null,值的类型为二进制,需要处理一下才能看到
Batch: 4
-------------------------------------------
+----+-------+-----+---------+------+--------------------+-------------+
| key| value|topic|partition|offset| timestamp|timestampType|
+----+-------+-----+---------+------+--------------------+-------------+
|null|[64 64]| pet| 2| 399|2020-12-09 17:33:...| 0|
|null|[66 66]| pet| 0| 371|2020-12-09 17:33:...| 0|
|null|[65 65]| pet| 1| 388|2020-12-09 17:33:...| 0|
+----+-------+-----+---------+------+--------------------+-------------+
在上面代码的输出前加一句,解析二进制内容为字符串
private val df1: DataFrame = df.selectExpr("cast(value as String)")
输出结果示例
|value|
+-----+
| bb|
| cc|
+-----+
因为只选择了1列,所以只会输出一列,也可以多选
private val df1: DataFrame = df.selectExpr("cast(value as String)","offset")
结果示例如下
+-----+------+
|value|offset|
+-----+------+
| aa| 404|
+-----+------+
总结
- kafka source需要指定
format,kafka.bootstrap.servers
,以及subscribe
属性 - 从
kafka
读取的内容为二进制内容
,需要进行解码方便阅读