实战:定时上传数据至HDFS

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

针对这个需求,我们需要开发一个shell脚本,方便定时调度执行

第一步:我们需要获取到昨天日志文件的名称

第二步:在HDFS上面使用昨天的日期创建目录

第三步:将昨天的日志文件上传到刚创建的HDFS目录中

第四步:要考虑到脚本重跑,补数据的情况

第五步:配置crontab任务

开始开发shell脚本,脚本内容如下:

[root@bigdata01 ~]# mkdir -p  /data/shell
[root@bigdata01 ~]# cd /data/shell
[root@bigdata01 shell]# vi uploadLogData.sh
#!/bin/bash

# 获取昨天日期字符串
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}

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

[root@bigdata01 shell]# mkdir -p /data/log
[root@bigdata01 shell]# cd /data/log
[root@bigdata01 log]# vi access_2020_04_08.log
log1
log2
log3

执行脚本

[root@bigdata01 log]# cd /data/shell/
[root@bigdata01 shell]# sh -x uploadLogData.sh 
+ yesterday=
+ '[' '' = '' ']'
++ date +%Y_%m_%d '--date=1 days ago'
+ yesterday=2020_04_08
+ logPath=/data/log/access_2020_04_08.log
+ hdfsPath=/log/20200408
+ hdfs dfs -mkdir -p /log/20200408
+ hdfs dfs -put /data/log/access_2020_04_08.log /log/20200408
[root@bigdata01 shell]# hdfs dfs -ls /log/20200408
Found 1 items
-rw-r--r--   2 root supergroup         15 2020-04-09 16:05 /log/20200408/access_2020_04_08.log

注意:如果想要指定日期上传数据,可以通过在脚本后面传递参数实现

先创建一个日期的测试数据

[root@bigdata01 shell]# cd /data/log/
[root@bigdata01 log]# cp access_2020_04_08.log  access_2020_01_01.log

执行脚本

[root@bigdata01 log]# cd /data/shell/
[root@bigdata01 shell]# sh -x uploadLogData.sh 2020_01_01
+ yesterday=2020_01_01
+ '[' 2020_01_01 = '' ']'
+ logPath=/data/log/access_2020_01_01.log
+ hdfsPath=/log/20200101
+ hdfs dfs -mkdir -p /log/20200101
+ hdfs dfs -put /data/log/access_2020_01_01.log /log/20200101
[root@bigdata01 shell]# hdfs dfs -ls /log/20200101
Found 1 items
-rw-r--r--   2 root supergroup         15 2020-04-09 16:17 /log/20200101/access_2020_01_01.log

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

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

[root@bigdata01 shell]# vi /etc/crontab 
0 1 * * * root sh /data/shell/uploadLogData.sh >> /data/shell/uploadLogData.log

results matching ""

    No results matching ""