Spark Streaming的核心DStream之轉換操作實例

DStream的轉化操作

DStream API提供的與轉化操作相關的方法如下:
Spark Streaming的核心DStream之轉換操作實例

如下舉例詳解transform(func) 方法和 updateStateByKey(func) 方法:

(1)、transform(func) 方法

transform 方法及類似的 transformWith(func) 方法允許在 DStream 上應用任意 RDD-to-RDD 函數,它們可以被應用於未在 DStream API 中暴露的任何 RDD 操作中。
下面舉例演示如何使用transform(func) 方法將一行語句分隔成多個單詞,具體步驟如下:
A、在Liunx中執行命令nc –lk 9999 啓動服務器且監聽socket服務,並且輸入數據I like spark streaming and Hadoop,具體命令如下:
Spark Streaming的核心DStream之轉換操作實例
B、打開IDEA開發工具,創建一個Maven項目,並且配置pom.xml文件,引入Spark Streaming相關的依賴包,pom.xml文件配置具體如下:
<!--設置依賴版本號-->

<properties>
    <spark.version>2.1.1</spark.version>
    <scala.version>2.11</scala.version>
</properties>
<dependencies>
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-core_${scala.version}</artifactId>
        <version>${spark.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-streaming_${scala.version}</artifactId>
        <version>${spark.version}</version>
    </dependency>
</dependencies>

注意:配置好pom.xml文件後,需要在項目的/src/main和/src/test目錄下分別創建scala目錄。
C、在項目的/src/main/scala目錄下創建包,接着創建一個名爲TransformTest的scala類,主要用於編寫SparkStreaming應用程序,實現一行語句分隔成多個單詞的功能,具體代碼如下(帶註釋):

package SparkStreaming

import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.streaming.{Seconds, StreamingContext}
import org.apache.spark.streaming.dstream.{DStream, ReceiverInputDStream}

object TransformTest {
  def main(args: Array[String]): Unit = {
    //創建SparkConf對象
    val sparkconf = new SparkConf().setAppName("TransformTest").setMaster("local[2]")
    //創建SparkContext對象
    val sc = new SparkContext(sparkconf)
    //設置日誌級別
    sc.setLogLevel("WARN")
    //創建StreamingContext,需要創建兩個參數,分別爲SparkContext和批處理時間間隔
    val ssc = new StreamingContext(sc,Seconds(5))
    //連接socket服務,需要socket服務地址、端口號以及存儲級別(默認的)
    val dstream:ReceiverInputDStream[String] = ssc.socketTextStream("192.168.169.200",9999)
    //通過空格分隔
    val words:DStream[String] = dstream.transform(line => line.flatMap(_.split(" ")))
    //打印輸出結果
    words.print()
    //開啓流式計算
    ssc.start()
    //用於保護程序正常運行
    ssc.awaitTermination()
  }
}

D、運行程序可以看出,語句I like spark streaming and Hadoop在5s內被分割成6個單詞,結果如下圖:
Spark Streaming的核心DStream之轉換操作實例

(2)、 updateStateByKey(func) 方法

updateStateByKey(func) 方法可以保持任意狀態,同時允許不斷有新的信息進行更新。
下面舉例演示如何使用updateStateByKey(func) 方法進行詞頻統計:
在項目的/src/main/scala目錄下創建包,接着創建一個名爲UpdateStateByKeyTest的scala類,主要用於編寫SparkStreaming應用程序,實現詞頻統計,具體代碼如下:

package SparkStreaming

import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.streaming.{Seconds, StreamingContext}
import org.apache.spark.streaming.dstream.{DStream, ReceiverInputDStream}

object UpdateStateByKeyTest {

  def updateFunction(newValues:Seq[Int],runningCount:Option[Int]) : Option[Int] = {
    val newCount = runningCount.getOrElse(0)+newValues.sum
    Some(newCount)
  }
  def main(args: Array[String]): Unit = {
    //創建SparkConf對象
    val sparkconf = new SparkConf().setAppName("UpdateStateByKeyTest").setMaster("local[2]")
    //創建SparkContext對象
    val sc = new SparkContext(sparkconf)
    //設置日誌級別
    sc.setLogLevel("WARN")
    //創建StreamingContext,需要創建兩個參數,分別爲SparkContext和批處理時間間隔
    val ssc = new StreamingContext(sc,Seconds(5))
    //連接socket服務,需要socket服務地址、端口號以及存儲級別(默認的)
    val dstream:ReceiverInputDStream[String] = ssc.socketTextStream("192.168.169.200",9999)
    //通過逗號分隔第一個字段和第二個字段
    val words:DStream[(String,Int)] = dstream.flatMap(_.split(" ")).map(word => (word,1))
    //調用updateStateByKey操作
    var result:DStream[(String,Int)] = words.updateStateByKey(updateFunction)
    //如果用到updateStateByKey,此處要加上ssc.checkpoint("目錄")這一句,否則會報錯:
    // The checkpoint directory has not been set. Please set it by StreamingContext.checkpoint().
    //爲什麼要用到checkpoint?因爲之前的案例是沒有狀態的,用完之後就丟掉,不需要了,
    // 但是現在要用到之前的那些數據,要把之前的狀態保留下來
    //“.”的意思是當前目錄
    ssc.checkpoint(".")
    //打印輸出結果
    result.print()
    //開啓流式計算
    ssc.start()
    //用於保護程序正常運行
    ssc.awaitTermination()
  }
}

然後在9999端口不斷輸入單詞,具體內容如下:

Spark Streaming的核心DStream之轉換操作實例
運行程序從控制檯輸出的結果看出每隔5s接受一次數據,一共接受了兩次數據,並且每接受一次數據就會進行詞頻統計並輸出結果。
Spark Streaming的核心DStream之轉換操作實例

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章