本期內容:算法
1 Spark Streaming另類在線實驗數據庫
2 瞬間理解Spark Streaming本質瀏覽器
object OnlineBlackListFilter { def main(args: Array[String]){ /** * 第1步:建立Spark的配置對象SparkConf,設置Spark程序的運行時的配置信息,例如說經過setMaster來設置程序要連接的Spark集羣的Master的URL,若是設置 * 爲local,則表明Spark程序在本地運行,特別適合於機器配置條件很是差(例如只有1G的內存)的初學者 */ val conf = new SparkConf() //建立SparkConf對象 conf.setAppName("OnlineBlackListFilter") //設置應用程序的名稱,在程序運行的監控界面能夠看到名稱 conf.setMaster("spark://Master:7077") //此時,程序在Spark集羣 //val ssc = new StreamingContext(conf, Seconds(30)) //由30s改成300s val ssc = new StreamingContext(conf, Seconds(300)) /** * 黑名單數據準備,實際上黑名單通常都是動態的,例如在Redis或者數據庫中,黑名單的生成每每有複雜的業務邏輯,具體狀況算法不一樣,可是在Spark Streaming進行處理的時候每次都能工訪問完整的信息 */ val blackList = Array(("hadoop", true),("mahout", true)) val blackListRDD = ssc.sparkContext.parallelize(blackList, 8) val adsClickStream = ssc.socketTextStream("Master", 9999) /** * 此處模擬的廣告點擊的每條數據的格式爲:time、name 此處map操做的結果是name、(time,name)的格式 */ val adsClickStreamFormatted = adsClickStream.map { ads => (ads.split(" ")(1), ads) } adsClickStreamFormatted.transform(userClickRDD => { //經過leftOuterJoin操做既保留了左側用戶廣告點擊內容的RDD的全部內容,又得到了相應點擊內容是否在黑名單中 val joinedBlackListRDD = userClickRDD.leftOuterJoin(blackListRDD) /** * 進行filter過濾的時候,其輸入元素是一個Tuple:(name,((time,name), boolean)) * 其中第一個元素是黑名單的名稱,第二元素的第二個元素是進行leftOuterJoin的時候是否存在在值 * 若是存在的話,表面當前廣告點擊是黑名單,須要過濾掉,不然的話則是有效點擊內容; */ val validClicked = joinedBlackListRDD.filter(joinedItem => { if(joinedItem._2._2.getOrElse(false)) { false } else { true } }) validClicked.map(validClick => {validClick._2._1}) }).print /** * 計算後的有效數據通常都會寫入Kafka中,下游的計費系統會從kafka中pull到有效數據進行計費 */ ssc.start() ssc.awaitTermination() } }
圖中的描述從上到下依次以下:微信
Spark Streaming接收Kafka、Flume、HDFS和Kinesis等各類來源的實時輸入數據,進行處理後,處理結果保存在HDFS、Databases等各類地方。框架
Spark Streaming接收這些實時輸入數據流,會將它們按批次劃分,而後交給Spark引擎處理,生成按照批次劃分的結果流。機器學習
Spark Streaming提供了表示連續數據流的、高度抽象的被稱爲離散流的DStream。DStream本質上表示RDD的序列。任何對DStream的操做都會轉變爲對底層RDD的操做。socket
Spark Streaming使用數據源產生的數據流建立DStream,也能夠在已有的DStream上使用一些操做來建立新的DStream。分佈式
DStream特性:oop
DStream是一個沒有邊界的集合,沒有大小的限制。學習
DStream表明了時空的概念。隨着時間的推移,裏面不斷產生RDD。
鎖定到時間段後,就是空間的操做。也就是對本時間段的對應批次的數據的處理
下面介紹Spark Streaming內部實現原理:
Spark Streaming程序轉換爲DStream Graph
使用Spark Streaming編寫的程序與編寫Spark程序很是類似,在Spark程序中,主要經過操做RDD(Resilient Distributed Datasets彈性分佈式數據集)提供的接口,如map、reduce、filter等,實現數據的批處理。
而在Spark Streaming中,則經過操做DStream(表示數據流的RDD序列)提供的接口,這些接口和RDD提供的接口相似。
DStream Graph轉換爲Spark jobs
Spark Streaming把程序中對DStream的操做轉換爲DStream Graph,對於每一個時間片,DStream Graph都會產生一個RDD Graph;針對每一個輸出操做(如print、foreach等),Spark Streaming都會建立一個Spark action;對於每一個Spark action,Spark Streaming都會產生一個相應的Spark job,並交給JobManager。JobManager中維護着一個Jobs隊列, Spark job存儲在這個隊列中,JobManager把Spark job提交給Spark Scheduler,Spark Scheduler負責調度Task到相應的Spark Executor上執行。
Spark Streaming的另外一大優點在於其容錯性,RDD會記住建立本身的操做,每一批輸入數據都會在內存中備份,若是因爲某個結點故障致使該結點上的數據丟失,這時能夠經過備份的數據在其它結點上重算獲得最終的結果。
正如Spark Streaming最初的目標同樣,它經過豐富的API和基於內存的高速計算引擎讓用戶能夠結合流式處理,批處理和交互查詢等應用。所以Spark Streaming適合一些須要歷史數據和實時數據結合分析的應用場合。固然,對於實時性要求不是特別高的應用也能徹底勝任。另外經過RDD的數據重用機制能夠獲得更高效的容錯處理。
本章總結:
1.Spark Streaming自己很像Spark Core之上的一個應用程序,內部經過調用Spark Core的RDD接口對數據進行處理;
2.Spark Application中能夠啓動不少的Job,不一樣的Job能夠相互配合,從而構建出複雜的、大型的應用程序;
3.DStream內部是轉換爲一系列的RDD去運行;
特別感謝王家林老師的獨具一格的講解:
王家林老師名片:
中國Spark第一人
新浪微博:http://weibo.com/ilovepains
微信公衆號:DT_Spark
博客:http://blog.sina.com.cn/ilovepains
QQ:1740415547
YY課堂:天天20:00現場授課頻道68917580