關(guān)于structured streaming, spark社區(qū)已經(jīng)有很多文章介紹,個(gè)人認(rèn)為其中最大的特點(diǎn)是將流視作沒(méi)有邊界的大表,從而能夠使用sql來(lái)操作這張表,其中包括使用sql join(截止Spark2.1.1,目前只支持streaming和靜態(tài)表之間的join,還不支持多條流之間的join ‘期待社區(qū)大招 ’)。
消息隊(duì)列 Kafka
Kafka作為一個(gè)開(kāi)源的消息隊(duì)列,在流處理應(yīng)用中應(yīng)用非常廣泛,比較典型的架構(gòu)是: Storm + kafka + Redis 或者 Spark Streaming + Kafka + Redis。Kafka一般作為數(shù)據(jù)源,流計(jì)算引擎例如Storm或者Spark streaming從Kafka中讀取數(shù)據(jù),這樣保證了流處理數(shù)據(jù)源的低延遲。在Structured Streaming之前,已經(jīng)很好的和Spark做了集成。
管中窺豹之 Structured Streaming
盡管在Spark2.1.1中Structured streaming還處于Alpha版本,但是已經(jīng)提供了一些example程序,可以試著跑跑。本文使用2.1.1中提供的structured streaming集成Kafka的樣例 - StructuredKafkaWordCount
詳細(xì)的代碼請(qǐng)戳: https://github.com/apache/spark/blob/master/examples/src/main/scala/org/apache/spark/examples/sql/streaming/StructuredKafkaWordCount.scala
具體來(lái)看,本例提供了一個(gè)簡(jiǎn)單的Structured Streaming wordCount程序,從Kafka中讀取文本數(shù)據(jù),然后在流中對(duì)讀入的文本進(jìn)行word拆分并統(tǒng)計(jì)各word出現(xiàn)的次數(shù)。
代碼解析
- 創(chuàng)建Spark Session. 無(wú)需多言,每個(gè)Spark程序都需要做的步驟。
val spark = SparkSession
.builder
.appName("StructuredKafkaWordCount")
.getOrCreate()
- 讀入Kafka
val lines = spark
.readStream
.format("kafka")
.option("kafka.bootstrap.servers", bootstrapServers)
.option(subscribeType, topics)
.load()
.selectExpr("CAST(value AS STRING)")
.as[String]
format("kafka") 表示讀取的類(lèi)型是Kafka,kafka.bootstrap.servers 用來(lái)設(shè)置Kafka的broker。subscribeType 表示訂閱類(lèi)型,包括'assign', 'subscribe', 'subscribePattern'。
- 如果設(shè)置為assign, 那么相應(yīng)的值就要設(shè)置為消費(fèi)的topic及partition,例如{"topicA":[0,1],"topicB":[2,4]}。
- 如果設(shè)置為subscribe,相應(yīng)的值為消費(fèi)的topic list.
- 如果設(shè)置為subscribePattern,相應(yīng)的正則表達(dá)式描述
- wordcount
val wordCounts = lines.flatMap(_.split(" ")).groupBy("value").count()
對(duì)每行的字符串分割成各個(gè)word, 然后count得到單詞出現(xiàn)的次數(shù)。
- 輸出
val query = wordCounts.writeStream
.outputMode("complete")
.format("console")
.start()
把結(jié)果輸出到終端,輸出模式為complete模式。
運(yùn)行
Spark2.1.1發(fā)布的包中已經(jīng)包含了此例子,直接在spark環(huán)境中提交作業(yè)就可以
- 提交命令
spark-submit --packages org.apache.spark:spark-sql-kafka-0-10_2.11:2.1.0 --master yarn-client --class org.apache.spark.examples.sql.streaming.StructuredKafkaWordCount /usr/hdp/2.6.0.3-8/spark2/examples/jars/spark-examples_2.11-2.1.0.2.6.0.3-8.jar ai01:6667 subscribe test
```
其中test topic為從某個(gè)文本中讀取到kafka中的內(nèi)容。
tail -n 0 -f zookeeper.log | /usr/hdp/2.6.0.3-8/kafka/bin/kafka-console-producer.sh --broker-list ai01:6667 --sync --topic test
-
Spark界面查看作業(yè)
從作業(yè)監(jiān)控看到,目前structured streaming的作業(yè)并不像之前的spark streaming作業(yè)一樣有個(gè)streaming的標(biāo)簽,可以看到每個(gè)batch讀取的記錄以及處理情況展示。不知道是還有待完善還是以后就這樣了. :)
屏幕快照 2017-07-05 下午5.11.11.png