SODBASE CEP學習進階篇(七):SODBASE CEP與Spark streaming集成

基於內存RDD的Spark框架相比Hadoop MapReduce框架有許多獨特的優點,在越來越多項目中得到應用。Spark計算框架包括其Streaming組件,是批處理(Lamda架構中Batch Layer)的思路。若要在使用Spark的同時,

1)不修改Spark streaming代碼和重啓應用,實現多場景流式計算、規則管理

2)實現低延時關聯模式實時分析

可將SODBASE CEP和Spark結合來使用。這樣,可以方便地使用SODBASE EPL管理規則,也實現低延時,實現許多完全滑動窗口(非批滑動窗口)規則和複雜規則監測。


示例操作步驟

本文通過實例介紹如何將SODBASE CEP的輸出通過Spark streaming保存爲HDFS文件。

(1)使用SODBASE CEP的PubSub適配器輸出數據

對應的適配器類爲com.sodbase.outputadaptor.socket.pubsub.SocketPubSubStringOutputAdaptor,示例CEP模型如下

規則爲Google的股票報價5000毫秒內出現了3次

SELECT T1.name AS name,T1.price+T2.price+T3.price AS sumprice 
FROM T1:模擬股票,T2:模擬股票,T3:模擬股票 
PATTERN T1;T2;T3  
WHERE T1.name='Google' AND T2.name='Google'AND T3.name='Google'  
WITHIN 5000 

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<GraphModelData>
    <CEPSoftwareVersion>2</CEPSoftwareVersion>
    <inputAdaptors>
        <inputAdaptorClassName>com.sodbase.inputadaptor.EventGeneratorInputAdaptor</inputAdaptorClassName>
        <adaptorParams>模擬股票</adaptorParams>
        <adaptorParams>1000</adaptorParams>
        <isExternal>false</isExternal>
    </inputAdaptors>
    <SODSQLs>CREATE QUERY socketouput SELECT T1.name AS name,T1.price+T2.price+T3.price AS sumprice FROM T1:模擬股票,T2:模擬股票,T3:模擬股票 PATTERN T1;T2;T3  WHERE T1.name='Google' AND T2.name='Google'AND T3.name='Google'  WITHIN 5000 </SODSQLs>
    <outputAdaptors>
        <isOutputAsSelection>true</isOutputAsSelection>
        <outputAdaptorClassName>com.sodbase.outputadaptor.socket.pubsub.SocketPubSubStringOutputAdaptor</outputAdaptorClassName>
        <adaptorParams>19999</adaptorParams>
        <adaptorParams>-1</adaptorParams>
        <isExternal>false</isExternal>
        <queryName>socketouput</queryName>
    </outputAdaptors>
    <modelName>socketouput</modelName>
    <modelVersion>1.0</modelVersion>
    <modelDescription></modelDescription>
</GraphModelData>

通過SODBASE CEP運行此模型


(2)Spark程序訪問socket 19999端口,接收SODBASE CEP的數據

package example.streaming

import org.apache.spark.streaming.StreamingContext
import org.apache.spark.SparkConf
import org.apache.spark.streaming.Seconds
import org.apache.spark.storage.StorageLevel

object Main {
  def main(args:Array[String])
  {
    val sparkConf = new SparkConf().setAppName("Main")
    val ssc = new StreamingContext(sparkConf, Seconds(60))

    val lines = ssc.socketTextStream("localhost", 19999, StorageLevel.MEMORY_AND_DISK_SER)
    //lines.print
    lines.saveAsTextFiles("streamfile", "txt")
    ssc.start()
    ssc.awaitTermination()
    
    
  }

}

也可以在Spark環境中運行此程序,將localhost改爲SODBASE CEP運行的服務器IP地址

val lines = ssc.socketTextStream("ip", 19999, StorageLevel.MEMORY_AND_DISK_SER)

即可以接收SODBASE CEP傳過來的流數據了

注:完全滑動窗口(非批量滑動窗口),例如監測一個人5分鐘內登錄系統三次則觸發事件,是指他任意三次登錄在5分鐘完成內即滿足規則,如三次登錄的時間爲10:50分30秒、10:53分25秒、10:55分05秒。而像批量滑動窗口如10:50~10:55,10:50~:11:00,或1分鐘滑動量的10:50~10:55,10:51~10:57,10:52~10:57分批滑動窗口,Spark streaming都難以監測速度層(Speed Layer)這樣的規則事件,需要和SODBASE CEP配合使用。


實際規則管理示例和Kafka運用 參考:

SODBASE CEP學習進階篇(七)續:SODBASE CEP與Spark streaming集成-規則管理

SODBASE CEP用於輕鬆、高效實施數據監測、監控類、實時交易類項目微笑。EPL語法見SODSQL寫法與示例。圖形化建模請使用SODBASE Studio嵌入式方式編程參見運行第一個EPL例子。與Storm集成參見EPL與Storm集成緩存擴展參見與分佈式緩存集成


發佈了40 篇原創文章 · 獲贊 1 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章