nc -lk 9999
StreamingContext多種寫法測試
import org.apache.spark.streaming.{Seconds, StreamingContext}
val ssc = new StreamingContext(sc, Seconds(10))
val lines = ssc.socketTextStream("hadoop000",9999)
val results = lines.flatMap(_.split(",")).map((_,1)).reduceByKey(_+_)
results.print()
ssc.start()
ssc.awaitTermination()
關於控制檯沒輸出,需要設置虛擬機核數大於1
conf的方式
import org.apache.spark.streaming.{Seconds, StreamingContext}
val ssc = new StreamingContext(sc.getConf, Seconds(10))
val lines = ssc.socketTextStream("hadoop000",9999)
val results = lines.flatMap(_.split(",")).map((_,1)).reduceByKey(_+_)
results.print()
ssc.start()
ssc.awaitTermination()
報錯,只能創建一個sparkContext傳入conf,會創建一個sparkcontext
關於Streaming要注意的點
1.一旦已經啓動了一個context,就沒有新的計算加進來,就是start後寫業務代碼是無效的。
2.一旦一個context被停止了,他就不能被重啓。
3.同一時間只有一個streamingcontext是活的,在一個JVM裏。
receiver佔一個線程。沒有其他線程處理數據。core的數量大於receiver的數量ReceiverInputDStream 一直接受數據
receiver和mv
receiver讀socket會要創建副本之類的,hdfs不用receiver讀,因爲hdfs上本就有副本。
假設streaming讀的數據是在/spark/text/下,在streaming啓動後,flume之類的採集數據不是直接採集到這的,而是採集到hdfs的其他地方,再從其他地方mv過來的,不是hdfs put上去的,put慢。之所以沒有直接put到那個目錄,是怕可能在一個批次的時間到了還沒沒put完就開始讀取了,而mv快。
在streaming啓動之前的數據不會被讀取,文件處理後再更新也不會重讀的