从hadoop 要删除字符串匹配指定的任务

我们都知道,假设
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


版权声明:本文博客原创文章,博客,未经同意,不得转载。

原文地址:https://www.cnblogs.com/gcczhongduan/p/4740627.html