日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Spark Executor内幕

發(fā)布時(shí)間:2025/5/22 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spark Executor内幕 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Spark Executor工作原理

ExecutorBackend注冊

Executor實(shí)例化

Executor具體是如何工作的?



?

CoarseGrainedExecutorBackend,粗粒度的ExecutorBackend進(jìn)程。

Worker為什么要啟動(dòng)另外一個(gè)進(jìn)程?

Worker本身是管理當(dāng)前機(jī)器上的資源,變動(dòng)資源的時(shí)候向Master匯報(bào)。有很多應(yīng)用程序,就需要很多Executor。這樣程序之間不會一個(gè)奔潰導(dǎo)致所有的都奔潰。

1.CoarseGrainedExecutorBackend啟動(dòng)時(shí),向Driver注冊Executor其實(shí)質(zhì)是注冊ExecutorBackend實(shí)例,和Executor實(shí)例之間沒有直接的關(guān)系!!!

2.CoarseGrainedExecutorBackendExecutor運(yùn)行所在的進(jìn)程名稱,Executor才是真正在處理Task的對象,Executor內(nèi)部是通過線程池的方式來完成Task的計(jì)算的。

3. CoarseGrainedExecutorBackendExecutor是一一對應(yīng)的。

4. CoarseGrainedExecutorBackend是一個(gè)消息通信體(其實(shí)現(xiàn)了ThreadSafeRpcEndpoint)。可以發(fā)送信息給Driver,并可以接收Driver中發(fā)過來的指令,例如啟動(dòng)Task等。

5.Driver進(jìn)程中,有兩個(gè)至關(guān)重要的Endpoint

a)第一個(gè)就是ClientEndpoint,主要負(fù)責(zé)向Master注冊當(dāng)前的程序;是AppClient的內(nèi)部成員。

b)另外一個(gè)就是DriverEndpoint,這是整個(gè)程序運(yùn)行時(shí)候的驅(qū)動(dòng)器!!是CoarseGrainedExecutorBackend的內(nèi)部成員。

6.Driver中通過ExecutorData封裝并注冊ExecutorBackend的信息到Driver的內(nèi)存數(shù)據(jù)結(jié)構(gòu)ExecutorMapData中。ExecutorMapDataCoarseGrainedSchedulerBackend的成員。最終是注冊給CoarseGrainedSchedulerBackend

private[cluster]?class?ExecutorData(
???
val?executorEndpoint: RpcEndpointRef,
???val?
executorAddress: RpcAddress,
???override val?
executorHost:?String,
???var?
freeCores:?Int,
???override val?
totalCores:?Int,
???override val?
logUrlMap:?Map[String,?String]
)?
extends?ExecutorInfo(executorHost,?totalCores,?logUrlMap)

?

7.實(shí)際在執(zhí)行的時(shí)候,DriverEndpoint會把信息寫入CoarseGrainedSchedulerBackend的內(nèi)存數(shù)據(jù)結(jié)構(gòu)ExecutorMapData中,所以說最終是注冊給CoarseGrainedSchedulerBackend,也就是說CoarseGrainedSchedulerBackend掌握了為當(dāng)前程序分配的所有的ExucutorBackend進(jìn)程,而在每一個(gè)ExecutorBackend進(jìn)程實(shí)例中會通過Executor對象來負(fù)責(zé)具體Task的運(yùn)行。在欲行的時(shí)候使用syschronized關(guān)鍵字來保證ExecutorMapData安全的并發(fā)寫操作。

8.CoarseGrainedExecutorBackend收到DriverEndpoint發(fā)送過來的RegisteredExecutor消息后會啟動(dòng)Executor實(shí)例對象,而Executor實(shí)例對象是事實(shí)上負(fù)責(zé)真正Task計(jì)算的。

?

Executor是如何工作的?

1.當(dāng)Driver發(fā)送過來Task的時(shí)候,其實(shí)是發(fā)送給了CoarseGrainedExecutorBackend這個(gè)RpcEndpoint,而不是直接發(fā)送給了ExecutorExecutor由于不是消息循環(huán)體,所以永遠(yuǎn)無法直接接收遠(yuǎn)程發(fā)送過來的信息)。

case?LaunchTask(data) =>
??
if?(executor?==?null) {
????logError(
"Received LaunchTask command but executor was null")
????System.exit(
1)
??}?
else?{
????
val?taskDesc =?ser.deserialize[TaskDescription](data.value)
????logInfo(
"Got assigned task "?+ taskDesc.taskId)
????
executor.launchTask(this,?taskId = taskDesc.taskId,?attemptNumber = taskDesc.attemptNumber,
??????
taskDesc.name,?taskDesc.serializedTask)
??}

?

2.ExecutorBackend在收到Driver中發(fā)送過來的消息后,會通過調(diào)用launchTask來交給Executor去執(zhí)行。

case?LaunchTask(data) =>
??
if?(executor?==?null) {
????logError(
"Received LaunchTask command but executor was null")
????System.exit(
1)
??}?
else?{
????
val?taskDesc =?ser.deserialize[TaskDescription](data.value)
????logInfo(
"Got assigned task "?+ taskDesc.taskId)
????
executor.launchTask(this,?taskId = taskDesc.taskId,?attemptNumber = taskDesc.attemptNumber,
??????
taskDesc.name,?taskDesc.serializedTask)
??}

??

轉(zhuǎn)載于:https://www.cnblogs.com/haoyy/p/6177974.html

《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的Spark Executor内幕的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。