文章目录
- 1 定时上传日志文件
- 1.1 需求
- 1.2 思路分析
- 1.3 Shell脚本
- 1.4 效果
- 2 定时下载日志文件
- 2.1 需求
- 2.2 思路分析
- 2.3 Shell脚本
- 2.4 效果
1 定时上传日志文件
1.1 需求
将日志文件(access_2020_01_01.log)每天凌晨将昨天生成的日志文件上传到HDFS上,按天分目录存储,HDFS上的目录格式为20200101。
1.2 思路分析
- 获取昨天日志文件的名称
- 在HDFS上使用昨天的日期创建目录
- 将昨天的日志文件上传到刚创建的HDFS目录中
- 考虑脚本重跑和补数据的情况
- 配置
crontab
任务(定时任务)
1.3 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]# vi /etc/crontab
#使用重定向生成执行日志文件
0 1 * * * root sh /data/shell/uploadLogData.sh >> /data/shell/uploadLogData.log
1.4 效果
[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
2 定时下载日志文件
2.1 需求
定时将HDFS指定目录下的多个日志文件下载到Linux本地磁盘中,并且合并为一个文件。
1:假设HDFS上有一个目录hdfs://bigdata01:9000/d2/20210101
,此目录中会有多个日志文件
2:定时任务可以将前一天日期目录中的日志数据最终合并输出到本地的一个日志文件中
HDFS日志文件格式如下所示:
[root@bigdata01 ~]# hdfs dfs -ls hdfs://bigdata01:9000/d2/20210101
-rw-r--r-- 2 root supergroup 1361 2021-01-01 00:01 /user_00.log
-rw-r--r-- 2 root supergroup 1361 2021-01-01 01:01 /user_01.log
-rw-r--r-- 2 root supergroup 1361 2021-01-01 02:01 /user_02.log
省略....
-rw-r--r-- 2 root supergroup 1361 2021-01-01 23:01 /user_23.log
注意:默认情况下每天会产生一个新的日期目录,每小时产生1个日志文件,所以一天会产生24个日志文件
2.2 思路分析
- 获取昨天日志文件的名称
- 在HDFS和本地Linux使用昨天的日期创建日志目录
- 遍历HDFS日志文件
- 将遍历到的日志文件追加重定向到本地日志文件中
2.3 Shell脚本
#!/bin/bash
# 获取昨天日期字符串
yesterday=$1
if [ "$yesterday" = "" ]
then
yesterday=`date +%Y%m%d --date="1 days ago"`
fi
#HDFS拼接目录
hdfsPath=/d2/$yesterday
#拼接和创建linux中的本地目录
localPath=/data/d2/$yesterday
mkdir -p $localPath/user.log
#遍历HDFS的日志文件
Files=`hdfs dfs -ls $hdfsPath | awk '{print $8}'`
for file in $Files
do
#追加重定向到本地日志文件目录
hdfs dfs -cat $file>>$localPath/user.log
done
设置定时任务:见定时上传日志文件
2.4 效果
[root@bigdata01 ~]# ls /data/d2/20210101
-rw-------. 1 root root 9999 Jan 02 01:00 user.log