基於內存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集成。緩存擴展參見與分佈式緩存集成。