需求分析: 在实际工作中会有定时上传数据到HDFS的需求,我们有一个web项目每天都会产生日志文件,日志文件的格式为access_2020_01_01.log这种格式的,每天产生一个,我们需要每天凌晨将昨天生成的日志文件上传至HDFS上,按天分目录存储,HDFS上的目录格式为20200101

    针对这个需求,我们需要开发一个shell脚本,方便定时调度执行
    第一步:我们需要获取到昨天日志文件的名称
    第二步:在HDFS上面使用昨天的日期创建目录
    第三步:将昨天的日志文件上传到刚创建的HDFS目录中
    第四步:要考虑到脚本重跑,补数据的情况
    第五步:配置crontab任务

    创建测试数据,注意,文件名称中的日期根据昨天的日期命名

    1. mkdir -p /data/log
    2. cd /data/log
    3. vim access_2022_01_03.log
    4. log1
    5. log2
    6. log3

    开发shell脚本 uploadLogData.sh

    yesterday=$1
    if [ "$yesterday" = "" ]
    then
            yesterday=`date +%Y_%m_%d --date="1 days ago"`
    fi
    
    # 拼接日志文件路径信息
    logPath=/data/log/access_${yesterday}.log
    
    # 将日期字符串中的_去掉
    hdfsPath=/log/${yesterday//_/}
    # 在hdfs上创建目录
    hdfs dfs -mkdir -p ${hdfsPath}
    # 将数据上传到hdfs的指定目录中
    hdfs dfs -put  ${logPath} ${hdfsPath}
    

    执行脚本测试

    sh uploadLogData.sh
    

    image.png

    如果想要指定日期上传数据,可以通过在脚本后面传递参数实现
    先创建一个日期的测试数据

    cd /data/log/
    
    cp access_2022_01_03.log  access_2020_01_01.log
    

    执行脚本

    sh uploadLogData.sh 2020_01_01
    

    image.png
    这样后期如果遇到某天的数据漏传了,或者需要重新上传,就可以通过手工指定日期实现上传操作,在实际工作中这种操作是不可避免的,所以我们在开发脚本的时候就直接考虑好补数据的情况,别等需要用的时候了再去增加这个功能。

    最后配置crontab定时任务,每天凌晨1点执行

    vim /etc/crontab
    
    0 1 * * * root sh /root/myShell >> /root/myShell/uploadLogData.log