val socketLineDStream: ReceiverInputDStream[String] = streamingContext.socketTextStream('linux1', 8888)
// TODO Driver中執行一次
// 例如val a = 1 在Driver中只執行一次
// 首先看一下DStream的其他Transformations(轉換)操作
socketLineDStream.map({
case x => {
// TODO Executor中執行n次(n是Executor數)
}
}
)
// 重點來了,看一下DStream的transform轉換操作
socketLineDStream.transform({
case rdd => {
// TODO Driver中執行m次(m是采集周期數)
rdd.map({
case x => {
//TODO Executor中執行n次(n是Executor數)
}
})
}
}
)
注意:
- transform中的注釋處的m就是細節之處,它可以保證此處運行在Driver中的代碼可以周期(SparkStreaming的資料采集周期)間變化,即每個資料周期transform走一遍,用處之一是黑名單的更新(比如惡意發帖的用戶的更新)
- 為什么DStream.map里面的代碼執行是在Executor?個人理解因為DStream在每個周期(批次)相當于就是一個RDD的封裝,所以可以類比RDD.map()里面的代碼是運行在Executor端
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/242809.html
標籤:其他
上一篇:安卓學習筆記34:默默作業的服務
下一篇:jsp,taglib匯入http://www.springframework.org/tags/form錯誤,無法在web.xml或使用此應用程式部署的jar檔案中決議絕對uri
