本發(fā)明涉及計(jì)算機(jī)技術(shù),尤指一種基于Hadoop分布式的異常處理方法和裝置。
背景技術(shù):
Hadoop是由Apache基金會(huì)所開發(fā)的分布式系統(tǒng)基礎(chǔ)架構(gòu)。Hadoop分布式框架的核心設(shè)計(jì)是:分布式文件系統(tǒng)(HDFS,Hadoop Distributed File System)和映射(Map)/規(guī)約(Reduce)。其中,HDFS為海量的數(shù)據(jù)提供了存儲(chǔ),Map/Reduce為海量的數(shù)據(jù)提供了計(jì)算。
Map/Reduce框架是一個(gè)簡易的分布式計(jì)算軟件框架,基于Hadoop分布式架構(gòu)編寫的應(yīng)用程序能夠運(yùn)行在由上千個(gè)商用機(jī)器組成的大型分布式集群系統(tǒng)上,并且能夠以一種可靠容錯(cuò)性的方式并行處理超過T級別的數(shù)據(jù)集。Map/Reduce框架由一個(gè)單獨(dú)的主節(jié)點(diǎn)(Master)和多個(gè)集群從節(jié)點(diǎn)(Slave)共同組成。針對Hadoop分布式的實(shí)現(xiàn),現(xiàn)有的系統(tǒng)使用集群完全分布式配置模式,在完全分布式中,Master負(fù)責(zé)調(diào)度構(gòu)成一個(gè)作業(yè)的所有任務(wù)并分布到不同的Slave上,Master監(jiān)控Slave的執(zhí)行,并重新執(zhí)行失敗的任務(wù),Slave僅負(fù)責(zé)執(zhí)行由Master指派的任務(wù)。
Hadoop分布式系統(tǒng)中,由于Slave分布在不同的機(jī)器上,且分布在未知的線程上,當(dāng)不同的Slave執(zhí)行Map或者Reduce產(chǎn)生異常時(shí),相關(guān)技術(shù)中通常利用異常信息獲取函數(shù)e.getMessage()對異常進(jìn)行處理,但是該函數(shù)只能獲取異常的原因,但是,由于不知道異常的具體位置,導(dǎo)致不能及時(shí)處理異常,影響了系統(tǒng)運(yùn)行和維護(hù)。
技術(shù)實(shí)現(xiàn)要素:
為了解決上述技術(shù)問題,本發(fā)明提供了一種異常處理方法和裝置,能夠獲取分布式系統(tǒng)的異常的原因和位置,從而保證對發(fā)生的異常進(jìn)行及時(shí)處理。
為了達(dá)到本發(fā)明目的,本發(fā)明提供了一種異常處理方法,包括:
獲取業(yè)務(wù)處理過程中發(fā)生異常的原因和位置;所述業(yè)務(wù)處理過程包括執(zhí)行Map程序和Reduce程序;
將所述獲取的原因和位置存儲(chǔ)在預(yù)先創(chuàng)建的Hadoop數(shù)據(jù)庫Hbase中;
所述Hbase包括由行鍵和列簇組成的記錄異常日志事件表;其中,
所述列簇包括:用于記錄業(yè)務(wù)處理過程運(yùn)行失敗的相關(guān)信息的列簇Job、用于記錄業(yè)務(wù)處理過程中Map程序運(yùn)行失敗的異常的原因和位置的列簇Map,以及用于記錄業(yè)務(wù)處理過程中Reduce程序運(yùn)行失敗的異常的原因和位置的列簇Reduce。
可選地,所述獲取異常的原因和位置之前,還包括:
判斷所述業(yè)務(wù)處理過程運(yùn)行是否失敗,當(dāng)判斷出所述業(yè)務(wù)處理過程運(yùn)行失敗時(shí)將所述業(yè)務(wù)處理過程運(yùn)行失敗的相關(guān)信息保存到所述Hbase中;
其中,所述運(yùn)行失敗的相關(guān)信息包括:所述業(yè)務(wù)處理過程運(yùn)行失敗的開始時(shí)間、運(yùn)行失敗的結(jié)束時(shí)間、當(dāng)前運(yùn)行的任務(wù)名稱、失敗的狀態(tài)。
可選地,當(dāng)所述業(yè)務(wù)處理過程包括組件Combiner處理時(shí),所述方法還包括:
獲取所述組件Combiner處理過程中的異常的原因和位置并存儲(chǔ)在所述Hbase中。
可選地,所述獲取業(yè)務(wù)處理過程中的異常的原因和位置包括:利用打印異常信息函數(shù)PrintStackTrace()獲取所述異常的原因和位置。
可選地,所述獲取業(yè)務(wù)處理過程中的異常的原因和位置之后,所述將所述異常的原因和位置存儲(chǔ)在Hadoop數(shù)據(jù)庫Hbase中之前,還包括:將所述異常的原因和位置的格式轉(zhuǎn)換成字符串格式。
本發(fā)明還提供一種異常處理裝置,其特征在于,包括獲取模塊、處理模塊;其中,
獲取模塊,用于獲取業(yè)務(wù)處理過程中的異常的原因和位置;所述業(yè)務(wù)處理過程包括執(zhí)行Map程序和Reduce程序;
處理模塊,用于將所述異常的原因和位置存儲(chǔ)在預(yù)先創(chuàng)建的Hadoop數(shù)據(jù)庫Hbase中;
所述Hbase包括由行鍵和列簇組成的記錄異常日志事件表;其中,
所述列簇包括:用于記錄業(yè)務(wù)處理過程運(yùn)行失敗的相關(guān)信息的列簇Job、用于記錄業(yè)務(wù)處理過程中Map程序運(yùn)行失敗的異常的原因和位置的列簇Map,以及用于記錄業(yè)務(wù)處理過程中Reduce程序運(yùn)行失敗的異常的原因和位置的列簇Reduce。
可選地,還包括判斷模塊,用于:
判斷出所述業(yè)務(wù)處理過程運(yùn)行失敗,通知所述獲取模塊執(zhí)行獲取業(yè)務(wù)處理過程中的異常的原因和位置的步驟;通知所述處理模塊將所述業(yè)務(wù)處理過程運(yùn)行失敗的相關(guān)信息保存到所述Hbase中;
其中,所述運(yùn)行失敗的相關(guān)信息包括:所述業(yè)務(wù)處理過程運(yùn)行失敗的開始時(shí)間、運(yùn)行失敗的結(jié)束時(shí)間、當(dāng)前運(yùn)行的任務(wù)名稱、失敗的狀態(tài)。
可選地,所述獲取模塊,還用于當(dāng)所述業(yè)務(wù)處理過程包括組件Combiner處理時(shí),獲取所述組件Combiner處理過程中的異常的原因和位置并存儲(chǔ)在所述Hbase中。
可選地,所述獲取模塊具體用于:利用打印異常信息函數(shù)PrintStackTrace()獲取所述異常的原因和位置。
可選地,所述處理模塊還用于:將所述異常的原因和位置的格式轉(zhuǎn)換成字符串格式后再執(zhí)行存儲(chǔ)在Hadoop數(shù)據(jù)庫Hbase中的步驟。
與現(xiàn)有技術(shù)相比,本發(fā)明包括:在業(yè)務(wù)處理過程中獲取發(fā)生異常的原因和位置,并將發(fā)生的異常的原因和位置保存在Hbase。通過本發(fā)明提供的技術(shù)方案,獲取了分布式系統(tǒng)發(fā)生的異常的原因和位置,保證了對異常的及時(shí)處理,便于后期進(jìn)行程序調(diào)試和系統(tǒng)維護(hù)。
本發(fā)明的其它特征和優(yōu)點(diǎn)將在隨后的說明書中闡述,并且,部分地從說明書中變得顯而易見,或者通過實(shí)施本發(fā)明而了解。本發(fā)明的目的和其他優(yōu)點(diǎn)可通過在說明書、權(quán)利要求書以及附圖中所特別指出的結(jié)構(gòu)來實(shí)現(xiàn)和獲得。
附圖說明
附圖用來提供對本發(fā)明技術(shù)方案的進(jìn)一步理解,并且構(gòu)成說明書的一部分,與本申請的實(shí)施例一起用于解釋本發(fā)明的技術(shù)方案,并不構(gòu)成對本發(fā)明技術(shù)方案的限制。
圖1為本發(fā)明實(shí)現(xiàn)異常獲取方法的流程圖;
圖2為本發(fā)明實(shí)現(xiàn)判斷Map/Reduce程序運(yùn)行是否出現(xiàn)異常的流程圖;
圖3為本發(fā)明實(shí)現(xiàn)異常獲取裝置的組成結(jié)構(gòu)示意圖。
具體實(shí)施方式
為使本發(fā)明的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚明白,下文中將結(jié)合附圖對本發(fā)明的實(shí)施例進(jìn)行詳細(xì)說明。需要說明的是,在不沖突的情況下,本申請中的實(shí)施例及實(shí)施例中的特征可以相互任意組合。
在附圖的流程圖示出的步驟可以在諸如一組計(jì)算機(jī)可執(zhí)行指令的計(jì)算機(jī)系統(tǒng)中執(zhí)行。并且,雖然在流程圖中示出了邏輯順序,但是在某些情況下,可以以不同于此處的順序執(zhí)行所示出或描述的步驟。
圖1為本發(fā)明實(shí)現(xiàn)異常獲取的流程圖,如圖1所示,包括:
步驟100:獲取業(yè)務(wù)處理過程中發(fā)生異常的原因和位置,業(yè)務(wù)處理過程包括執(zhí)行Map程序和Reduce程序;
其中,在Hadoop分布式系統(tǒng)中可以利用Map/Reduce進(jìn)行業(yè)務(wù)處理過程,即業(yè)務(wù)處理過程包括執(zhí)行Map程序和Reduce程序,而由于數(shù)據(jù)源等多方面的原因,會(huì)在Map/Reduce執(zhí)行過程中產(chǎn)生異常,從而導(dǎo)致Map/Reduce運(yùn)行失敗,為了獲取產(chǎn)生的異常,本步驟中,可以利用獲取異常信息的函數(shù),如打印異常信息函數(shù)PrintStackTrace()獲取異常的原因和位置。
步驟101:將獲取的原因和位置存儲(chǔ)在預(yù)先創(chuàng)建的Hadoop數(shù)據(jù)庫Hbase中。
其中,Hbase至少包括由行鍵和列簇組成的記錄異常日志事件表。
本發(fā)明的記錄異常日志事件表的列簇至少包括:列簇job、列簇map、列簇reduce,其中,
列簇job:用于記錄業(yè)務(wù)處理過程運(yùn)行失敗的相關(guān)信息,比如包括:程序運(yùn)行失敗的開始時(shí)間job:beginTime、程序運(yùn)行失敗的結(jié)束時(shí)間job:endTime、任務(wù)的名稱job:name、任務(wù)的狀態(tài)job:status等;
列簇map:用于記錄業(yè)務(wù)處理過程中Map程序運(yùn)行失敗的異常的原因和位置map:errorInfo。進(jìn)一步地還用于記錄Map程序運(yùn)行中導(dǎo)致異常的輸入源數(shù)據(jù)map:errorInputData;
列簇reduce:用于業(yè)務(wù)處理過程中Reduce程序運(yùn)行失敗的異常的原因和位置reduce:errorInfo。進(jìn)一步地,還用于記錄Reduce程序運(yùn)行中導(dǎo)致異常的輸入源數(shù)據(jù)reduce:errorInputData。
進(jìn)一步地,本步驟之前還包括:
將獲得的異常的原因及位置信息轉(zhuǎn)換成可閱讀的字符串形式,再保存在預(yù)先創(chuàng)建的Hbase中。
本發(fā)明提供的技術(shù)方案,通過利用打印異常信息函數(shù)PrintStackTrace()獲取異常的原因和位置,并將其存儲(chǔ)在Hadoop數(shù)據(jù)庫Hbase。一方面,獲取了分布式系統(tǒng)發(fā)生異常的原因和位置,另一方面,保證了對異常的及時(shí)處理,便于后期進(jìn)行程序調(diào)試和系統(tǒng)維護(hù)。
可選地,當(dāng)業(yè)務(wù)處理過程即Map/Reduce執(zhí)行過程中包括組件Combiner處理時(shí),本發(fā)明方法還包括:
獲取組件Combiner處理過程中的異常并存儲(chǔ)在Hbase中。
這里,組件Combiner程序相當(dāng)于預(yù)先在各個(gè)節(jié)點(diǎn)進(jìn)行局部的Reduce程序的操作。同樣可以利用與步驟100中相同的方法,即利用打印異常信息函數(shù)PrintStackTrace()獲取獲取組件Combiner處理過程中的異常信息的原因和位置。
可選地,在步驟100的獲取異常信息之前,還包括:
判斷業(yè)務(wù)處理過程運(yùn)行是否失敗,當(dāng)判斷出業(yè)務(wù)處理過程運(yùn)行失敗時(shí),如Map/Reduce運(yùn)行失敗,將業(yè)務(wù)處理過程運(yùn)行失敗的相關(guān)信息保存到Hbase中。其中,
運(yùn)行失敗的相關(guān)信息包括:業(yè)務(wù)處理過程運(yùn)行失敗的開始時(shí)間、運(yùn)行失敗的結(jié)束時(shí)間、當(dāng)前運(yùn)行的任務(wù)名稱、失敗的狀態(tài)。
具體地,判斷業(yè)務(wù)處理過程是否運(yùn)行異常的實(shí)現(xiàn)過程如圖2所示,包括:
步驟200:判斷業(yè)務(wù)處理過程是否失敗。
本步驟包括:可以通過獲取job.waitForCompletion(true)函數(shù)的布爾值,判斷業(yè)務(wù)處理過程中的Map/Reduce程序是否運(yùn)行失敗,該布爾值為程序運(yùn)行失敗的狀態(tài)值,通過該布爾值判斷本次Map/Reduce是否運(yùn)行失敗,比如如果該值為false則程序運(yùn)行失敗。
步驟201:將運(yùn)行失敗的相關(guān)信息保存到Hbase中。
其中,運(yùn)行失敗的相關(guān)信息包括但不限于:運(yùn)行失敗的開始時(shí)間beginTime、運(yùn)行失敗的結(jié)束時(shí)間endTime、當(dāng)前運(yùn)行的任務(wù)名稱jobName、失敗的狀態(tài)。
本發(fā)明可以在異常日志事件表的行鍵(RowKey)前加入前綴。前綴為系統(tǒng)當(dāng)前時(shí)間函數(shù)Long.Max_Value-System.currentTimeMills()。由于Hbase中數(shù)據(jù)是按照字典排序的,為了加快查詢最新的異常信息,將系統(tǒng)當(dāng)前時(shí)間函數(shù)Long.Max_Value-System.currentTimeMills()作為行健RowKey的前綴,可以保證最新的按照異常事件發(fā)生的時(shí)間倒敘排列實(shí)現(xiàn)快速查詢。
可選地,如果經(jīng)常針對某具體任務(wù)進(jìn)行查詢,可以將該任務(wù)字段名job_name放在RowKey的前綴,也可以根據(jù)時(shí)間和任務(wù)拼接的RowKey來獲取指定的數(shù)據(jù)。
例如,RowKey定義為:
<Long.Max_Value-System.currentTimeMills()>_<job_name>
本發(fā)明提供的異常處理方法中,由于異常的原因和位置存儲(chǔ)在Hbase中,方便了后期維護(hù)時(shí)基于RowKey索引對Hbase中的異常進(jìn)行快速查詢。比如:設(shè)定查詢時(shí)間范圍,以程序運(yùn)行失敗的結(jié)束時(shí)間作為RowKey開始查詢時(shí)間,以運(yùn)行失敗的開始時(shí)間作為行鍵停止查詢時(shí)間,通過行鍵在行鍵開始查詢時(shí)間和行鍵停止查詢時(shí)間的范圍內(nèi)查詢異常,這樣,除了查找到異常的原因、位置,還可以進(jìn)一步查找到異常的數(shù)據(jù)源,方便了后續(xù)對異常的處理。
例如,設(shè)置Long.maxValue-endTime作為行鍵的開始查詢值StartRowKey,設(shè)置Long.maxValue-beginTime作為行鍵的結(jié)束查詢值StopRowKey,在該范圍內(nèi)利用Hbase的RowKey查詢出該段時(shí)間是否發(fā)生異常。根據(jù)查詢到的信息,運(yùn)營或開發(fā)人員及時(shí)獲知系統(tǒng)出現(xiàn)的異常,也為快速分析以定位出異常的原因提供了保障。
下面結(jié)合一個(gè)實(shí)例描述異常獲取過程的實(shí)現(xiàn)。
在預(yù)先編輯好的異常捕獲Try/Catch程序中引入獲取異常信息的函數(shù),如打印異常信息PrintStackTrace()函數(shù),利用PrintStackTrace()函數(shù)獲取異常的原因及程序出錯(cuò)的位置。具體來看:
可以在Try/Catch程序中加入以下代碼:
e.printStackTrace();//在命令行打印異常信息以及在程序中出錯(cuò)的位置及原因;
StringWritersw=new StringWriter();//獲取字符流的一個(gè)對象;
e.printStackTrace(new PrintWriter(sw,true));//將異常的信息傳入到上述字節(jié)流對象;
String errorInfo=sw.toString();//將獲取的異常信息的字節(jié)流對象轉(zhuǎn)成可閱讀的字符串;
其中,異常信息errorInfo中包含了導(dǎo)致異常的原因,并能夠定位異常的位置。將異常信息errorInfo保存到Hbase中,保存的異常信息包括了異常的原因和引起異常的數(shù)據(jù)源的位置。
圖3為本發(fā)明實(shí)現(xiàn)異常信息獲取裝置的組成結(jié)構(gòu)示意圖,如圖3所示,至少包括獲取模塊、處理模塊,其中,
獲取模塊,用于獲取業(yè)務(wù)處理過程中的異常的原因和位置,業(yè)務(wù)處理過程包括執(zhí)行Map程序和Reduce程序。
處理模塊,用于將異常的原因和位置存儲(chǔ)在預(yù)先創(chuàng)建的Hadoop數(shù)據(jù)庫Hbase中;
其中,
Hbase包括由行鍵和列簇組成的記錄異常日志事件表;其中,
列簇包括:用于記錄業(yè)務(wù)處理過程運(yùn)行失敗的相關(guān)信息的列簇Job、用于記錄業(yè)務(wù)處理過程中Map程序運(yùn)行失敗的異常的原因和位置的列簇Map,以及用于記錄業(yè)務(wù)處理過程中Reduce程序運(yùn)行失敗的異常的原因和位置的列簇Reduce。
可選地,還包括判斷模塊,用于:
判斷出業(yè)務(wù)處理過程運(yùn)行失敗,通知獲取模塊執(zhí)行獲取業(yè)務(wù)處理過程中的異常的原因和位置的步驟;通知處理模塊將業(yè)務(wù)處理過程運(yùn)行失敗的相關(guān)信息保存到所述Hbase中;
其中,運(yùn)行失敗的相關(guān)信息包括:業(yè)務(wù)處理過程運(yùn)行失敗的開始時(shí)間、運(yùn)行失敗的結(jié)束時(shí)間、當(dāng)前運(yùn)行的任務(wù)名稱、失敗的狀態(tài)。
可選地,獲取模塊還用于:當(dāng)業(yè)務(wù)處理過程包括組件Combiner處理時(shí),獲取組件Combiner處理過程中的異常的原因和位置并存儲(chǔ)在Hbase中。
可選地,獲取模塊具體用于:利用打印異常信息函數(shù)PrintStackTrace()獲取異常的原因和位置。
可選地,處理模塊還用于:將異常的原因和位置的格式轉(zhuǎn)換成字符串格式后再執(zhí)行存儲(chǔ)在Hadoop數(shù)據(jù)庫Hbase中的步驟。
雖然本發(fā)明所揭露的實(shí)施方式如上,但所述的內(nèi)容僅為便于理解本發(fā)明而采用的實(shí)施方式,并非用以限定本發(fā)明。任何本發(fā)明所屬領(lǐng)域內(nèi)的技術(shù)人員,在不脫離本發(fā)明所揭露的精神和范圍的前提下,可以在實(shí)施的形式及細(xì)節(jié)上進(jìn)行任何的修改與變化,但本發(fā)明的專利保護(hù)范圍,仍須以所附的權(quán)利要求書所界定的范圍為準(zhǔn)。