【Hadoop】HDFS+Shell实践(定时上传数据至HDFS)
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
这篇博客是一个结合HDFS的Shell练习相对简单。现有需求每天1:00需要从系统上传一份昨天的日志文件到HDFS日志文件的格式为access_2023_01_01.logHDFS目录格式为20230101。这个需求是相对简单的分为以下几个步骤
- 获取昨天的日期
获取日期使用date
命令因为要获取昨天的日期因此添加参数--date="1 day ago"
为格式化日期格式因此添加参数+"%Y_%m_%d"
。完整命令为date --date="1 day ago" +"%Y_%m_%d"
- 在HDFS上面使用昨天的日期创建目录
hdfs dfs -mkdir -p ${hdfsPath}
其中hdfsPath
代表格式化的HDFS目录地址。 - 将昨天的日志文件上传到刚创建的HDFS目录中
hdfs dfs -put ${logPath} ${hdfsPath}
其中logPath
代表日志文件的地址。 - 要考虑到补数据的情况
yesterday=$1
这行代码意味着可以直接在shell命令行中执行sh test.sh 2023_01_01
类似的命令去补2023年1月1日的日志文件。 - 配置crontab任务
crontab -l
命令显示当前的定时任务crontab -e
命令配置定时任务。按照需求要在每天1:00定时执行该任务因此配置为0 1 * * * sh /test.sh
具体配置规则见【linux】shell基本语法。
完整代码如下
在shell脚本中向yesterday变量赋值时使用反引号``因为需要解析反引号中的字符命令并执行得出结果。
. /etc/profile
这行命令是为了加载环境变量因为直接使用了hdfs
命令正常情况下应该是bin/hdfs
。
#!bin/bash
# 加载环境变量
. /etc/profile
# 获取日期
yesterday=$1
if [ "$yesterday"="" ]
then
yesterday=`date --date="1 day ago" +"%Y_%m_%d"`
fi
logPath=/data/log/access_${yesterday}.log
hdfsPath=/log/${yesterday//_/}
hdfs dfs -mkdir -p ${hdfsPath}
hdfs dfs -put ${logPath} ${hdfsPath}
执行结果/log/20230123/access_2023_01_23.log
文件即为上传的日志文件。
[root@bigData01 log]# hdfs dfs -ls -R /
drwxr-xr-x - root supergroup 0 2023-01-24 20:20 /log
drwxr-xr-x - root supergroup 0 2023-01-24 20:33 /log/20230123
-rw-r--r-- 1 root supergroup 11 2023-01-24 20:33 /log/20230123/access_2023_01_23.log
-rw-r--r-- 1 root supergroup 1361 2023-01-24 11:03 /readme.txt
drwxr-xr-x - root supergroup 0 2023-01-18 10:52 /test
drwx------ - root supergroup 0 2023-01-24 11:03 /user
drwx------ - root supergroup 0 2023-01-24 11:03 /user/root
drwx------ - root supergroup 0 2023-01-24 11:03 /user/root/.Trash
drwx------ - root supergroup 0 2023-01-24 20:24 /user/root/.Trash/Current
drwx------ - root supergroup 0 2023-01-24 20:24 /user/root/.Trash/Current/log
drwx------ - root supergroup 0 2023-01-24 20:24 /user/root/.Trash/Current/log/20230123
-rw-r--r-- 1 root supergroup 11 2023-01-24 20:21 /user/root/.Trash/Current/log/20230123/access_2023_01_23.log
-rw-r--r-- 1 root supergroup 1361 2023-01-24 11:19 /user/root/.Trash/Current/readme.txt1674531666745
-rw-r--r-- 3 123 supergroup 13 2023-01-18 23:10 /win11.txt