Spark Streaming入門

騰訊雲加社群發表於2018-05-16

歡迎大家前往騰訊雲+社群,獲取更多騰訊海量技術實踐乾貨哦~

本文將幫助您使用基於HBase的Apache Spark Streaming。Spark Streaming是Spark API核心的一個擴充套件,支援連續的資料流處理。

什麼是Spark Streaming?

首先,什麼是流(streaming)?資料流是連續到達的無窮序列。流處理將不斷流動的輸入資料分成獨立的單元進行處理。流處理是對流資料的低延遲處理和分析。Spark Streaming是Spark API核心的擴充套件,可實現實時資料的快速擴充套件,高吞吐量,高容錯處理。Spark Streaming適用於大量資料的快速處理。實時處理用例包括:

  • 網站監控,網路監控
  • 欺詐識別
  • 網頁點選
  • 廣告
  • 物聯網感測器

Spark Streaming支援如HDFS目錄,TCP套接字,Kafka,Flume,Twitter等資料來源。資料流可以用Spark 的核心API,DataFrames SQL,或機器學習的API進行處理,並且可以被儲存到HDFS,databases或Hadoop OutputFormat提供的任何檔案系統中去。

Spark Straming如何工作

Spark Streaming將資料流每X秒分作一個集合,稱為Dstreams,它在內部是一系列RDD。您的Spark應用程式使用Spark API處理RDD,並且批量返回RDD操作的結果。

示例應用程式的體系結構

Spark Streaming示例程式碼執行以下操作:

  • 讀取流式資料。
  • 處理流資料。
  • 將處理後的資料寫入HBase表。

其他Spark示例程式碼執行以下操作:

  • 讀取流媒體程式碼編寫的HBase Table資料
  • 計算每日彙總的統計資訊
  • 將彙總統計資訊寫入HBase表

示例資料集

油泵感測器資料檔案放入目錄中(檔案是以逗號為分隔符的CSV)。Spark Streaming將監視目錄並處理在該目錄中建立的所有檔案。(如前所述,Spark Streaming支援不同的流式資料來源;為簡單起見,此示例將使用CSV。)

以下是帶有一些示例資料的csv檔案示例:

我們使用Scala案例類來定義與感測器資料csv檔案相對應的感測器模式,並使用parseSensor函式將逗號分隔值解析到感測器案例類中。

HBase表格模式

流資料的HBase表格模式如下:

  • 泵名稱日期和時間戳的複合行鍵
  • 可以設定報警列簇,來監控資料。請注意,資料和警報列簇可能會設為在一段時間後失效。

日常統計彙總的模式如下所示:

  • 泵名稱和日期的複合行鍵
  • 列簇統計
  • 最小值,最大值和平均值。

下面的函式將Sensor物件轉換為HBase Put物件,該物件用於將資料行插入到HBase中。

寫HBase表的配置

您可以使用Spark 的TableOutputFormat類寫入HBase表,這與您從MapReduce寫入HBase表的方式類似。下面我們使用TableOutputFormat類設定HBase的配置。

Spark Streaming示例程式碼

這些是Spark Streaming程式碼的基本步驟:

  1. 初始化Spark StreamingContext物件。
  2. 將轉換和輸出操作應用於DStream。
  3. 開始接收資料並使用streamingContext.start()處理它。
  4. 等待streamingContext.awaitTermination()的返回從而停止處理。

我們將通過示例應用程式程式碼完成這些步驟。

初始化StreamingContext

首先,我們建立一個StreamingContext,這是流式傳輸的主要入口點(2秒間隔時間)。

val sparkConf =  new  SparkConf ( ) . setAppName ( "HBaseStream" )
// 建立 StreamingContext, 流式函式的主要入口
val ssc =  new  StreamingContext ( sparkConf ,  Seconds ( 2 ) )複製程式碼

接下來,我們使用StreamingContext textFileStream(directory)方法建立一個輸入流,該輸入流監視Hadoop相容的檔案系統以獲取新檔案,並處理在該目錄中建立的所有檔案。

// 建立代表資料 DStream物件
val linesDStream = ssc . textFileStream ( "/user/user01/stream" )複製程式碼

linesDStream代表資料流,每個記錄都是一行文字。內部DStream是一系列RDD,每個批處理間隔一個RDD。

將轉換和輸出操作應用於DStream

接下來,我們將資料行解析為Sensor物件,並使用DStream行上的map操作。

// 把lineDSream的每一行解析為Sensor物件
val sensorDStream = linesDStream . map ( Sensor . parseSensor )複製程式碼

map操作在linesDStream中的RDD上使用Sensor.parseSensor函式,從而生成Sensor物件(RDD)。

接下來,我們使用DStream foreachRDD方法將處理應用於此DStream中的每個RDD。我們過濾低psi感測器物件以建立警報,然後我們通過將感測器和警報資料轉換為Put物件並使用PairRDDFunctions saveAsHadoopDataset方法將感測器和警報資料寫入HBase ,該方法使用Hadoop將RDD輸出到任何支援Hadoop的儲存系統,該儲存系統的配置物件(請參閱上面的HBase的Hadoop配置)。

// 對每一個RDD. 
sensorRDD . foreachRDD { rdd =>
// 低psi的感測器過濾器 
val alertRDD = rdd . filter ( sensor => sensor . psi <  5.0 )
// 把感測器資料轉為物件並寫入HD
rdd . map ( Sensor . convertToPut ) . saveAsHadoopDataset (jobConfig )
// 把警報轉為物件並寫入HD
rdd . map ( Sensor . convertToPutAlert ) . saveAsHadoopDataset (jobConfig )
}複製程式碼

sensorRDD物件被轉換並寫入HBase。

開始接收資料

要開始接收資料,我們必須在StreamingContext上顯式呼叫start(),然後呼叫awaitTermination來等待計算完成。

// 開始計算
ssc . start ( )
// 等待計算完成
ssc . awaitTermination ( )複製程式碼

Spark R寫入HBase

現在我們要讀取HBase感測器表資料,計算每日摘要統計資訊並將這些統計資訊寫入。

以下程式碼讀取HBase表,感測器表,psi列資料,使用StatCounter計算此資料的統計資料,然後將統計資料寫入感測器統計資料列。

// HBase的讀取設定 
val conf = HBaseConfiguration . create ( )
conf . set ( TableInputFormat . INPUT_TABLE , HBaseSensorStream . tableName )
// 掃描資料
conf . set ( TableInputFormat . SCAN_COLUMNS ,  "data:psi" ) 
// 載入RDD (row key, row Result)元組
val hBaseRDD = sc . newAPIHadoopRDD ( conf , classOf [TableInputFormat ] ,
classOf [ org . apache . hadoop . hbase . io . ImmutableBytesWritable ] ,
classOf [ org . apache . hadoop . hbase . client . Result ] )
// 把(row key, row Result) 元組為RDD
val resultRDD = hBaseRDD.map(tuple => tuple._2)
// 轉為 RDD (RowKey, ColumnValue), 移除Time
val keyValueRDD = resultRDD.
              map(result => (Bytes.toString(result.getRow()).
              split(" ")(0), Bytes.toDouble(result.value)))
// 分組,得到統計資料
val keyStatsRDD = keyValueRDD.
             groupByKey().
             mapValues(list => StatCounter(list))
// 轉碼rowkey,統計資訊放入並寫入hbase
keyStatsRDD.map { case (k, v) => convertToPut(k, v)}.saveAsHadoopDataset(jobConfig)複製程式碼

下圖顯示newAPIHadoopRDD的輸出。PairRDDFunctions saveAsHadoopDataset將Put物件儲存到HBase。

軟體

執行程式

您可以將程式碼作為獨立應用程式執行,如“MapR Sandbox上的Spark入門教程”中所述。

以下是總的步驟:

  1. 按照MapR沙箱入門Spark中的介紹,使用者ID user01,密碼mapr。
  2. 使用maven構建應用程式。
  3. 使用scp將jar檔案和資料檔案複製到沙盒主目錄/ user / user01。
  4. 執行應用程式:/ opt / mapr / spark / spark- <version> / bin / spark-submit --driver-class -pathhbase classpath --class examples.HBaseSensorStream sparkstreamhbaseapp-1.0.jar
  5. 將流式資料檔案複製到流目錄中:cp sensordata.csv /user/user01/stream/
  6. 讀取資料並計算一列的資料/ opt / mapr / spark / spark- <version> / bin / spark-submit --driver-class -path hbase classpath - --class examples.HBaseReadWrite sparkstreamhbaseapp-1.0.jar
  7. 計算整行的統計資訊/ opt / mapr / spark / spark- <version> / bin / spark-submit --driver-class -path hbase classpath - --class examples.HBaseReadRowWriteStats sparkstreamhbaseapp-1.0.jar

總結

這就結束了關於使用HBase進行Spark Streaming的教程。您可以在相關閱讀部分找到更多資訊。

問答
如何使用MySQL和ApacheSPark?
相關閱讀
Spark Streaming程式設計指南
Spark Streaming應用與實戰全攻略
簡談Spark Streaming的實時計算整合

此文已由作者授權騰訊雲+社群釋出,原文連結:https://cloud.tencent.com/developer/article/1123173?fromSource=waitui


相關文章