Hadoop - 实现定时将日志文件上传至HDFS教程
在实际工作中,定时上传数据到 HDFS(Hadoop 分布式文件系统)是一个常见的需求。本文将通过样例演示如何每天凌晨将前一天生成的日志文件上传到 HDFS 中。
(3)为确保脚本可以被执行,需要修改脚本文件的权限:
(4)简单测试一下,我们创建一个昨天的日志:
(2)在 crontab 文件中添加以下内容,表示每天凌晨 1 点执行一次 upload_to_hdfs.sh 脚本,并将输出日志记录到 upload_to_hdfs.log 文件中:
(2)可以看到指定的日志文件上传到 HDFS 上了:
1,需求说明
假设我们有一个 Web 项目,每天都会产生日志文件,例如文件格式为 access_2024_05_28.log,每天生成一个。我们需要每天凌晨将昨天生成的日志文件上传至 HDFS 上,按天分目录存储,那么 HDFS 上的目录格式为 20240528。
2,编写 Shell 脚本
(1)首先,我们需要编写一个 Shell 脚本来完成日志文件的上传工作。这个脚本将会:
- 获取昨天的日期。
- 根据日期生成日志文件的名称。
- 检查日志文件是否存在。
- 将日志文件上传到 HDFS 对应的目录中。
(2)我这里将脚本命名为 upload_to_hdfs.sh,脚本内容如下:
#!/bin/bash # 获取昨天的日期 yesterday=$1 if [ "$yesterday" = "" ] then yesterday=`date +%Y_%m_%d --date="1 days ago"` fi # 拼接日志文件路径信息 logPath=/data/log/access_${yesterday}.log # 检查日志文件是否存在 if [ -f "${logPath}" ]; then echo "Found log file: ${log_file}" # 将日期字符串中的_去掉 hdfsPath=/log/${yesterday//_/} # 在hdfs上创建目录 hdfs dfs -mkdir -p ${hdfsPath} # 将数据上传到hdfs的指定目录中 hdfs dfs -put ${logPath} ${hdfsPath} if [ $? -eq 0 ]; then echo "日志上传成功:${logPath} 至 ${hdfsPath}" else echo "日志上传失败:${logPath} 至 ${hdfsPath}" fi else echo "未发现日志文件: ${logPath}" fi
(3)为确保脚本可以被执行,需要修改脚本文件的权限:
chmod +x upload_to_hdfs.sh
(4)简单测试一下,我们创建一个昨天的日志:
mkdir -p /data/log cd /data/log vi access_2024_05_28.log
(5)接着手动执行这个脚本来上传昨天的日志:
sh -x /usr/shell/upload_to_hdfs.sh
(6)查看 HDFS 可以看到日志已经上传到指定目录下了:
3,配置定时任务
(1)我们希望脚本每天凌晨 1 点运行一次,可以使用 cron 来定时执行该脚本。首先执行如下命令编辑 crontab:
crontab -e
(2)在 crontab 文件中添加以下内容,表示每天凌晨 1 点执行一次 upload_to_hdfs.sh 脚本,并将输出日志记录到 upload_to_hdfs.log 文件中:
0 1 * * * /usr/shell/upload_to_hdfs.sh >> /usr/shell/upload_to_hdfs.log 2>&1
附:重新上传指定日志文件
(1)如果遇到某天的数据漏传了,或者需要重新上传,我们可以手动执行 upload_to_hdfs.sh 脚本,在脚本后面传递参数(待补录的日期)实现。
sh -x upload_to_hdfs.sh 2024_05_11
(2)可以看到指定的日志文件上传到 HDFS 上了: