Shell定时上传日志到HDFS
- 一、任务需求
- 二、实现思路
- 三、具体实现流程
- 3.1 规划文件上传目录
- 3.2 开发 shell 脚本
- 3.3 授予 shell 可执行权限
- 3.4 手动执行查看
- 3.4 定时执行 shell 脚本
一、任务需求
公司在线服务器每天都会产生网站运行日志,为了避免志文件过大,日志文件需按照群,后期再使用MapReduce计每小时进行回滚,现在要求每小时定时上传日志文件到算框架定时处理日志文件。
二、实现思路
在线服务器每小时滚动生成的访问日志文件名称为access.log,历史访问日志文件以时间为后缀精确到小时名称为access.log.2021-10-27-10。当前access.log会继续写入访问日志等待日志回滚,历史访问日志access.log.2021-10-27-10满足上传条件,可以先移动到待上传区间,然后再将待上传区间的文件上传至HDFS集群
三、具体实现流程
3.1 规划文件上传目录
- 原始日志存放目录
[root@hadoop1 hadoop]# mkdir -p /usr/local/hadoop/data/tomcat/log/
- 待传日志存放目录
[root@hadoop1 hadoop]# mkdir -p /usr/local/hadoop/data/unupload/log/
3.2 开发 shell 脚本
#!/bin/bash
#使得环境变量生效
source ~/.bashrc
#hadoop根目录
hadoop_home=/usr/local/hadoop/bin
#原始目录
log_src_dir=/usr/local/hadoop/data/tomcat/logs/
#待传目录
log_unupload_dir=/usr/local/hadoop/data/unupload/logs/
#hdfs日志存放路径
curDay=`date +%Y%m%d`
curHour=`date -d "1 hour ago" +"%H"`
hdfs_root_dir=/warehouse/web/ods/o_web_access_log_d/$curDay/$curHour/
#测试hdfs目录是否存在
$hadoop_home/hdfs dfs -test -e $hdfs_root_dir
if [ $? -eq 0 ] ;then
echo 'directory is exist'
else
$hadoop_home/hdfs dfs -mkdir -p $hdfs_root_dir
fi
#第一步:将原始目录访问日志移动到待上传目录
ls $log_src_dir | while read logName
do
if [[ "$logName" == access.log.* ]]; then
suffix=`date +%Y_%m_%d_%H_%M_%S`
#将原始目录文件移动到待上传目录
mv $log_src_dir$logName $log_unupload_dir
#将待上传文件路径写入文件logUploadPath中
echo $log_unupload_dir"$logName" >> $log_unupload_dir"logUploadPath."$suffix
fi
done
#第二步:将待上传目录中的访问日志上传至HDFS
ls $log_unupload_dir | grep logUploadPath |grep -v "_Ready_" | grep -v "_Done_" | while read logName
do
#将待上传logUploadPath文件更名为logUploadPath_Ready_
mv $log_unupload_dir$logName $log_unupload_dir$logName"_Ready_"
#循环将logUploadPath_Ready_文件内容,上传至hdfs
cat $log_unupload_dir$logName"_Ready_" |while read logName
do
$hadoop_home/hdfs dfs -put $logName $hdfs_root_dir
done
#将准备上传logUploadPath_Ready_文件名,改为logUploadPath_Done_
mv $log_unupload_dir$logName"_Ready_" $log_unupload_dir$logName"_Done_"
done
3.3 授予 shell 可执行权限
[root@hadoop1 bin]# chmod u+x uploadAccessLogToHDFS.sh
3.4 手动执行查看
[root@hadoop1 bin]# ./uploadAccessLog2HDFS.sh
3.4 定时执行 shell 脚本
[root@hadoop1 bin]# crontab -e
添加内容如下所示:
5 * * * * /usr/locl/shell/bin/uploadLog2HDFS.sh