返回 导航

大数据

hangge.com

Hadoop - 实现定时将日志文件上传至HDFS教程

作者:hangge | 2024-07-02 08:30
    在实际工作中,定时上传数据到 HDFSHadoop 分布式文件系统)是一个常见的需求。本文将通过样例演示如何每天凌晨将前一天生成的日志文件上传到 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 上了:
评论

全部评论(0)

回到顶部