1. 程式人生 > >Python爬蟲之Spark Streaming任務監控

Python爬蟲之Spark Streaming任務監控

    一直忙於工作,在平淡中時間慢慢流逝,想嘗試著寫點什麼,但不知道從何下手,  看到網上有很多文章寫的很不錯,很羨慕能把自己的想法寫出來然
    後分享給大家的那些技術達人,把書本上的知識從理解到應用實際工作中,不斷的學習、沉澱才能不斷的進步,努力成為你想要成為的那個人。
   從畢業到現在一直從事Java後臺開發工作,陰差陽錯的接觸到計算廣告這個佔網際網路大部分收入的行業,平時的工作主要是負責後臺業務的開發以及對
   廣告效果資料(廣告的曝光、點選、下載、活躍使用者等)、效能資料(SDK埋點資料)進行實時統計與報表展示。廣告效果資料是用Spark 
   Streaming進行準實時統計的,效能資料是利用Hadoop進行離線計算統計的(計算廣告涉及的知識面較為廣泛有興趣的同學可以拜讀一下劉鵬老師的
   計算廣告學)。因為Spark 叢集資源較為緊張導致Spark Streaming準時任務會出現計算延時,主備異常切換的時候導致Spark Streaming出現重啟失
   敗等,如果不能及時感知到這些因素,那麼將會給使用者帶來不好的體驗,給公司帶來不必要的損失。為了能自動監控到這些變化,並能及時感知進行
   相應的處理,在工作之餘利用python寫了一個任務監控指令碼。該指令碼根據任務名稱監控任務是否正常執行,以及是否出現計算延時,如果不正常的時
   候自動傳送郵件進行通知。哈哈、第一次寫部落格廢話較多,下面就直接上指令碼:
 #!/usr/bin/env python
#-*- coding:utf-8 -*-
import re
import datetime
import urllib2
import traceback
from bs4 import BeautifulSoup
from email.mime.text import MIMEText 
import smtplib
from email.header import Header


mail_to_list=["[email protected]"] #郵件收件人,多個用逗號隔開
mail_host="192.31.15.117"
#郵件伺服器 mail_user="[email protected]" #郵箱賬戶名(建議用公司內部郵箱,以免其他郵箱洩露伺服器機器資訊) #線上環境spark頁面 spark_url_master_1 = "http://192.168.141.145:8090/" #spark叢集主服務地址 spark_url_master_2 = "http://192.168.141.144:8090/" #spark叢集備服務地址 task_names = ["AD_SSP_STAT_OLAP","AD_SDK_DISTRIBUTE_STAT_OLAP"] # 任務名稱,多個任務用逗號分隔 time_delayed = 60
*30 #傳送郵件 def send_mail(content): text = ''+content message = MIMEText(text,'html','utf-8') message['From'] = Header(mail_user,'utf-8') message['To'] = Header(";".join(mail_to_list),'utf-8') message['Subject'] = Header("Spark Streaming 統計監控",'utf-8') try: server = smtplib.SMTP() server.connect(mail_host) server.sendmail(mail_user,mail_to_list,message.as_string()) server.quit() print '傳送成功' except Exception,e: print "Error:無法傳送郵件",str(e) #根據任務名稱獲取任務跳轉地址href def getHref(url,task_name): html = '' href = '' try: html = urllib2.urlopen(url) except Exception , e: print "開啟url出錯",str(e),str(url) try: bsObj = BeautifulSoup(html.read()) href = bsObj.findAll("a",{"href":re.compile("^http:.*")},text=task_name)[0].attrs["href"] except Exception ,e : print "解析標籤出錯",str(e) return href #獲取任務執行地址任務執行時間狀態 def getTaskStatus(url): url = url +"/streaming/" html = '' time = '' try: html = urllib2.urlopen(url) except Exception , e: print "開啟url出錯",str(e),str(url) try: bsObj = BeautifulSoup(html.read()) time = bsObj.findAll("table",{"id":"completed-batches-table"})[0].find("tbody").findAll("tr")[0].findAll("td")[0].findAll("a")[0].get_text() except Exception ,e : print "解析標籤出錯",str(e) return time #指定的時間與當前時間差 def get_time_diff(t_str): starttime = datetime.datetime.now() endtime = datetime.datetime.strptime(t_str, '%Y/%m/%d %H:%M:%S') return dateDiffInSeconds(starttime,endtime)時間相差的秒數 def dateDiffInSeconds(date1, date2): timedelta = abs(date2 - date1) return timedelta.days*24*3600 + timedelta.seconds #檢測是否延時過長,超過了指定的閥值 def checkDelayed(time,url,task_name): #延時一個小時則傳送報警郵件 if time != '': delayed = get_time_diff(time.strip()) if(delayed>time_delayed ): url = url+"/streaming/" content = "任務延時:"+str(delayed)+str("秒,任務url:")+str(url) send_mail(content) else: print "任務:"+str(task_name)+"檢測正常" else: passtaks url #根據任務名稱獲取任務地址 def getTaskUrl(task_name): url = '' if getHref(spark_url_master_1,task_name) != '': url = getHref(spark_url_master_1,task_name) else: url = getHref(spark_url_master_2,task_name) return url #執行主方法 if __name__ == '__main__': for task_name in task_names: taskUrl = getTaskUrl(task_name) if taskUrl == '': content = "spark master任務中沒有找到執行的任務:"+str("master 地址1:")+spark_url_master_1+str(" , master 地址2:")+spark_url_master_2 send_mail(content) else: runTime = getTaskStatus(taskUrl) checkDelayed(runTime,taskUrl,task_name)

“`
上面是完整的指令碼,只要在Linux中加個定時任務就可以進行監控了,這裡面用了python提供的爬蟲庫BeautifulSoup,BeautifulSoup提供了find、
findAll等方法可以和正則表示式進行結合使用,讓我們方便的對html文件中的標籤進行查詢定位獲取,之所以用任務名稱進行查詢任務執行地址,是應
為,spark 叢集會進行主備切換,如果寫hard code,當主備切換的時候,地址發生了變化,指令碼會找不到任務,或者任務重新啟動的時候,任務執行
的節點地址也會隨機變化的,這樣我們就不得不每次啟動一次就修改一次監控指令碼很繁瑣,所以使用任務名稱進行查詢任務執行地址,我們只要通過配置
spark 叢集的訪問地址,然後通過爬蟲自動查詢任務執行的節點地址,找到任務地址進行後做相應的延時等監控處理就可以了,這大大增加了指令碼的靈活
性,當然指令碼也有很多的不足之處,例如:我們把spark 叢集主備地址、任務名稱、收件人都hard code程式碼裡,這些度可以進行相應的改進,如通過
web頁面進行配置上面的hard code,並通過任務名稱進行分組,不同的任務名稱傳送給不同的收件人,這樣就能各負其職呢。

當能力不能匹配你的野心的時候,那就安靜下來進行學習

相關推薦

Python爬蟲Spark Streaming任務監控

一直忙於工作,在平淡中時間慢慢流逝,想嘗試著寫點什麼,但不知道從何下手, 看到網上有很多文章寫的很不錯,很羨慕能把自己的想法寫出來然 後分享給大家的那些技術達人,把書本上的知識從理解到應用實際工作中,不斷的學習、沉澱才能不斷的進步,努力成為你想

一個鹹魚的Python爬蟲路(三):爬取網頁圖片

you os.path odin 路徑 生成 存在 parent lose exist 學完Requests庫與Beautifulsoup庫我們今天來實戰一波,爬取網頁圖片。依照現在所學只能爬取圖片在html頁面的而不能爬取由JavaScript生成的圖。所以我找了這個網站

[Python爬蟲] 十五:Selenium +phantomjs根據微信公眾號抓取微信文章

頭部 drive lac 過程 標題 操作 函數 軟件測試 init   借助搜索微信搜索引擎進行抓取   抓取過程   1、首先在搜狗的微信搜索頁面測試一下,這樣能夠讓我們的思路更加清晰        在搜索引擎上使用微信公眾號英文名進行“搜公眾號&r

玩轉python爬蟲URLError異常處理

bsp 無法識別 pac 使用 cin lai 網絡 處理方式 地址 這篇文章主要介紹了python爬蟲的URLError異常處理,詳細探尋一下URL\HTTP異常處理的相關內容,通過一些具體的實例來分析一下,非常的簡單,但是卻很實用,感興趣的小夥伴們可以參考一下 本節

python爬蟲正則表達式

ner cde 輸入 set 神奇 tro 轉義 規則 error 一、簡介   正則表達式,又稱正規表示式、正規表示法、正規表達式、規則表達式、常規表示法(英語:Regular Expression,在代碼中常簡寫為regex、regexp或RE),計算機科學的一個概念。

[Python爬蟲] 十九:Selenium +phantomjs 利用 pyquery抓取超級TV網數據

images 判斷 nco dex onf etc lac lin 利用   一、介紹     本例子用Selenium +phantomjs爬取超級TV(http://www.chaojitv.com/news/index.html)的資訊信息,輸入給定關鍵字抓取

Python爬蟲爬取煎蛋網妹子圖

創建目錄 req add 註意 not 相同 esp mpi python3 這篇文章通過簡單的Python爬蟲(未使用框架,僅供娛樂)獲取並下載煎蛋網妹子圖指定頁面或全部圖片,並將圖片下載到磁盤。 首先導入模塊:urllib.request、re、os import

python爬蟲git的使用

mage .cn 沒有 倉庫 本地倉庫 odin src python爬蟲 建立 1、初始化文件夾為版本控制文件夾,首先建立一個文件夾,進入這個文件夾以後輸入git init初始化這個文件夾。 2、Git幾種位置概念 1、本地代碼:本地更改完代碼以後,雖然是存放在git的

python爬蟲git的使用(coding.net的使用)

git push github上 版本 es2017 push 我們 執行命令 pytho 最好的 1、註冊coding.net賬號,然後登陸。 2、創建項目 套路和github都一樣。 1.1、我們在遠程倉庫上創建了一個倉庫,這樣的話,我們需要在本地隨便建立一

python爬蟲requests模塊

.post 過大 form表單提交 www xxxxxx psd method date .com 一. 登錄事例 a. 查找汽車之家新聞 標題 鏈接 圖片寫入本地 import requests from bs4 import BeautifulSoup import

Python爬蟲利用正則表達式爬取內涵吧

file res start cnblogs all save nts quest ide 首先,我們來看一下,爬蟲前基本的知識點概括 一. match()方法: 這個方法會從字符串的開頭去匹配(也可以指定開始的位置),如果在開始沒有找到,立即返回None,匹配到一個結果

Python爬蟲利用BeautifulSoup爬取豆瓣小說(三)——將小說信息寫入文件

設置 one 行為 blog 應該 += html uil rate 1 #-*-coding:utf-8-*- 2 import urllib2 3 from bs4 import BeautifulSoup 4 5 class dbxs: 6 7

python爬蟲scrapy的pipeline的使用

python爬蟲 pre ram .py pid cati port 目錄 自動創建 scrapy的pipeline是一個非常重要的模塊,主要作用是將return的items寫入到數據庫、文件等持久化模塊,下面我們就簡單的了解一下pipelines的用法。 案例一:   

python爬蟲解析網頁的工具pyquery

div blog import 很多 aof pyquery from text lec 主要是對http://www.cnblogs.com/zhaof/p/6935473.html這篇博客所做的筆記有疑惑可以去看這篇文章from pyquery import PyQue

python爬蟲scrapy文件下載

files 下載 item toc mat spider color pid 一點 我們在寫普通腳本的時候,從一個網站拿到一個文件的下載url,然後下載,直接將數據寫入文件或者保存下來,但是這個需要我們自己一點一點的寫出來,而且反復利用率並不高,為了不重復造輪子,scra

Python 爬蟲第一次接觸

with close def fin port 更新 top sta .get 爬豆瓣網電影TOP250名單 ------- 代碼未寫完,等待更新 import requests from requests.exceptions import RequestExcep

python爬蟲scrapy模擬登錄

這不 eight 搜索 頁面 response dom cookie值 知乎 blog 背景:   初來乍到的pythoner,剛開始的時候覺得所有的網站無非就是分析HTML、json數據,但是忽略了很多的一個問題,有很多的網站為了反爬蟲,除了需要高可用代理IP地址池外,還

python爬蟲線程池和進程池

偏見 通信 內存空間 正常 io操作 爬取 網站 總結 性能 一、需求   最近準備爬取某電商網站的數據,先不考慮代理、分布式,先說效率問題(當然你要是請求的太快就會被封掉,親測,400個請求過去,服務器直接拒絕連接,心碎),步入正題。一般情況下小白的我們第一個想到的是fo

python爬蟲Splash使用初體驗

ans 服務器 wid ajax tor 為什麽 安裝 異步 理由 Splash是什麽:   Splash是一個Javascript渲染服務。它是一個實現了HTTP API的輕量級瀏覽器,Splash是用Python實現的,同時使用Twisted和QT。Twisted(QT

python爬蟲真實世界中的網頁解析

爬蟲 兩種 del http協議 head 常用 nbsp 是我 返回 Request和Response Request是我們平常瀏覽網頁,向網站所在的服務器發起請求,而服務器收到請求後,返回給我們的回應就是Response,這種行為就稱為HTTP協議,也就是客戶端(瀏覽器