1. 程式人生 > >Python之——自動上傳本地log檔案到HDFS(基於Hadoop 2.5.2)

Python之——自動上傳本地log檔案到HDFS(基於Hadoop 2.5.2)

一、場景描述

比如我們的網站共有5臺Web裝置,日誌檔案存放在/data/logs/日期(20180114)/access.log。日誌為預設的Nginx定義格式,如下所示:

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)"
共有12列資料(空格分隔)分別為:

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
截止目前,資料的分析源已經準備就緒,接下來的工作便是分析了。