赞
踩
目录
公司在线服务器每天都会产生网站运行日志,为了避免单个日志文件过大,日志文件需要每个小时进行回滚,现在要求每小时定时上传日志文件到HDFS集群,后期再使用MapReduce计算框架定时处理日志文件。
在线服务器每小时滚动生成的访问日志文件名称为access.log,历史访问日志文件以时间为后缀精确到小时,名称为access.log.2023-09-19-15。
当前access.log会继续写入访问日志等待日志回滚,历史访问日志access.log.2023-09-22满足上传条件,可以先移动到待上传区间,再将将上传区间的文件上传至HDFS集群。
使用mkdir命令创建访问日志源文件目录和待上传目录,具体操作如图:
将”/home/hadoop/data/tomcat/logs“目录规划为访问日志源目录,而”/home/hadoop/data/unupload/logs"目录规划为访问日志待上传目录。
将文件access.log上传至“/home/hadoop/data/tomcat/logs"目录
源目录下包含当前访问日志和历史访问日志,目录内容如图所示:
基于HDFS Shell开发脚本uploadAccessLog2HDFS.sh,将访问日志文件上传至HDFS,核心脚本如下所示:
- #!/bin/bash
- #使得环境变量生效
- source ~/.bashrc
- #hadoop根目录
- hadoop_home=/soft/hadoop/bin
- #原始目录
- log_src_dir=/home/hadoop/data/tomcat/logs/
- #待传目录
- log_unupload_dir=/home/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
通过chmod命令给uploadAccessLog2HDFS.sh脚本授予当前用户可执行权限,具体操作如下
chmod u+x uploadAccessLog2HDFS.sh
在Linux系统中,通过crontab命令定时执行shell脚本,具体操作如下:
crontab -e
写入以下内容:
5 * * * * /home/hadoop/shell/bin/uploadAccessLog2HDFS.sh
:wq保存并退出
即每小时的第5分钟定时执行uploadAccessLog2HDFS.sh脚本,将历史访问日志上传至HDFS集群规划的目录下。
hdfs dfs -ls /warehouse/web/ods/o_web_access_log_d/20230919/00
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。