当前位置:   article > 正文

案例实践:Shell定时上传文件至HDFS_公司在线服务器每天都会产生网站运行日志,为了避免单个日志文件过大,日志文件需按

公司在线服务器每天都会产生网站运行日志,为了避免单个日志文件过大,日志文件需按

目录

一、项目需求

二、实现思路

三、具体实现流程

1.规划文件目录

2.开发shell脚本

3.给shell脚本授权

4.定时执行Shell脚本

5.查看HDFS历史访问日志


一、项目需求

公司在线服务器每天都会产生网站运行日志,为了避免单个日志文件过大,日志文件需要每个小时进行回滚,现在要求每小时定时上传日志文件到HDFS集群,后期再使用MapReduce计算框架定时处理日志文件。

二、实现思路

在线服务器每小时滚动生成的访问日志文件名称为access.log,历史访问日志文件以时间为后缀精确到小时,名称为access.log.2023-09-19-15。

当前access.log会继续写入访问日志等待日志回滚,历史访问日志access.log.2023-09-22满足上传条件,可以先移动到待上传区间,再将将上传区间的文件上传至HDFS集群。

三、具体实现流程

1.规划文件目录

使用mkdir命令创建访问日志源文件目录和待上传目录,具体操作如图:

将”/home/hadoop/data/tomcat/logs“目录规划为访问日志源目录,而”/home/hadoop/data/unupload/logs"目录规划为访问日志待上传目录。

将文件access.log上传至“/home/hadoop/data/tomcat/logs"目录

源目录下包含当前访问日志和历史访问日志,目录内容如图所示:

2.开发shell脚本

基于HDFS Shell开发脚本uploadAccessLog2HDFS.sh,将访问日志文件上传至HDFS,核心脚本如下所示:

  1. #!/bin/bash
  2. #使得环境变量生效
  3. source ~/.bashrc
  4. #hadoop根目录
  5. hadoop_home=/soft/hadoop/bin
  6. #原始目录
  7. log_src_dir=/home/hadoop/data/tomcat/logs/
  8. #待传目录
  9. log_unupload_dir=/home/hadoop/data/unupload/logs/
  10. #hdfs日志存放路径
  11. curDay=`date +%Y%m%d`
  12. curHour=`date -d "1 hour ago" +"%H"`
  13. hdfs_root_dir=/warehouse/web/ods/o_web_access_log_d/$curDay/$curHour/
  14. #测试hdfs目录是否存在
  15. $hadoop_home/hdfs dfs -test -e $hdfs_root_dir
  16. if [ $? -eq 0 ] ;then
  17. echo 'directory is exist'
  18. else
  19. $hadoop_home/hdfs dfs -mkdir -p  $hdfs_root_dir
  20. fi
  21. #第一步:将原始目录访问日志移动到待上传目录
  22. ls $log_src_dir | while read logName
  23. do
  24.    if [[ "$logName" == access.log.* ]]; then
  25. suffix=`date +%Y_%m_%d_%H_%M_%S`
  26.        #将原始目录文件移动到待上传目录
  27.        mv $log_src_dir$logName $log_unupload_dir
  28.        #将待上传文件路径写入文件logUploadPath中
  29.        echo $log_unupload_dir"$logName" >> $log_unupload_dir"logUploadPath."$suffix
  30.    fi
  31. done
  32. #第二步:将待上传目录中的访问日志上传至HDFS
  33. ls $log_unupload_dir | grep logUploadPath |grep -v "_Ready_" | grep -v "_Done_" | while read logName
  34. do
  35.    #将待上传logUploadPath文件更名为logUploadPath_Ready_
  36.    mv $log_unupload_dir$logName $log_unupload_dir$logName"_Ready_"
  37.    #循环将logUploadPath_Ready_文件内容,上传至hdfs
  38.    cat $log_unupload_dir$logName"_Ready_" |while read logName
  39.    do
  40.        $hadoop_home/hdfs dfs -put $logName $hdfs_root_dir
  41.    done    
  42. #将准备上传logUploadPath_Ready_文件名,改为logUploadPath_Done_
  43.    mv $log_unupload_dir$logName"_Ready_"  $log_unupload_dir$logName"_Done_"
  44. done

3.给shell脚本授权

通过chmod命令给uploadAccessLog2HDFS.sh脚本授予当前用户可执行权限,具体操作如下

chmod u+x uploadAccessLog2HDFS.sh

4.定时执行Shell脚本

在Linux系统中,通过crontab命令定时执行shell脚本,具体操作如下:

crontab -e

写入以下内容:

5 * * * * /home/hadoop/shell/bin/uploadAccessLog2HDFS.sh

:wq保存并退出

即每小时的第5分钟定时执行uploadAccessLog2HDFS.sh脚本,将历史访问日志上传至HDFS集群规划的目录下。

5.查看HDFS历史访问日志
hdfs dfs -ls /warehouse/web/ods/o_web_access_log_d/20230919/00

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/777886
推荐阅读
相关标签
  

闽ICP备14008679号