將HadoopRPC框架應(yīng)用于多節(jié)點任務(wù)調(diào)度
來源:懂視網(wǎng)
責(zé)編:小采
時間:2020-11-09 13:25:03
將HadoopRPC框架應(yīng)用于多節(jié)點任務(wù)調(diào)度
將HadoopRPC框架應(yīng)用于多節(jié)點任務(wù)調(diào)度:在hadoop中,主從節(jié)點之間保持著心跳通信,用于傳輸節(jié)點狀態(tài)信息、任務(wù)調(diào)度信息以及節(jié)點動作信息等等。 hdfs的namenode與datanode,mapreduce的jobtracker與tasktracker,hbase的hmaster與 regionserver之間的通信,都是基于hadoop RP
導(dǎo)讀將HadoopRPC框架應(yīng)用于多節(jié)點任務(wù)調(diào)度:在hadoop中,主從節(jié)點之間保持著心跳通信,用于傳輸節(jié)點狀態(tài)信息、任務(wù)調(diào)度信息以及節(jié)點動作信息等等。 hdfs的namenode與datanode,mapreduce的jobtracker與tasktracker,hbase的hmaster與 regionserver之間的通信,都是基于hadoop RP
TaskRunner:
2013-01-20 15:42:26,323 [main] INFO? [org.mh.rpc.task.TaskRunner] – client get jobdetail:JobDetail ‘JobGroup_1.MyJob_1′:? jobClass: ‘org.mh.rpc.quartz.GetSumTask isStateful: false isVolatile: false isDurable: false requestsRecovers: false
2013-01-20 15:42:26,329 [main] INFO? [org.mh.rpc.task.TaskRunner] – client get trigger:Trigger ‘Trigger_Group_1.Trigger_1′:? triggerClass: ‘org.quartz.SimpleTrigger isVolatile: false calendar: ‘null’ misfireInstruction: 0 nextFireTime: null
2013-01-20 15:42:26,382 [main] INFO? [org.quartz.simpl.SimpleThreadPool] – Job execution threads will use class loader of thread: main
2013-01-20 15:42:26,411 [main] INFO? [org.quartz.core.SchedulerSignalerImpl] – Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl
2013-01-20 15:42:26,411 [main] INFO? [org.quartz.core.QuartzScheduler] – Quartz Scheduler v.1.6.5 created.
2013-01-20 15:42:26,413 [main] INFO? [org.quartz.simpl.RAMJobStore] – RAMJobStore initialized.
2013-01-20 15:42:26,413 [main] INFO? [org.quartz.impl.StdSchedulerFactory] – Quartz scheduler ‘DefaultQuartzScheduler’ initialized from default resource file in Quartz package: ‘quartz.properties’
2013-01-20 15:42:26,413 [main] INFO? [org.quartz.impl.StdSchedulerFactory] – Quartz scheduler version: 1.6.5
2013-01-20 15:42:26,415 [main] INFO? [org.quartz.core.QuartzScheduler] – Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started.
org.mh.rpc.quartz.DemoTask@1b66b06: executing task @Sun Jan 20 15:42:26 CST 2013
上面是一個簡單的demo,演示了如何通過RPC將任務(wù)調(diào)度給節(jié)點去執(zhí)行,對于Quartz來說,任務(wù)的形式可以千變?nèi)f化,關(guān)鍵就看怎么去使用了,分發(fā)到多個節(jié)點上執(zhí)行的話,就還需要對任務(wù)的信息做更多的封裝了。
(本文已被閱讀2次)

在hadoop中,主從節(jié)點之間保持著心跳通信,用于傳輸節(jié)點狀態(tài)信息、任務(wù)調(diào)度信息以及節(jié)點動作信息等等。 hdfs的namenode與datanode,mapreduce的jobtracker與tasktracker,hbase的hmaster與 regionserver之間的通信,都是基于hadoop RPC。Hadoop RPC是hadoop里非常基礎(chǔ)的通信框架。hadoop 2.0以前hadoop RPC的數(shù)據(jù)序列化是通過實現(xiàn)自己定義的Writable接口實現(xiàn),而從hadoop 2.0開始,數(shù)據(jù)的序列化工作交給了ProtocolBuffer去做。關(guān)于Hadoop RPC的實現(xiàn)原理已經(jīng)有很多文章進行了詳細(xì)的介紹(源碼級強力分析hadoop的RPC機制,Hadoop基于Protocol Buffer的RPC實現(xiàn)代碼分析-Server端,帶有HA功能的Hadoop Client端RPC實現(xiàn)原理與代碼分析),這里就不在贅述了。下面就直接引入問題和方案吧。 問題 工作中經(jīng)常需要在定時任務(wù)系統(tǒng)上寫一些定時任務(wù),隨著業(yè)務(wù)規(guī)模的增長和擴大,需要定時處理的任務(wù)越來越多,任務(wù)之間的執(zhí)行間隔越來越小,某一時間段內(nèi)(比如0點、整點或半點)執(zhí)行的任務(wù)會越來越密集,只在一臺機器上執(zhí)行這些任務(wù)的話,會出現(xiàn)較大的風(fēng)險: 任務(wù)并發(fā)度較高時,單機的系統(tǒng)資源將成為瓶頸 如果一個任務(wù)的運行占用了整個機器的大部分資源,比如sql查詢耗費巨大內(nèi)存和CPU資源,將直接影響其他任務(wù)的運行 任務(wù)失敗后,如果仍然在同一臺節(jié)點自動重新執(zhí)行,失敗率較高 機器宕機后,必須第一時間重啟機器或重新部署定時任務(wù)系統(tǒng),所有任務(wù)都不能按時執(zhí)行 等等 方案 可想而知的是,可以通過將定時任務(wù)系統(tǒng)進行分布式改造,使用多個節(jié)點執(zhí)行任務(wù),將任務(wù)分發(fā)到不同節(jié)點上進行處理,并且完善失敗重試機制,從而提高系統(tǒng)穩(wěn)定性,實現(xiàn)任務(wù)系統(tǒng)的高可靠。 既然是在多個節(jié)點之間分發(fā)任務(wù),肯定得有個任務(wù)的管理者(主節(jié)點),在我們現(xiàn)有的系統(tǒng)中,也就是一套可以部署定時任務(wù)的web系統(tǒng),任務(wù)代碼更新后,部署好這套web系統(tǒng),即可通過web頁面設(shè)置定時任務(wù)并且進行調(diào)度(在單個節(jié)點上執(zhí)行)。執(zhí)行任務(wù)的節(jié)點(子節(jié)點)有多個以后,如何分發(fā)任務(wù)到子節(jié)點呢,我們可以把任務(wù)的信息封裝成一個bean,通過RPC發(fā)布給子節(jié)點,子節(jié)點通過這個任務(wù)bean獲得任務(wù)信息,并在指定的時刻執(zhí)行任務(wù)。同時,子節(jié)點可以通過與主節(jié)點的心跳通信將節(jié)點狀態(tài)和執(zhí)行任務(wù)的情況告訴主節(jié)點。這樣其實就與hadoop mapreduce分發(fā)任務(wù)有點相似了,呵呵,這里主節(jié)點與子節(jié)點之間的通信,我們就可以通過Hadoop RPC框架來實現(xiàn)了,不同的是,我們分發(fā)的任務(wù)是定時任務(wù),發(fā)布任務(wù)時需要將任務(wù)的定時信息一并發(fā)給子節(jié)點。 實現(xiàn) 單點的定時任務(wù)系統(tǒng)是基于Quartz的,在分布式環(huán)境下,可以繼續(xù)基于Quartz進行改造,任務(wù)的定時信息可以通過Quartz中的JobDetail和Trigger對象來描述并封裝,加上任務(wù)執(zhí)行的入口類信息,再通過RPC由主節(jié)點發(fā)給子節(jié)點。子節(jié)點收到封裝好的任務(wù)信息對象后,再構(gòu)造JobDetail和Trigger,設(shè)置好啟動時間后,通過入口類啟動任務(wù)。下面是一個簡單的demo。 以下是一個簡單的定時任務(wù)信息描述對象CronJobInfo,包括JobDetailInfo和TriggerInfo兩個屬性: 任務(wù)信息JobDetailInfo,由主節(jié)點構(gòu)造,子節(jié)點解析構(gòu)造JobDetail對象: 任務(wù)觸發(fā)器信息TriggerInfo ,由主節(jié)點構(gòu)造,子節(jié)點解析構(gòu)造Trigger對象: 主從節(jié)點通信的協(xié)議: 在這個demo中,主節(jié)點啟動后,啟動RPC server線程,等待客戶端(子節(jié)點)的連接,當(dāng)客戶端調(diào)用heartbeat方法時,主節(jié)點將會生成一個任務(wù)信息返回給客戶端: demo任務(wù)類,打印信息: 子節(jié)點demo,啟動后連接主節(jié)點,遠(yuǎn)程調(diào)用generateCronJob方法,獲得一個任務(wù)描述信息,并啟動定時任務(wù) 先啟動TaskScheduler,再啟動TaskRunner,結(jié)果如下: TaskScheduler: 2013-01-20 15:42:21,661 [Socket Reader #1 for port 8888] INFO? [org.apache.hadoop.ipc.Server] – Starting Socket Reader #1 for port 8888 2013-01-20 [...]
原文地址:將Hadoop RPC框架應(yīng)用于多節(jié)點任務(wù)調(diào)度, 感謝原作者分享。
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com
將HadoopRPC框架應(yīng)用于多節(jié)點任務(wù)調(diào)度
將HadoopRPC框架應(yīng)用于多節(jié)點任務(wù)調(diào)度:在hadoop中,主從節(jié)點之間保持著心跳通信,用于傳輸節(jié)點狀態(tài)信息、任務(wù)調(diào)度信息以及節(jié)點動作信息等等。 hdfs的namenode與datanode,mapreduce的jobtracker與tasktracker,hbase的hmaster與 regionserver之間的通信,都是基于hadoop RP