Python之——自動上傳本地log檔案到HDFS(基於Hadoop 2.5.2)
阿新 • • 發佈:2019-01-24
一、場景描述
比如我們的網站共有5臺Web裝置,日誌檔案存放在/data/logs/日期(20180114)/access.log。日誌為預設的Nginx定義格式,如下所示:
共有12列資料(空格分隔)分別為:10.2.2.234 - - [12/Jan/2018:08:36:23 +0800] "POST /statistics/count/collection?company=6F79078F79D77550739EF61CD0DC2A83&nonce_str=nbmmn8bds4j84spu0c50ed0tm2ihfk3e&timeStamp=1515717383974&sign=91803CDB91BD598F29643F899E529D4A&client=ios&server=statistics HTTP/1.1" 200 287 "-" "CareHeart/2.2.7 (iPhone; iOS 10.3.1; Scale/2.00)"
1)客戶端IP
2)空白(遠端登入名稱)
3)空白(認證的遠端使用者)
4)請求時間
5)UTF時差
6)方法
7)資源(訪問的路徑)
8)協議
9)狀態碼
10)傳送的位元組數
11)訪問來源
12)客戶端資訊(不具體拆分)
二、編寫部署HDFS的客戶端
這裡,我們新建指令碼檔案hdfsput.py,具體通過subprocess.Popen()方法呼叫HDFS相關外部命令,實現建立HDFS目錄及客戶端檔案上傳,具體程式碼如下:
【/usr/local/python/source/hdfsput.py】
# -*- coding:UTF-8 -*- ''' Created on 2018年1月14日 @author: liuyazhuang ''' import subprocess import sys import datetime webid = "web1" #HDFS儲存日誌的標誌,其他Web伺服器分別為web2、web3、web4、web5 currdate = datetime.datetime.now().strftime('%Y%m%d') #日誌本地儲存路徑 logspath = "/data/logs/" + currdate + "/access.log" #HDFS儲存日誌名 logname = "access.log." + webid try: #建立HDFS目錄,格式為website.com/20180114 subprocess.Popen(["/usr/local/hadoop-2.5.2/bin/hadoop", "fs", "-mkdir", "hdfs://liuyazhuang121:9000/user/root/website.com/" + currdate], stdout = subprocess.PIPE) except Exception,e: pass #上傳本地日誌到HDFS putinfo = subprocess.Popen(["/usr/local/hadoop-2.5.2/bin/hadoop", "fs", "-put", logspath, "hdfs://liuyazhuang121:9000/user/root/website.com/" + currdate+ "/" + logname], stdout = subprocess.PIPE) for line in putinfo.stdout: print line
三、部署HDFS的客戶端
我們需要在5臺Web伺服器部署HDFS的客戶端,以便定期上傳Web日誌到HDFS儲存平臺,最終實現分散式計算。需要安裝JDK(配置環境變數)、Hadoop(配置環境變數)。然後新增上傳日誌的功能到crontab,內容如下:
55 23 * * * /usr/bin/python /usr/local/python/source/hdfsput.py >> /dev/null 2>&1
截止目前,資料的分析源已經準備就緒,接下來的工作便是分析了。