HDFS定时上传和下载日志文件


1 定时上传日志文件

1.1 需求

将日志文件(access_2020_01_01.log)每天凌晨将昨天生成的日志文件上传到HDFS上,按天分目录存储,HDFS上的目录格式为20200101。

1.2 思路分析

  1. 获取昨天日志文件的名称
  2. 在HDFS上使用昨天的日期创建目录
  3. 将昨天的日志文件上传到刚创建的HDFS目录中
  4. 考虑脚本重跑和补数据的情况
  5. 配置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 思路分析

  1. 获取昨天日志文件的名称
  2. 在HDFS和本地Linux使用昨天的日期创建日志目录
  3. 遍历HDFS日志文件
  4. 将遍历到的日志文件追加重定向到本地日志文件中

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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是希望

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值