python 處理 impala 日誌

python 處理 impala 日誌

1. cloudera manager 中 impala 的 API

impala API

本文用到的是:

/clusters/{clusterName}/services/{serviceName}/impalaQueries

2. python lib - urllib2, base64

urllib2 是我們的老朋友了,每次讀取網頁信息都需要用到它。
本篇的用法如下。

def getFromUrl(url):
        request = urllib2.Request(url)
        #print url
        request.add_header("Authorization", "Basic %s" % base64string)
        result = urllib2.urlopen(request)
        html = result.read()
        result.close()
        data = json.loads(html)
        return data

request -> urlopen -> read 即可得到網頁內容。

這裏需要着重理解的是 base64 ,在 getFromUrl 中有一個變量 base64string 定義如下。

base64string = base64.encodestring('%s:%s' % (user,password)).replace('\n', '')

因爲該 API 使用了 http 基本認證,需要在 Authorization header 放入基於 base64 加密的用戶名和密碼,中間用“:”連接,服務器將 Authorization header 中的用戶名密碼取出,進行驗證,如果驗證通過,將根據請求,發送資源給客戶端。

base64 模塊真正用的上的方法只有8個,分別是 encode, decode, encodestring, decodestring, b64encode,b64decode, urlsafe_b64decode,urlsafe_b64encode。他們8個可以兩兩分爲4組,encode, decode 一組,專門用來編碼和 解碼文件的,也可以對 StringIO 裏的數據做編解碼;encodestring,decodestring 一組,專門用來編碼和解碼字符串; b64encode和b64decode 一組,用來編碼和解碼字符串,並且有一個替換符號字符的功能。這個功能是這樣的:因爲 base64 編碼後的字符除 了英文字母和數字外還有三個字符 + / =, 其中 = 只是爲了補全編碼後的字符數爲 4 的整數,而 + 和 / 在一些情況下需要被替換的, b64encode 和 b64decode 正是提供了這樣的功能。至於什麼情況下 + 和 / 需要被替換,最常見的就是對 url 進行 base64 編碼的時候。urlsafe_b64encode 和 urlsafe_b64decode 一組,這個就是用來專門對 url 進行 base64 編解碼的,實際上也是調用的前一組函數。

3. python lib - re

python中的正則庫即 re ,也正是這個庫讓我頭疼了一天。

庫本身的使用並不複雜,複雜的是正則表達式本身……

def getPlan(data_str,file):
        plan = re.search(r'    Plan: \n\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-(.+?)\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-',data_str,re.S)
        file.write(plan.group(1).replace('\n','\\n')+'\n') if plan is not None else file.write('\n')

正則的一些知識可以看: 正則

修飾符 描述
re.I 使匹配對大小寫不敏感
re.L 做本地化識別(locale-aware)匹配
re.M 多行匹配,影響 ^ 和 $
re.S 使 . 匹配包括換行在內的所有字符
re.U 根據Unicode字符集解析字符。這個標誌影響 \w, \W, \b, \B.
re.X 該標誌通過給予你更靈活的格式以便你將正則表達式寫得更易於理解。

re.match與re.search的區別

re.match只匹配字符串的開始,如果字符串開始不符合正則表達式,則匹配失敗,函數返回None;而re.search匹配整個字符串,直到找到一個匹配。

4. python lib - datetime

基本用法本篇都用到啦,如下

utcToGmt = datetime.timedelta(hours=8)
ts = datetime.datetime.now() - utcToGmt
ddate = ts.strftime('%Y-%m-%d')

file_name =  ts.strftime('%H%M%S')
toTimeTmp = ts.strftime('%Y-%m-%dT%H:%M:%SZ')

5. python lib - os

os 可以在 python 中使用操作系統的指令,對於 windows 而言就是bat,對於 linux 而言就是 shell 。

#section 1
if not os.path.exists(date_dir):
    os.system('rm -r '+DATAPATH+'/*')   
    os.makedirs(date_dir)
    newPartition =True

#section 2
if newPartition:
    os.system("hadoop fs -mkdir "+smyTablePath+"cluster=1/date="+ddate+"/")
    os.system("hadoop fs -mkdir "+attrTablePath+"cluster=1/date="+ddate+"/")
    os.system("hadoop fs -mkdir "+execSmyTablePath+"cluster=1/date="+ddate+"/")

#section 3
os.remove(date_dir+"/smy_"+file_name)
os.remove(date_dir+"/attr_"+file_name)
os.remove(date_dir+"/exec_"+file_name)

6. python lib - logging

log 是第一次使用,個人感覺還不太會用,只會輸入一些 info ,對於如何捕捉 error 並輸入還不太熟悉。

logger = logging.getLogger('Impala Monitor')
logger.setLevel(logging.INFO)
fh = logging.FileHandler(LOGPATH+ddate+'.log')
fh.setLevel(logging.INFO)
#ch = logging.StreamHandler()
#ch.setLevel(logging.INFO)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)
#ch.setFormatter(formatter)
# add the handlers to the logger
logger.addHandler(fh)
#logger.addHandler(ch)

logger.info('Start')

7. shell 將 console 輸出到文件

一開始使用簡單的 > 並不能將輸出導入到文件中,後來發現了應該是

python pyt/parser.py >> ${LOGFILE} 2>&1

Redirect errors to the log file by appending 2>&1. 2 is the stream number for stderr (error messages), 1 is represents the stdout stream (the standard non-error output stream).

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章