1.大数据面试题:Spark的调度源调度任务执行流程
2.Spark repartitionåcoalesceçåºå«
3.Spark Yarn è°åº¦å¨Scheduler详解
4.数据底座-Rundeck任务调度系统使用手册
5.Job的基本概念和实现原理
大数据面试题:Spark的任务执行流程
面试题来源:
主要探讨Spark的工作机制,包括工作流程、调度源调度调度流程、调度源调度任务调度原理、调度源调度任务提交和执行流程,调度源调度以及Spark在YARN环境下的调度源调度html5组态源码任务调度流程。此外,调度源调度还会涉及Spark job提交过程、调度源调度Spark On YARN流程中的调度源调度Client与Cluster模式,以及Spark的调度源调度执行机制。
参考答案:
Spark运行流程以SparkContext为总入口。调度源调度在SparkContext初始化时,调度源调度Spark创建DAGScheduler和TaskScheduler以进行作业和任务调度。调度源调度瀑布指标源码
运行流程概览如下:
1)当程序提交后,调度源调度SparkSubmit进程与Master通信,调度源调度构建运行环境并启动SparkContext。SparkContext向资源管理器(如Standalone、Mesos或YARN)注册并申请执行资源。
2)资源管理器分配Executor资源,Standalone模式下通过StandaloneExecutorBackend启动Executor。Executor运行状态会定期上报给资源管理器。
3)SparkContext将程序构建为DAG图,将DAG分解为Stage,并将Taskset发送给TaskScheduler。Executor从SparkContext申请Task,要不域名源码TaskScheduler将Task分发给Executor执行。同时,应用程序代码也发送至Executor。
4)Task在Executor上执行完毕后释放资源。
总结:
Spark的运行架构具有以下特点:
1)高效的数据并行处理能力,通过DAGScheduler和TaskScheduler进行任务分解和调度。
2)灵活的资源管理,通过与资源管理器的交互,实现资源的高效分配和利用。
3)动态的资源调度机制,确保任务能够被迅速、有效地执行。发票管理 源码
4)简洁的API和编程模型,使得开发者可以快速实现并行计算任务。
通过这些流程和特点,Spark提供了一种高效、灵活和易于使用的并行计算框架,适用于大数据处理和分析场景。
Spark repartitionåcoalesceçåºå«
æäºæ¶åï¼å¨å¾å¤partitionçæ¶åï¼æ们æ³åå°ç¹partitionçæ°éï¼ä¸ç¶åå°HDFSä¸çæ件æ°éä¹ä¼å¾å¤å¾å¤ã
æ们使ç¨reparationå¢ï¼è¿æ¯coalesceãæ以æ们å¾äºè§£è¿ä¸¤ä¸ªç®åçå å¨åºå«ã
è¦ç¥éï¼repartitionæ¯ä¸ä¸ªæ¶èæ¯è¾æè´µçæä½ç®åï¼Sparkåºäºä¸ä¸ªä¼åççrepartitionå«åcoalesceï¼å®å¯ä»¥å°½éé¿å æ°æ®è¿ç§»ï¼
ä½æ¯ä½ åªè½åå°RDDçpartition.
举个ä¾åï¼æå¦ä¸æ°æ®èç¹åå¸ï¼
ç¨coalesceï¼å°partitionåå°å°2个ï¼
注æï¼Node1 å Node3 ä¸éè¦ç§»å¨åå§çæ°æ®
The repartition algorithm does a full shuffle and creates new partitions with data thatâs distributed evenly.
Letâs create a DataFrame with the numbers from 1 to .
repartition ç®æ³ä¼åä¸ä¸ªfull shuffleç¶ååååå¸å°å建æ°çpartitionãæ们å建ä¸ä¸ª1-æ°åçDataFrameæµè¯ä¸ä¸ã
åå¼å§æ°æ®æ¯è¿æ ·åå¸çï¼
æ们åä¸ä¸ªfull shuffleï¼å°å ¶repartition为2个ã
è¿æ¯å¨ææºå¨ä¸æ°æ®åå¸çæ åµï¼
Partition A: 1, 3, 4, 6, 7, 9, ,
Partition B: 2, 5, 8,
The repartition method makes new partitions and evenly distributes the data in the new partitions (the data distribution is more even for larger data sets).
repartitionæ¹æ³è®©æ°çpartitionååå°åå¸äºæ°æ®ï¼æ°æ®é大çæ åµä¸å ¶å®ä¼æ´ååï¼
coalesceç¨å·²æçpartitionå»å°½éåå°æ°æ®shuffleã
repartitionå建æ°çpartition并ä¸ä½¿ç¨ full shuffleã
coalesceä¼ä½¿å¾æ¯ä¸ªpartitionä¸åæ°éçæ°æ®åå¸ï¼æäºæ¶åå个partitionä¼æä¸åçsizeï¼
ç¶èï¼repartition使å¾æ¯ä¸ªpartitionçæ°æ®å¤§å°é½ç²ç¥å°ç¸çã
coalesce ä¸ repartitionçåºå«ï¼æ们ä¸é¢è¯´çcoalesceé½é»è®¤shuffleåæ°ä¸ºfalseçæ åµï¼
repartition(numPartitions:Int):RDD[T]åcoalesce(numPartitions:Intï¼shuffle:Boolean=false):RDD[T] repartitionåªæ¯coalesceæ¥å£ä¸shuffle为trueçå®ç°
æ1wçå°æ件ï¼èµæºä¹ä¸º--executor-memory 2g --executor-cores 2 --num-executors 5ã
repartition(4)ï¼äº§çshuffleãè¿æ¶ä¼å¯å¨5个executoråä¹åä»ç»çé£æ ·ä¾æ¬¡è¯»å1w个ååºçæ件ï¼ç¶åæç §æ个è§å%4,åå°4个æ件ä¸ï¼è¿æ ·ååºç4个æ件åºæ¬æ¯«æ è§å¾ï¼æ¯è¾ååã
coalesce(4):è¿ä¸ªcoalesceä¸ä¼äº§çshuffleãé£å¯å¨5个executorå¨ä¸åçshuffleçæ¶åæ¯å¦ä½çæ4个æ件å¢ï¼å ¶å®ä¼æ1个æ2个æ3个çè³æ´å¤çexecutorå¨ç©ºè·ï¼å ·ä½å 个executor空è·ä¸sparkè°åº¦æå ³ï¼ä¸æ°æ®æ¬å°æ§æå ³ï¼ä¸sparké群è´è½½æå ³ï¼ï¼ä»å¹¶æ²¡æ读åä»»ä½æ°æ®ï¼
1.å¦æç»æ产ççæ件æ°è¦æ¯æºRDD partitionå°ï¼ç¨coalesceæ¯å®ç°ä¸äºçï¼ä¾å¦æ4个å°æ件ï¼4个partitionï¼ï¼ä½ è¦çæ5个æ件ç¨coalesceå®ç°ä¸äºï¼ä¹å°±æ¯è¯´ä¸äº§çshuffleï¼æ æ³å®ç°æ件æ°åå¤ã
2.å¦æä½ åªæ1个executorï¼1个coreï¼ï¼æºRDD partitionæ5个ï¼ä½ è¦ç¨coalesce产ç2个æ件ãé£ä¹ä»æ¯é¢åpartitionå°executorä¸çï¼ä¾å¦0-2å·ååºå¨å executorä¸æ§è¡å®æ¯ï¼3-4å·ååºå次å¨åä¸ä¸ªexecutoræ§è¡ãå ¶å®é½æ¯åä¸ä¸ªexecutorä½æ¯ååè¦ä¸²è¡è¯»ä¸åæ°æ®ãä¸ç¨repartition(2)å¨è¯»partitionä¸æè¾å¤§ä¸åï¼ä¸²è¡ä¾æ¬¡è¯»0-4å·partition å%2å¤çï¼ã
T表æGæ°æ® æ个partition èµæºä¹ä¸º--executor-memory 2g --executor-cores 2 --num-executors 5ãæ们æ³è¦ç»ææ件åªæä¸ä¸ª
Spark Yarn è°åº¦å¨Scheduler详解
ä¸ãè°åº¦å¨çéæ©
å¨Yarnä¸æä¸ç§è°åº¦å¨å¯ä»¥éæ©ï¼FIFO Schedulerï¼Capacity Schedulerï¼FairS chedulerã
FIFO Scheduleræåºç¨ææ交ç顺åºææä¸ä¸ªéåï¼è¿æ¯ä¸ä¸ªå è¿å åºéåï¼å¨è¿è¡èµæºåé çæ¶åï¼å ç»éåä¸æ头ä¸çåºç¨è¿è¡åé èµæºï¼å¾ æ头ä¸çåºç¨éæ±æ»¡è¶³ååç»ä¸ä¸ä¸ªåé ï¼ä»¥æ¤ç±»æ¨ã
FIFO Scheduleræ¯æç®åä¹æ¯æ容æç解çè°åº¦å¨ï¼ä¹ä¸éè¦ä»»ä½é ç½®ï¼ä½å®å¹¶ä¸éç¨äºå ±äº«é群ã大çåºç¨å¯è½ä¼å ç¨ææé群èµæºï¼è¿å°±å¯¼è´å ¶å®åºç¨è¢«é»å¡ãå¨å ±äº«é群ä¸ï¼æ´éåéç¨Capacity ScheduleræFair Schedulerï¼è¿ä¸¤ä¸ªè°åº¦å¨é½å 许大任å¡åå°ä»»å¡å¨æ交çåæ¶è·å¾ä¸å®çç³»ç»èµæºã
ä¸é¢ âYarnè°åº¦å¨å¯¹æ¯å¾â å±ç¤ºäºè¿å 个è°åº¦å¨çåºå«ï¼ä»å¾ä¸å¯ä»¥çåºï¼å¨FIFO è°åº¦å¨ä¸ï¼å°ä»»å¡ä¼è¢«å¤§ä»»å¡é»å¡ã
è对äºCapacityè°åº¦å¨ï¼æä¸ä¸ªä¸é¨çéåç¨æ¥è¿è¡å°ä»»å¡ï¼ä½æ¯ä¸ºå°ä»»å¡ä¸é¨è®¾ç½®ä¸ä¸ªéåä¼é¢å å ç¨ä¸å®çé群èµæºï¼è¿å°±å¯¼è´å¤§ä»»å¡çæ§è¡æ¶é´ä¼è½åäºä½¿ç¨FIFOè°åº¦å¨æ¶çæ¶é´ã
å¨Fairè°åº¦å¨ä¸ï¼æ们ä¸éè¦é¢å å ç¨ä¸å®çç³»ç»èµæºï¼Fairè°åº¦å¨ä¼ä¸ºææè¿è¡çjobå¨æçè°æ´ç³»ç»èµæºãå¦ä¸å¾æ示ï¼å½ç¬¬ä¸ä¸ªå¤§jobæ交æ¶ï¼åªæè¿ä¸ä¸ªjobå¨è¿è¡ï¼æ¤æ¶å®è·å¾äºææé群èµæºï¼å½ç¬¬äºä¸ªå°ä»»å¡æ交åï¼Fairè°åº¦å¨ä¼åé ä¸åèµæºç»è¿ä¸ªå°ä»»å¡ï¼è®©è¿ä¸¤ä¸ªä»»å¡å ¬å¹³çå ±äº«é群èµæºã
éè¦æ³¨æçæ¯ï¼å¨ä¸å¾Fairè°åº¦å¨ä¸ï¼ä»ç¬¬äºä¸ªä»»å¡æ交å°è·å¾èµæºä¼æä¸å®ç延è¿ï¼å 为å®éè¦çå¾ ç¬¬ä¸ä¸ªä»»å¡éæ¾å ç¨çContainerãå°ä»»å¡æ§è¡å®æä¹åä¹ä¼éæ¾èªå·±å ç¨çèµæºï¼å¤§ä»»å¡åè·å¾äºå ¨é¨çç³»ç»èµæºãæç»çææå°±æ¯Fairè°åº¦å¨å³å¾å°äºé«çèµæºå©ç¨çåè½ä¿è¯å°ä»»å¡åæ¶å®æã
Yarnè°åº¦å¨å¯¹æ¯å¾:
äºãCapacity Schedulerï¼å®¹å¨è°åº¦å¨ï¼çé ç½®
2.1 容å¨è°åº¦ä»ç»
Capacity è°åº¦å¨å 许å¤ä¸ªç»ç»å ±äº«æ´ä¸ªé群ï¼æ¯ä¸ªç»ç»å¯ä»¥è·å¾é群çä¸é¨å计ç®è½åãéè¿ä¸ºæ¯ä¸ªç»ç»åé ä¸é¨çéåï¼ç¶åå为æ¯ä¸ªéååé ä¸å®çé群èµæºï¼è¿æ ·æ´ä¸ªé群就å¯ä»¥éè¿è®¾ç½®å¤ä¸ªéåçæ¹å¼ç»å¤ä¸ªç»ç»æä¾æå¡äºãé¤æ¤ä¹å¤ï¼éåå é¨åå¯ä»¥åç´ååï¼è¿æ ·ä¸ä¸ªç»ç»å é¨çå¤ä¸ªæåå°±å¯ä»¥å ±äº«è¿ä¸ªéåèµæºäºï¼å¨ä¸ä¸ªéåå é¨ï¼èµæºçè°åº¦æ¯éç¨çæ¯å è¿å åº(FIFO)çç¥ã
éè¿ä¸é¢é£å¹ å¾ï¼æ们已ç»ç¥éä¸ä¸ªjobå¯è½ä½¿ç¨ä¸äºæ´ä¸ªéåçèµæºãç¶èå¦æè¿ä¸ªéåä¸è¿è¡å¤ä¸ªjobï¼å¦æè¿ä¸ªéåçèµæºå¤ç¨ï¼é£ä¹å°±åé ç»è¿äºjobï¼å¦æè¿ä¸ªéåçèµæºä¸å¤ç¨äºå¢ï¼å ¶å®Capacityè°åº¦å¨ä»å¯è½åé é¢å¤çèµæºç»è¿ä¸ªéåï¼è¿å°±æ¯ âå¼¹æ§éåâ(queue elasticity) çæ¦å¿µã
å¨æ£å¸¸çæä½ä¸ï¼Capacityè°åº¦å¨ä¸ä¼å¼ºå¶éæ¾Containerï¼å½ä¸ä¸ªéåèµæºä¸å¤ç¨æ¶ï¼è¿ä¸ªéååªè½è·å¾å ¶å®éåéæ¾åçContainerèµæºãå½ç¶ï¼æ们å¯ä»¥ä¸ºéå设置ä¸ä¸ªæ大èµæºä½¿ç¨éï¼ä»¥å è¿ä¸ªéåè¿å¤çå ç¨ç©ºé²èµæºï¼å¯¼è´å ¶å®éåæ æ³ä½¿ç¨è¿äºç©ºé²èµæºï¼è¿å°±æ¯âå¼¹æ§éåâéè¦æè¡¡çå°æ¹ã
2.2 容å¨è°åº¦çé ç½®
å设æ们æå¦ä¸å±æ¬¡çéåï¼
root
âââ prod
âââ dev
âââ eng
âââ science
ä¸é¢æ¯ä¸ä¸ªç®åçCapacityè°åº¦å¨çé ç½®æ件ï¼æ件å为capacity-scheduler.xmlãå¨è¿ä¸ªé ç½®ä¸ï¼å¨rootéåä¸é¢å®ä¹äºä¸¤ä¸ªåéåprodådevï¼åå«å %å%ç容éãéè¦æ³¨æï¼ä¸ä¸ªéåçé ç½®æ¯éè¿å±æ§yarn.sheduler.capacity..æå®çï¼ä»£è¡¨çæ¯éåç继æ¿æ ï¼å¦root.prodéåï¼ä¸è¬æcapacityåmaximum-capacityã
æ们å¯ä»¥çå°ï¼devéåå被åæäºengåscience两个ç¸å容éçåéåãdevçmaximum-capacityå±æ§è¢«è®¾ç½®æäº%ï¼æ以å³ä½¿prodéåå®å ¨ç©ºé²devä¹ä¸ä¼å ç¨å ¨é¨é群èµæºï¼ä¹å°±æ¯è¯´ï¼prodéåä»æ%çå¯ç¨èµæºç¨æ¥åºæ¥ãæ们注æå°ï¼engåscience两个éå没æ设置maximum-capacityå±æ§ï¼ä¹å°±æ¯è¯´engæscienceéåä¸çjobå¯è½ä¼ç¨å°æ´ä¸ªdevéåçææèµæºï¼æå¤ä¸ºé群ç%ï¼ãè类似çï¼prodç±äºæ²¡æ设置maximum-capacityå±æ§ï¼å®æå¯è½ä¼å ç¨éç¾¤å ¨é¨èµæºã
Capacity容å¨é¤äºå¯ä»¥é ç½®éååå ¶å®¹éå¤ï¼æ们è¿å¯ä»¥é ç½®ä¸ä¸ªç¨æ·æåºç¨å¯ä»¥åé çæ大èµæºæ°éãå¯ä»¥åæ¶è¿è¡å¤å°åºç¨ãéåçACL认è¯çã
2.3 éåç设置
å ³äºéåç设置ï¼è¿åå³äºæä»¬å ·ä½çåºç¨ãæ¯å¦ï¼å¨MapReduceä¸ï¼æ们å¯ä»¥éè¿mapreduce.job.queuenameå±æ§æå®è¦ç¨çéåãå¦æéåä¸åå¨ï¼æ们å¨æ交任å¡æ¶å°±ä¼æ¶å°é误ãå¦ææ们没æå®ä¹ä»»ä½éåï¼ææçåºç¨å°ä¼æ¾å¨ä¸ä¸ªdefaultéåä¸ã
注æï¼å¯¹äºCapacityè°åº¦å¨ï¼æ们çéååå¿ é¡»æ¯éåæ ä¸çæåä¸é¨åï¼å¦ææ们使ç¨éåæ åä¸ä¼è¢«è¯å«ãæ¯å¦ï¼å¨ä¸é¢é ç½®ä¸ï¼æ们使ç¨prodåengä½ä¸ºéååæ¯å¯ä»¥çï¼ä½æ¯å¦ææ们ç¨root.dev.engæè dev.engæ¯æ æçã
ä¸ãFair Schedulerï¼å ¬å¹³è°åº¦å¨ï¼çé ç½®
3.1 å ¬å¹³è°åº¦
Fairè°åº¦å¨ç设计ç®æ æ¯ä¸ºææçåºç¨åé å ¬å¹³çèµæºï¼å¯¹å ¬å¹³çå®ä¹å¯ä»¥éè¿åæ°æ¥è®¾ç½®ï¼ãå¨ä¸é¢ç âYarnè°åº¦å¨å¯¹æ¯å¾â å±ç¤ºäºä¸ä¸ªéåä¸ä¸¤ä¸ªåºç¨çå ¬å¹³è°åº¦ï¼å½ç¶ï¼å ¬å¹³è°åº¦å¨ä¹å¯ä»¥å¨å¤ä¸ªéåé´å·¥ä½ã举个ä¾åï¼å设æ两个ç¨æ·AåBï¼ä»ä»¬åå«æ¥æä¸ä¸ªéåãå½Aå¯å¨ä¸ä¸ªjobèB没æä»»å¡æ¶ï¼Aä¼è·å¾å ¨é¨é群èµæºï¼å½Bå¯å¨ä¸ä¸ªjobåï¼Açjobä¼ç»§ç»è¿è¡ï¼ä¸è¿ä¸ä¼å¿ä¹å两个任å¡ä¼åèªè·å¾ä¸åçé群èµæºãå¦ææ¤æ¶Båå¯å¨ç¬¬äºä¸ªjob并ä¸å ¶å®jobè¿å¨è¿è¡ï¼åå®å°ä¼åBç第ä¸ä¸ªjobå ±äº«Bè¿ä¸ªéåçèµæºï¼ä¹å°±æ¯Bç两个jobä¼ç¨äºååä¹ä¸çé群èµæºï¼èAçjobä»ç¶ç¨äºé群ä¸åçèµæºï¼ç»æå°±æ¯èµæºæç»å¨ä¸¤ä¸ªç¨æ·ä¹é´å¹³ççå ±äº«ãè¿ç¨å¦ä¸å¾æ示ï¼
3.2 å¯ç¨Fair Scheduler
è°åº¦å¨ç使ç¨æ¯éè¿yarn-site.xmlé ç½®æ件ä¸çyarn.resourcemanager.scheduler.classåæ°è¿è¡é ç½®çï¼é»è®¤éç¨Capacity Schedulerè°åº¦å¨ãå¦ææ们è¦ä½¿ç¨Fairè°åº¦å¨ï¼éè¦å¨è¿ä¸ªåæ°ä¸é ç½®FairSchedulerç±»çå ¨éå®åï¼org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairSchedulerã
3.3 éåçé ç½®
Fairè°åº¦å¨çé ç½®æ件ä½äºç±»è·¯å¾ä¸çfair-scheduler.xmlæ件ä¸ï¼è¿ä¸ªè·¯å¾å¯ä»¥éè¿yarn.scheduler.fair.allocation.fileå±æ§è¿è¡ä¿®æ¹ãè¥æ²¡æè¿ä¸ªé ç½®æ件ï¼Fairè°åº¦å¨éç¨çåé çç¥ï¼è¿ä¸ªçç¥å3.1èä»ç»ç类似ï¼è°åº¦å¨ä¼å¨ç¨æ·æ交第ä¸ä¸ªåºç¨æ¶ä¸ºå ¶èªå¨å建ä¸ä¸ªéåï¼éåçååå°±æ¯ç¨æ·åï¼ææçåºç¨é½ä¼è¢«åé å°ç¸åºçç¨æ·éåä¸ã
æ们å¯ä»¥å¨é ç½®æ件ä¸é ç½®æ¯ä¸ä¸ªéåï¼å¹¶ä¸å¯ä»¥åCapacity è°åº¦å¨ä¸æ ·åå±æ¬¡é ç½®éåãæ¯å¦ï¼åècapacity-scheduler.xmlæ¥é ç½®fair-schedulerï¼
éåçå±æ¬¡æ¯éè¿åµå¥å ç´ å®ç°çãææçéåé½æ¯rootéåçå©åï¼å³ä½¿æ们没æé å°å ç´ éãå¨è¿ä¸ªé ç½®ä¸ï¼æ们ædevéåæåæäºengåscience两个éåã
Fairè°åº¦å¨ä¸çéåæä¸ä¸ªæéå±æ§ï¼è¿ä¸ªæéå°±æ¯å¯¹å ¬å¹³çå®ä¹ï¼ï¼å¹¶æè¿ä¸ªå±æ§ä½ä¸ºå ¬å¹³è°åº¦çä¾æ®ãå¨è¿ä¸ªä¾åä¸ï¼å½è°åº¦å¨åé é群:èµæºç»prodådevæ¶ä¾¿è§ä½å ¬å¹³ï¼engåscienceéå没æå®ä¹æéï¼åä¼è¢«å¹³ååé ãè¿éçæé并ä¸æ¯ç¾åæ¯ï¼æ们æä¸é¢çååå«æ¿æ¢æ2å3ï¼ææä¹æ¯ä¸æ ·çã注æï¼å¯¹äºå¨æ²¡æé ç½®æ件æ¶æç¨æ·èªå¨å建çéåï¼å®ä»¬ä»ææé并ä¸æéå¼ä¸º1ã
æ¯ä¸ªéåå é¨ä»å¯ä»¥æä¸åçè°åº¦çç¥ãéåçé»è®¤è°åº¦çç¥å¯ä»¥éè¿é¡¶çº§å ç´ è¿è¡é ç½®ï¼å¦æ没æé ç½®ï¼é»è®¤éç¨å ¬å¹³è°åº¦ã
尽管æ¯Fairè°åº¦å¨ï¼å ¶ä»æ¯æå¨éå级å«è¿è¡FIFOè°åº¦ãæ¯ä¸ªéåçè°åº¦çç¥å¯ä»¥è¢«å ¶å é¨çå ç´ è¦çï¼å¨ä¸é¢è¿ä¸ªä¾åä¸ï¼prodéå就被æå®éç¨FIFOè¿è¡è°åº¦ï¼æ以ï¼å¯¹äºæ交å°prodéåçä»»å¡å°±å¯ä»¥æç §FIFOè§å顺åºçæ§è¡äºãéè¦æ³¨æï¼prodådevä¹é´çè°åº¦ä»ç¶æ¯å ¬å¹³è°åº¦ï¼åæ ·engåscienceä¹æ¯å ¬å¹³è°åº¦ã
尽管ä¸é¢çé ç½®ä¸æ²¡æå±ç¤ºï¼æ¯ä¸ªéåä»å¯é ç½®æ大ãæå°èµæºå ç¨æ°åæ大å¯è¿è¡çåºç¨çæ°éã
3.4 éåç设置
Fairè°åº¦å¨éç¨äºä¸å¥åºäºè§åçç³»ç»æ¥ç¡®å®åºç¨åºè¯¥æ¾å°åªä¸ªéåãå¨ä¸é¢çä¾åä¸ï¼å ç´ å®ä¹äºä¸ä¸ªè§åå表ï¼å ¶ä¸çæ¯ä¸ªè§åä¼è¢«é个å°è¯ç´å°å¹é æåãä¾å¦ï¼ä¸ä¾ç¬¬ä¸ä¸ªè§åspecifiedï¼åä¼æåºç¨æ¾å°å®æå®çéåä¸ï¼è¥è¿ä¸ªåºç¨æ²¡ææå®éååæéååä¸åå¨ï¼å说æä¸å¹é è¿ä¸ªè§åï¼ç¶åå°è¯ä¸ä¸ä¸ªè§åãprimaryGroupè§åä¼å°è¯æåºç¨æ¾å¨ä»¥ ç¨æ·æå¨çUnixç»å å½åçéåä¸ï¼å¦æ没æè¿ä¸ªéåï¼ä¸å建éå转èå°è¯ä¸ä¸ä¸ªè§åãå½åé¢ææè§åä¸æ»¡è¶³æ¶ï¼å触ådefaultè§åï¼æåºç¨æ¾å¨dev.engéåä¸ã
å½ç¶ï¼æ们å¯ä»¥ä¸é ç½®queuePlacementPolicyè§åï¼è°åº¦å¨åé»è®¤éç¨å¦ä¸è§åï¼
ä¸é¢è§åå¯ä»¥å½ç»æä¸å¥è¯ï¼é¤ééå被åç¡®çå®ä¹ï¼å¦åä¼ä»¥ç¨æ·å为éååå建éåã
è¿æä¸ä¸ªç®åçé ç½®çç¥å¯ä»¥ä½¿å¾ææçåºç¨æ¾å ¥åä¸ä¸ªéåï¼defaultï¼ï¼è¿æ ·å°±å¯ä»¥è®©ææåºç¨ä¹é´å¹³çå ±äº«é群èä¸æ¯å¨ç¨æ·ä¹é´ãè¿ä¸ªé ç½®çå®ä¹å¦ä¸ï¼
å®ç°ä¸é¢åè½æ们è¿å¯ä»¥ä¸ä½¿ç¨é ç½®æ件ï¼ç´æ¥è®¾ç½®yarn.scheduler.fair.user-as-default-queue=falseï¼è¿æ ·åºç¨ä¾¿ä¼è¢«æ¾å ¥default éåï¼èä¸æ¯å个ç¨æ·åéåãå¦å¤ï¼æ们è¿å¯ä»¥è®¾ç½®yarn.scheduler.fair.allow-undeclared-pools=falseï¼è¿æ ·ç¨æ·å°±æ æ³å建éåäºã
3.5 æ¢å ï¼Preemptionï¼
å½ä¸ä¸ªjobæ交å°ä¸ä¸ªç¹å¿é群ä¸ç空éåæ¶ï¼job并ä¸ä¼é©¬ä¸æ§è¡ï¼èæ¯é»å¡ç´å°æ£å¨è¿è¡çjobéæ¾ç³»ç»èµæºã为äºä½¿æ交jobçæ§è¡æ¶é´æ´å ·é¢æµæ§ï¼å¯ä»¥è®¾ç½®çå¾ çè¶ æ¶æ¶é´ï¼ï¼Fairè°åº¦å¨æ¯ææ¢å ã
æ¢å å°±æ¯å 许è°åº¦å¨ææå ç¨è¶ è¿å ¶åºå 份é¢èµæºéåçcontainersï¼è¿äºcontainersèµæºä¾¿å¯è¢«åé å°åºè¯¥äº«æè¿äºä»½é¢èµæºçéåä¸ãéè¦æ³¨ææ¢å ä¼éä½é群çæ§è¡æçï¼å 为被ç»æ¢çcontainerséè¦è¢«éæ°æ§è¡ã
å¯ä»¥éè¿è®¾ç½®ä¸ä¸ªå ¨å±çåæ°yarn.scheduler.fair.preemption=trueæ¥å¯ç¨æ¢å åè½ãæ¤å¤ï¼è¿æ两个åæ°ç¨æ¥æ§å¶æ¢å çè¿ææ¶é´ï¼è¿ä¸¤ä¸ªåæ°é»è®¤æ²¡æé ç½®ï¼éè¦è³å°é ç½®ä¸ä¸ªæ¥å 许æ¢å Containerï¼ï¼
- minimum share preemption timeout
- fair share preemption timeout
å¦æéåå¨minimum share preemption timeoutæå®çæ¶é´å æªè·å¾æå°çèµæºä¿éï¼è°åº¦å¨å°±ä¼æ¢å containersãæ们å¯ä»¥éè¿é ç½®æ件ä¸ç顶级å ç´ ä¸ºææéåé ç½®è¿ä¸ªè¶ æ¶æ¶é´ï¼æ们è¿å¯ä»¥å¨å ç´ å é ç½®å ç´ æ¥ä¸ºæ个éåæå®è¶ æ¶æ¶é´ã
ä¸ä¹ç±»ä¼¼ï¼å¦æéåå¨fair share preemption timeoutæå®æ¶é´å æªè·å¾å¹³ççèµæºçä¸åï¼è¿ä¸ªæ¯ä¾å¯ä»¥é ç½®ï¼ï¼è°åº¦å¨åä¼è¿è¡æ¢å containersãè¿ä¸ªè¶ æ¶æ¶é´å¯ä»¥éè¿é¡¶çº§å ç´ åå ç´ çº§å ç´ åå«é ç½®ææéååæ个éåçè¶ æ¶æ¶é´ãä¸é¢æå°çæ¯ä¾å¯ä»¥éè¿(é ç½®ææéå)å(é ç½®æ个éå)è¿è¡é ç½®ï¼é»è®¤æ¯0.5ã
数据底座-Rundeck任务调度系统使用手册
在进行项目管理和自动化任务调度时,Rundeck 是一个强大且灵活的工具。它允许用户根据业务范围划分项目,通过创建 Job 来实现自动化任务的执行。
具体而言,创建一个项目时,租凭网站源码需要考虑业务范围,将相似或相关的任务归类,以提高管理效率和执行效率。创建 Job 时,应详细定义任务的参数、执行逻辑、依赖关系等关键信息,确保任务能够准确、高效地执行。
在配置 Spark 相关任务时,首先在指定路径下创建一个 shell 脚本,例如:/opt/maintain/scripts/bms/income-detail/BmsIncomeDetailIceberg.sh。此脚本应包含执行 Spark 任务所需的命令和参数,确保任务能够正确启动并执行。
为便于复用和管理,可以创建 Spark submit 模板。这个模板应包含通用的 Spark 配置、任务执行路径和所需的环境变量等信息。通过使用模板,可以快速配置和执行 Spark 任务,无需每次都从零开始。
在配置 Apache Druid 时,关键在于构建合适的表结构和提供正确的执行脚本。json 表结构文件(例如:druid bms-income-detail.json)和脚本文件(druidbms-income-detail.sh)应放在指定的目录下,如 /opt/maintain/druid/bms/income-detail,以确保 Druid 能够正确解析和执行。
针对 Kerberos 小时过期问题,解决方法在于调整 Kerberos 的相关参数。通过修改 Kerberos 凭证的生命周期设置,可以实现凭证的自动刷新,从而解决过期问题。具体参数调整步骤和策略需根据实际环境和安全策略进行。
总之,Rundeck 提供了丰富的功能和配置选项,使其成为执行自动化任务和项目管理的理想选择。通过合理利用 Rundeck 的特性,可以极大地提高工作效率和任务执行的可靠性。
Job的基本概念和实现原理
在Spark任务调度的框架中,Job扮演着核心角色。它在RDD执行Action操作时生成,是任务计算的顶层单元。Job主要分为两种类型:Result Job和Map-Stage Job。Result Job负责Action操作的执行和相关数据计算,而Map-Stage Job则在SQL自适应查询计划中发挥作用,预估map操作的输出以优化后续Stage的调度。
Job的创建始于RDD的Action操作,通过SparkContext的runJob函数调用DAGScheduler的runJob,以ActiveJob类实现。Job的创建过程包括生成jobId(递增整数)和finalStage(区分Job类型的标识),如ResultStage或ShuffleMapStage。每个Job在划分成多个Stage后,按shuffle依赖进行任务调度。
当Job执行完毕,JobWaiter在DAGScheduler中监控状态,一旦任务完成,状态信息会被保存并传递给Driver。通过JobId,可以识别和调度不同任务,FIFO调度算法会优先考虑JobId较小的任务。
ActiveJob类是Job的实现,其内部包含了jobId、finalStage等关键信息,如已完成分区数,这决定了Job是否完成。Job的完成状态是通过依赖Stage的执行状态来判断的,因为Stage的TaskSet提交会确保其依赖的Stage已完成。
总的来说,本文深入剖析了Job的创建原理、状态获取机制以及其核心实现类ActiveJob的工作原理。