載入資料
資料載入到Hive分割槽表(兩個分割槽,日期(20160316)和小時(10))中
每日載入前一天的日誌檔案資料到表db_track.track_log
1. 資料儲存
資料日誌檔案,放入某個目錄下,每天日誌檔案放入同一個目錄
eg: 20160316 - 目錄名稱
日誌檔案資料,每個小時生成一個檔案,一天總共有二十四個檔案
eg: 2016031820
2. shell指令碼編寫
負責排程的shell指令碼load_tracklogs.sh
注:這裡涉及到了兩個點:1)for迴圈 2) linux下字串的擷取${line:0:4} 3) 傳遞引數到hive的sql指令碼
#!/bin/sh
## 環境變數生效
. /etc/profile
## HIVE HOME
HIVE_HOME=/opt/cdh5.3.6/hive-0.13.1-cdh5.3.6
## 日誌目錄
LOG_DIR=/data/tracklogs
## 目錄名稱, 依據日期date獲取
yesterday=`date -d -1days "+%Y%m%d"`
###
for line in `ls $LOG_DIR/${yesterday}`
do
echo "loading $line .............."
#從檔名稱中解析出日期和小時
daily=${line:0:4}${line:4:2}${line:6:2}
hour=${line:8:2}
LOAD_FILE=${LOG_DIR}/${yesterday}/${line}
### echo $daily + $hour
### ${HIVE_HOME}/bin/hive -e "LOAD DATA LOCAL INPATH "${LOAD_FILE}" OVERWRITE INTO TABLE db_track.track_log PARTITION(date = "${daily}", hour = "${hour}") ;"
${HIVE_HOME}/bin/hive --hiveconf LOAD_FILE_PARAM=${LOAD_FILE} --hiveconf daily_param=${daily} --hiveconf hour_param=${hour} -f /home/hadoop/load_data.sql
done
負責載入資料的sql指令碼
注: 怎麼在HQL指令碼中獲取外接傳遞的引數
LOAD DATA LOCAL INPATH "${hiveconf:LOAD_FILE_PARAM}" OVERWRITE INTO TABLE db_track.track_log PARTITION(date = "${hiveconf:daily_param}", hour = "${hiveconf:hour_param}") ;
制定每天定時執行
可以在當前使用者下直接建立:crontab -e
注:crontab中的五個 *號分別代表分,時,日,月,周,下面的例子就是每天晚上1點30執行任務的例子,注意sh命令前一般需要加上絕對路徑
# LODAD DATA INTO TRACK_LOG
30 1 * * * /bin/sh /home/hadoop/load_tracklogs.sh
載入資料
資料載入到Hive分割槽表(兩個分割槽,日期(20160316)和小時(10))中
每日載入前一天的日誌檔案資料到表db_track.track_log
1. 資料儲存
資料日誌檔案,放入某個目錄下,每天日誌檔案放入同一個目錄
eg: 20160316 - 目錄名稱
日誌檔案資料,每個小時生成一個檔案,一天總共有二十四個檔案
eg: 2016031820
2. shell指令碼編寫
負責排程的shell指令碼load_tracklogs.sh
注:這裡涉及到了兩個點:1)for迴圈 2) linux下字串的擷取${line:0:4} 3) 傳遞引數到hive的sql指令碼
#!/bin/sh
## 環境變數生效
. /etc/profile
## HIVE HOME
HIVE_HOME=/opt/cdh5.3.6/hive-0.13.1-cdh5.3.6
## 日誌目錄
LOG_DIR=/data/tracklogs
## 目錄名稱, 依據日期date獲取
yesterday=`date -d -1days "+%Y%m%d"`
###
for line in `ls $LOG_DIR/${yesterday}`
do
echo "loading $line .............."
#從檔名稱中解析出日期和小時
daily=${line:0:4}${line:4:2}${line:6:2}
hour=${line:8:2}
LOAD_FILE=${LOG_DIR}/${yesterday}/${line}
### echo $daily + $hour
### ${HIVE_HOME}/bin/hive -e "LOAD DATA LOCAL INPATH "${LOAD_FILE}" OVERWRITE INTO TABLE db_track.track_log PARTITION(date = "${daily}", hour = "${hour}") ;"
${HIVE_HOME}/bin/hive --hiveconf LOAD_FILE_PARAM=${LOAD_FILE} --hiveconf daily_param=${daily} --hiveconf hour_param=${hour} -f /home/hadoop/load_data.sql
done
負責載入資料的sql指令碼
注: 怎麼在HQL指令碼中獲取外接傳遞的引數
LOAD DATA LOCAL INPATH "${hiveconf:LOAD_FILE_PARAM}" OVERWRITE INTO TABLE db_track.track_log PARTITION(date = "${hiveconf:daily_param}", hour = "${hiveconf:hour_param}") ;
制定每天定時執行
可以在當前使用者下直接建立:crontab -e
注:crontab中的五個 *號分別代表分,時,日,月,周,下面的例子就是每天晚上1點30執行任務的例子,注意sh命令前一般需要加上絕對路徑
# LODAD DATA INTO TRACK_LOG
30 1 * * * /bin/sh /home/hadoop/load_tracklogs.sh