我们都知道,假设
主程序 kill_job.sh
hadoop job -list
获取当前正在执行的hadoop 任务,返回的结果例如以下:
返回的任务中不包含任务的名称, 可是通过hadoop 管理页面是能够查看到job 的名称的。
可是现实情况是我们可能须要依据任务的名称来删除任务。
我的实现方案是这种
1. 通过获取 http://192.168.1.100:50030/jobtracker.jsp 网页
2. 解析网页获取任务名称 + job_id 的任务列表
3. 过滤出指定名称的job
4. 最后调用hadoop job -kill <job_id> 来杀死任务
代码例如以下:
parse.py 使用python 自带的html 解析模块
from HTMLParser import HTMLParser class MyHTMLParser(HTMLParser): def __init__(self): HTMLParser.__init__(self) # self.current_tag = None self.flag = False self.name_flag = False def handle_starttag(self, tag, attrs): if tag == 'td': for name,value in attrs: if name == 'id' and value.startswith("job_"): self.flag = True self.name_flag = False break elif name == 'id' and value.startswith("name_"): self.flag = True self.name_flag = True break def handle_endtag(self, tag): self.flag = False def handle_data(self, data): if self.flag: print data, if self.name_flag: print ' ' if __name__ == '__main__': fp = open("./jobtracker.jsp") data = fp.read() my = MyHTMLParser() my.feed(data)
主程序 kill_job.sh
用shell 实现
# 过滤待删除的任务 keyword=$1 if [ -z "$keyword" ] ; then echo "參数不能为空" echo "使用方法: bash kill_job.sh <keyword> " exit fi curl -O http://192.168.1.100:50030/jobtracker.jsp python parse.py | grep $keyword |sort| tee job.tmp echo "---------------- start kill -------------------" # 运行删除动作 cat ./job.tmp |sort| while read LINE do #echo $LINE job_id=`echo $LINE|awk -F " " '{print $1}'| tr -d ' '` echo "kill job -- ${job_id}" hadoop job -kill "$job_id" done
运行方法:
bash kill_job.sh merge_sl
merge_sl 是job 的名称
完整代码地址:
https://github.com/vearne/del_hadoop_job
版权声明:本文博客原创文章,博客,未经同意,不得转载。