Structured streaming+kafka集成樣例

關(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ù)。

代碼解析

  1. 創(chuàng)建Spark Session. 無(wú)需多言,每個(gè)Spark程序都需要做的步驟。
    val spark = SparkSession
      .builder
      .appName("StructuredKafkaWordCount")
      .getOrCreate()
  1. 讀入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á)式描述
  1. wordcount
 val wordCounts = lines.flatMap(_.split(" ")).groupBy("value").count()

對(duì)每行的字符串分割成各個(gè)word, 然后count得到單詞出現(xiàn)的次數(shù)。

  1. 輸出
    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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容