1、SparkStreaming簡介
-
1、
SparkStreaming是流式處理框架,是SparkAPI的擴展,支持可擴展、高 吞吐量、容錯的實時數據流處理,實時數據的來源可以是: Kafka, Flume, Twitter, ZeroMQ或者TCP sockets ,並且可以使用高級功能的複雜算子來 處理流數據。例如: map,reducejoin,window。最終,處理後的數據可以 存放在文件系統,數據庫等,方便實時展現。
-
2、 sparkstreaming與stome的區別:
1.Storm是純實時處理數據, SparkStreaming微批處理數據,可以通過控制間隔時間做到實時處理。 SparkStreaming相對於Storm來說,吞吐量大。
2.
Storm擅長處理簡單的彙總型業務。SparkStreaming擅長處理複雜的業務。Storm相對於SparkStreaming來說輕量級。SparkStreaming 中可以使用core或者sq|或者機器學習。。。
3.
Storm的事務與SparkStreaming不同, SparkStreaming可以管理事務。
4.
Storm支持動態的資源調度, Spark也是支持。
事務:事務必須服從ISO/IEC所制定的ACID原則。
ACID是原子性(atomicity)、一致性(consistency)、隔離性(isolation)和持久性(durability)的縮寫。事務的原子性表示事務執行過程中的任何失敗都將導致事務所做的任何修改失效。一致性表示當事務執行失敗時,所有被該事務影響的數據都應該恢復到事務執行前的狀態。隔離性表示在事務執行過程中對數據的修改,在事務提交之前對其他事務不可見。持久性表示已提交的數據在事務執行失敗時,數據的狀態都應該正確。
2、SparkStreaming的簡單理解
1.必須有一個 task一直監控着,9999端口的數據,
2.sparkstreaming中也有**transformation算子和action算子 不過sparkstreaming中,action叫outputoperator**
3、案例:用sparkstreaming實現Wordcount
1.結合虛擬機的端口監控來實現Sparkstaeaming的數據源
虛擬機命令:nc -lk 9999 來開啓一個端口
2.代碼:
def main(args: Array[String]): Unit = {
val conf = new SparkConf()
//因爲 一個線程用來監控集羣 一個線程用來處理數據
conf.setMaster("local[2]")
conf.setAppName("test")
// Durations.參數可以設置爲毫秒分鐘 這個是五秒
//注意:這裏創建對象有兩種方式 一種傳conf對象 一種傳 SparkContext對象
val ssc = new StreamingContext(conf,Durations.seconds(5))
demo01(ssc);
}
def demo01(ssc:StreamingContext): Unit ={
//設置 日誌減少
ssc.sparkContext.setLogLevel("Error")
/*socketTextStream*/
var lines: ReceiverInputDStream[String] = ssc.socketTextStream("hadoop110", 9999)
var flat_ds: DStream[String] = lines.flatMap(t => t.split(" "))
var map_ds: DStream[(String, Int)] = flat_ds.map(t => (t, 1))
val reduce_ds: DStream[(String, Int)] = map_ds.reduceByKey((t, t2) => t + t2)
//前一百行數據 outputoperator觸發懶執行的算子
reduce_ds.print(100)
// 因爲sparkStreaming 是一天24小時不間斷運行所以要開啓
ssc.start()
// 等待被終結
ssc.awaitTermination()
// 理論上這個 stop是走不到的 因爲永遠處在死循環狀態 因爲開啓就是無限循環 5秒一批次數據
ssc.stop(boolean)默認ture
//關閉ssc對象要不要把 Sparkcontext對象也回收掉呢 ture關閉 fales不關閉
}
4、結合webUi 來設置bacthIntval
-
最好bacthIntval接收數據的時間 與 處理的時間一致。
舉例:5秒一批次。交給集羣處理。處理的時間也是5秒。
如果集羣處理的慢,要麼增加集羣資源,要麼調節batch -
SparkStreaming一旦開啓,無法修改邏輯(修改代碼) ,就算你修改了他也不會執行。
6、foreachRdd特殊的算子
def demo01(ssc:StreamingContext): Unit ={
//設置 日誌減少
ssc.sparkContext.setLogLevel("Error")
/*socketTextStream*/
var lines: ReceiverInputDStream[String] = ssc.socketTextStream("hadoop110", 9999)
var flat_ds: DStream[String] = lines.flatMap(t => t.split(" "))
var map_ds: DStream[(String, Int)] = flat_ds.map(t => (t, 1))
val reduce_ds: DStream[(String, Int)] = map_ds.reduceByKey((t, t2) => t + t2)
*********************************************************************
//這裏的foreachRdd屬於懶執行算子
reduce_ds.foreachRDD(for_rdd=>{
//剛好我們的廣播變量就是要在driver端執行 既然每次執行就不要寫死每隔batch時間去讀外部文件一次
println("driver **廣播黑名單***")//在driver端每一批次都會執行一次 就是接收客戶端的請求,每一批次過來請求處理,
val filter_rdd: RDD[(String, Int)] = for_rdd.filter(one=>{
println("filter_rdd ************")//這些算子還是懶執行算子 必須用action算子觸發執行
true
})
val map_rdd: RDD[String] = for_rdd.map(lien => {
//在 集羣中的 execute端 沒有數據不會執行
println("map_rdd ************") //這些算子還是懶執行算子 必須用action算子觸發執行
lien + "6666666"
})
var sum: Long = map_rdd.count()
println("數據條數:"+sum)
})
reduce_ds.print(100)
ssc.start()
}
************注意代碼中的細節!