AM注冊(cè)與取消注冊(cè)

1. 背景

??在筆者開發(fā)的大數(shù)據(jù)平臺(tái)(XSailboat)中,包含一個(gè)任務(wù)開發(fā)椎例、調(diào)度原杂、監(jiān)控的模塊印颤,叫XTaskWorks。這里的任務(wù)是使用Java穿肄,在XTaskFrame框架之上開發(fā)的數(shù)據(jù)集成年局、數(shù)據(jù)計(jì)算际看、數(shù)據(jù)分析等類型的任務(wù),并且在通用的任務(wù)框架基礎(chǔ)之上矢否,抽象出可視化編輯的ETL工具仲闽。所以任務(wù)數(shù)量是很多的,通常在一個(gè)項(xiàng)目中能達(dá)到幾百的規(guī)模僵朗。每個(gè)任務(wù)可以視為一個(gè)Java進(jìn)程(有一些調(diào)度頻率不高的任務(wù)赖欣,出于節(jié)約內(nèi)存的目的,也會(huì)合并到一個(gè)進(jìn)程中)衣迷。
??為了維護(hù)畏鼓、部署酱酬、更新方便壶谒,筆者基于YARN的容器化和AM 架構(gòu),開發(fā)了任務(wù)引擎膳沽。任務(wù)引擎并不是一個(gè)ApplicationMaster汗菜、多個(gè)Application的模式,而是每一個(gè)任務(wù)進(jìn)程都是一個(gè)ApplicationMater挑社,主要原因是:

  1. XTaskFrame是先于大數(shù)據(jù)平臺(tái)XSailboat的產(chǎn)品陨界,它本身已經(jīng)有了任務(wù)注冊(cè)和管理服務(wù)(類似于AM),注冊(cè)和管理服務(wù)不存在痛阻,不會(huì)影響任務(wù)的正常調(diào)度執(zhí)行菌瘪,只是暫時(shí)暫時(shí)失去了從界面管控任務(wù)的能力。
  2. 如果采用一個(gè)AM阱当,多個(gè)APP的模式俏扩,一旦AM因?yàn)槟承┰颍V沽吮滋恚c它相關(guān)的幾百個(gè)任務(wù)可能會(huì)因?yàn)槭チ薃M录淡,而被回收,即使沒(méi)有回收油坝,AM重啟后也需要在YARN的框架下重新將這些容器納入到新AM的管理之下嫉戚,這會(huì)比較復(fù)雜。

??筆者的處理方法是:

  1. 在原來(lái)的任務(wù)注冊(cè)和管理服務(wù)基礎(chǔ)之上澈圈,增加了容器引擎的擴(kuò)展模塊彬檀。
  2. 通過(guò)任務(wù)注冊(cè)和管理服務(wù)實(shí)現(xiàn)定義任務(wù),一鍵啟停任務(wù)瞬女。啟動(dòng)任務(wù)會(huì)在YARN上以AM形式運(yùn)行起來(lái)窍帝。
  3. 任務(wù)啟動(dòng)成功后,會(huì)向任務(wù)注冊(cè)和管理服務(wù)注冊(cè)拆魏。

2. 出現(xiàn)的問(wèn)題

  1. 任務(wù)進(jìn)程運(yùn)行起來(lái)以后盯桦,一直沒(méi)有達(dá)到RUNNING狀態(tài)慈俯。
  2. 停止進(jìn)程之后,YARN又會(huì)自動(dòng)啟動(dòng)一次拥峦。

3. 原因:

??運(yùn)行起來(lái)的AM需要主動(dòng)連接RM贴膘,進(jìn)行注冊(cè),發(fā)送心跳和取消注冊(cè)略号。提供下面代碼做參考:

        mLogger.info("開始啟動(dòng) ApplicationMaster ...");

        Map<String, String> envMap = System.getenv() ;
        String ctnIdString = envMap.get(ApplicationConstants.Environment.CONTAINER_ID.key());
        mLogger.info("容器ID:{}", ctnIdString);
        mLogger.info("JAVA_HOME:{}", envMap.get(ApplicationConstants.Environment.JAVA_HOME.key()));
        try
        {
            ContainerId ctnId = ContainerId.fromString(ctnIdString);
            ApplicationAttemptId attempId = ctnId.getApplicationAttemptId();
            mAmCtx.setApplicationAttemptId(attempId) ;
    
            RMCallbackHandler rmCall = new RMCallbackHandler(mAmCtx);
    
            mAMRMClient = AMRMClientAsync.createAMRMClientAsync(1000, rmCall);
            Configuration conf = mAmCtx.getHadoopConf() ;
            Assert.notNull(conf) ;
            conf = new Configuration(conf) ;
            conf.set(YarnConfiguration.RM_AM_EXPIRY_INTERVAL_MS , Integer.toString(YarnConfiguration.DEFAULT_RM_AM_EXPIRY_INTERVAL_MS));
            mAMRMClient.init(conf);
        
        
            mUgf = UserGroupInformation.getCurrentUser();
            mUgf.addToken(mAmCtx.getAMRMToken()) ;
            mUgf.doAs((PrivilegedExceptionAction<Void>) () -> {
                try
                {
                    mAMRMClient.start();
                }
                catch(Exception e)
                {
                    mLogger.error("啟動(dòng)AMRMClientAsync出現(xiàn)異常刑峡,異常消息:{}" , ExceptionAssist.getStackTrace(e)) ;
                    System.exit(0) ;
                }
                return null;
            }) ;
        }
        catch (IOException | InterruptedException e)
        {
            mLogger.error("安全執(zhí)行出現(xiàn)異常,異常消息:{}" , ExceptionAssist.getStackTrace(e)) ;
            System.exit(0) ;
        }
        
        // AM必須向RM發(fā)出心跳信號(hào)玄柠,以便讓它知道AM已存在且仍在運(yùn)行突梦。
        // RM的超時(shí)到期間隔由可通過(guò)YarnConfiguration.RM_AM_EXPIRY_INTERVAL_MS訪問(wèn)的配置設(shè)置定義,
        // 默認(rèn)值由YarnConfiguration.DEFAULT_RM_AM_EXPIRY_INTERVAL_MS定義羽利。
        // ApplicationMaster需要使用ResourceManager注冊(cè)自己以開始心跳宫患。
        String hostName = NetUtils.getHostname();
        try
        {
            // 服務(wù)地址
            String serviceAddr = "http://"+XNet.getPreferedIpv4()+":"
                    + MSApp.instance().getHttpPort() ;
            //注冊(cè)服務(wù)地址
            RegisterApplicationMasterResponse resp = mAMRMClient.registerApplicationMaster(hostName
                    , 0 , serviceAddr);

            long maxMem = resp.getMaximumResourceCapability().getMemorySize();
            mLogger.info("集群資源分配的最大內(nèi)存是:{}MB" , maxMem);

            int maxVCores = resp.getMaximumResourceCapability().getVirtualCores();
            mLogger.info("集群資源分配的最大虛擬核數(shù)是:{}個(gè) " , maxVCores);
            mLogger.info("AM啟動(dòng)完成。");
            // 取消注冊(cè)
            Runnable stopPerformer = ()->{
                try
                {
                    mAMRMClient.unregisterApplicationMaster(FinalApplicationStatus.ENDED , "用戶主動(dòng)關(guān)閉應(yīng)用这弧。", "N/A");
                }
                catch (YarnException | IOException e)
                {
                    e.printStackTrace();
                }
            } ;
            // 任務(wù)停止時(shí)娃闲,取消注冊(cè)。
            MSApp.instance().withStopPerformer(stopPerformer) ;
            // ShutdownHook形式不可靠
//          Runtime.getRuntime().addShutdownHook(new Thread(stopPerformer)) ;
        }
        catch (YarnException | IOException e)
        {
            mLogger.error("AM運(yùn)行過(guò)程中出現(xiàn)異常匾浪。異常消息:"+ExceptionAssist.getStackTrace(e)) ;
        }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末皇帮,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子蛋辈,更是在濱河造成了極大的恐慌属拾,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件冷溶,死亡現(xiàn)場(chǎng)離奇詭異渐白,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)挂洛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門礼预,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人虏劲,你說(shuō)我怎么就攤上這事托酸。” “怎么了柒巫?”我有些...
    開封第一講書人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵励堡,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我堡掏,道長(zhǎng)应结,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮鹅龄,結(jié)果婚禮上揩慕,老公的妹妹穿的比我還像新娘。我一直安慰自己扮休,他們只是感情好迎卤,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著玷坠,像睡著了一般蜗搔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上八堡,一...
    開封第一講書人閱讀 51,763評(píng)論 1 307
  • 那天樟凄,我揣著相機(jī)與錄音,去河邊找鬼兄渺。 笑死缝龄,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的溶耘。 我是一名探鬼主播二拐,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼凳兵!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起企软,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤庐扫,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后仗哨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體形庭,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年厌漂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了萨醒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡苇倡,死狀恐怖富纸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情旨椒,我是刑警寧澤晓褪,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站综慎,受9級(jí)特大地震影響涣仿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一好港、第九天 我趴在偏房一處隱蔽的房頂上張望愉镰。 院中可真熱鬧,春花似錦钧汹、人聲如沸岛杀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)类嗤。三九已至,卻和暖如春辨宠,著一層夾襖步出監(jiān)牢的瞬間遗锣,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工嗤形, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留精偿,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓赋兵,卻偏偏與公主長(zhǎng)得像笔咽,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子霹期,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容