linux task进程跟踪,如何对Hadoop作业的某个task进行debug单步跟踪
對(duì)于使用Hadoop進(jìn)行日志分析等工作的開發(fā)者來說,相信一直都面臨著一個(gè)非常頭疼的問題。那就是:對(duì)hadoop的mapreduce作業(yè),在分布式集群上進(jìn)行單個(gè)task的單步debug跟蹤調(diào)試無法辦到。只能在本地進(jìn)行調(diào)試,然后提交到集群中運(yùn)行,但是集群中如果某個(gè)task總是失敗,要對(duì)這一個(gè)task進(jìn)行單步跟蹤就非常困難。其實(shí)原因很簡單,因?yàn)楫?dāng)把作業(yè)提交到hadoop 集群進(jìn)行運(yùn)行的時(shí)候,你事先根本就不知道那個(gè)map或者reduce的task會(huì)被分配到哪個(gè)tasktracker上執(zhí)行。所以過去的兩年里,寫 mapreduce應(yīng)用的工程師們一直面臨著這個(gè)懸而未決的問題。只能通過在程序中加日志,并在作業(yè)完成或者失敗后追蹤日志來進(jìn)行問題定位。無法達(dá)到對(duì)程序象調(diào)試單機(jī)程序一樣的進(jìn)行調(diào)試。
其實(shí)在hadoop中,有一個(gè)好東西,利用這個(gè)好東西,就可以實(shí)現(xiàn)在集群中對(duì)某個(gè)task進(jìn)行單步調(diào)試的需求。這個(gè)東西就是 IsolationRunner。IsolationRunner是一個(gè)小工具,能夠在tasktracker機(jī)器上,重新單獨(dú)運(yùn)行失敗的task,這樣對(duì)于某些大作業(yè)(比如job的輸入有100TB),如果因?yàn)槟骋粋€(gè)task重復(fù)失敗而導(dǎo)致整個(gè)job失敗,就不用連續(xù)不斷的提交job,進(jìn)行復(fù)現(xiàn),然后定位某個(gè)task失敗的原因,這樣做的代價(jià)就會(huì)非常的大。如果能夠?qū)κ〉膖ask進(jìn)行單獨(dú)執(zhí)行,那么要定位問題的原因代價(jià)就變得很小,對(duì)工程師來說也非常的方便。
要想對(duì)失敗的task進(jìn)行單獨(dú)重跑,肯定是有前提的,大家知道,對(duì)于map而言,其輸入數(shù)據(jù)是來自分布式文件系統(tǒng)(通常是HDFS)中輸入數(shù)據(jù)的某個(gè) split,所以如果想要重跑map task,其輸入數(shù)據(jù)就需要被保留下來。同樣對(duì)于reduce而言,其輸入是從所有map的中間結(jié)果shuffle到該reduce的數(shù)據(jù),如果想要重跑 reduce task,這些數(shù)據(jù)也就需要保留下來。所以為了提供對(duì)失敗的task進(jìn)行單獨(dú)重跑的功能,作業(yè)執(zhí)行過程中的中間結(jié)果,或者每個(gè)map的輸入數(shù)據(jù)對(duì)應(yīng)的 split數(shù)據(jù),就需要被保留下來。為此hadoop提供了一個(gè)作業(yè)的配置選項(xiàng):keep.failed.task.files,該選項(xiàng)默認(rèn)為 false,表示對(duì)于失敗的task,其運(yùn)行的臨時(shí)數(shù)據(jù)和目錄是不會(huì)被保存的,這也是hadoop在支持這項(xiàng)功能前默認(rèn)的做法,因?yàn)槿绻〉膖ask的臨時(shí)文件和目錄被保留的過多,會(huì)占據(jù)tasktracker上過多的磁盤空間和文件數(shù),造成磁盤浪費(fèi)。而當(dāng)將 keep.failed.task.files選項(xiàng)設(shè)置為true(注意:該配置選項(xiàng)是一個(gè)per job的配置),那么hadoop在執(zhí)行該job時(shí),當(dāng)發(fā)生map fail或者reduce fail時(shí),就會(huì)將task能夠單獨(dú)重跑的所有環(huán)境都保留下來,比如task運(yùn)行時(shí)對(duì)應(yīng)的job.xml,map input對(duì)應(yīng)的split.dta文件,或者reduce的輸入file.out文件。這樣,要重跑一個(gè)map或者reduce task的環(huán)境就已經(jīng)具備。
如何重跑:
當(dāng)fail的task環(huán)境具備以后,就可以對(duì)單獨(dú)的task進(jìn)行重跑了。重跑的方式為:
上到task出錯(cuò)的tasktracker機(jī)器上
在該tasktracker上找到fail的task運(yùn)行時(shí)的目錄環(huán)境
在 tasktracker中,對(duì)于每一個(gè)task都會(huì)有一個(gè)單獨(dú)的執(zhí)行環(huán)境,其中包括其work目錄,其對(duì)應(yīng)的中間文件,以及其運(yùn)行時(shí)需要用到的配置文件等
這些目錄是由tasktracker的配置決定,配置選項(xiàng)為:mapred.local.dir. 該選項(xiàng)可能是一個(gè)逗號(hào)分隔的路徑list,每個(gè) list都是tasktracker對(duì)在其上執(zhí)行的task建立工作目錄的根目錄。比如如果mapred.local.dir=/disk1 /mapred/local,/disk2/mapred/local,那么task的執(zhí)行環(huán)境就是mapred.local.dir /taskTracker/jobcache/job-ID/task-attempt-ID
找到該task的執(zhí)行工作目錄后,就可以進(jìn)入到該目錄下,然后其中就會(huì)有該task的運(yùn)行環(huán)境,通常包括一個(gè)work目錄,一個(gè)job.xml文件,以及一個(gè)task要進(jìn)行操作的數(shù)據(jù)文件(對(duì)map來說是split.dta,對(duì)reduce來說是file.out)。
找到環(huán)境以后,就可以重跑task了。
cd work
hadoop org.apache.hadoop.mapred.IsolationRunner ../job.xml
這樣,IsolationRunner就會(huì)讀取job.xml的配置(這里的job.xml相當(dāng)于提交客戶端的hadoop-site.xml配置文件與命令行-D配置的接合),然后對(duì)該map或者reduce進(jìn)行重新運(yùn)行。
到這里為止,已經(jīng)實(shí)現(xiàn)了task單獨(dú)重跑,但是還是沒有解決對(duì)其進(jìn)行單步斷點(diǎn)debug。這里利用到的其實(shí)是jvm的遠(yuǎn)程 debug的功能。方式如下:
在重跑task之前,export一個(gè)環(huán)境變量:export HADOOP_OPTS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=8888"
這樣,hadoop的指令就會(huì)通過8888端口將debug信息發(fā)送出去
然后在自己本地的開發(fā)環(huán)境IDE中(比如 eclipse),launch一個(gè)遠(yuǎn)程調(diào)試,并在代碼中打一個(gè)斷點(diǎn),就可以對(duì)在tasktracker上運(yùn)行的獨(dú)立map或者reduce task進(jìn)行遠(yuǎn)程單步調(diào)試了。
以下是圖解示意,這里采用最簡單的wordcount來進(jìn)行示例。在wordcount的輸入文件中,加入一行數(shù)據(jù),如“guaishushu”,然后修改wordcount的Mapper實(shí)現(xiàn),如下:
這樣修改以后,由于數(shù)據(jù)中有 “guaishushu”的字符串,并且該行一定會(huì)被落到某個(gè)map的輸入中去,然后代碼中當(dāng)讀到”guaishushu”的時(shí)候會(huì)拋出 IOException異常,所以該job在運(yùn)行過程中就肯定會(huì)有一個(gè)task失敗。然后,在提交作業(yè)時(shí),將 keep.failed.task.files設(shè)置為true,并按如下程序提交,job就開始運(yùn)行:
在jobtracker監(jiān)控web頁面上找到 task失敗的機(jī)器,并確保keep.failed.task.files為true
上到該tasktracker,并找到該 task運(yùn)行環(huán)境
進(jìn)到該task運(yùn)行環(huán)境的work目錄(如果沒有,可以自己創(chuàng)建
export jvm遠(yuǎn)程調(diào)試環(huán)境變量
運(yùn)行IsolationRunner
在自己的開發(fā)機(jī)IDE環(huán)境中l(wèi)aunch一個(gè)遠(yuǎn)程調(diào)試進(jìn)程
單步跟蹤示意
總結(jié)
以上是生活随笔為你收集整理的linux task进程跟踪,如何对Hadoop作业的某个task进行debug单步跟踪的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle的三个管理,Oracle数据
- 下一篇: linux时间配置文件,linux系统下