先开集群,在logs目录底下创脚本文件upload2HDFS.sh(vim upload2HDFS.sh)
脚本内容:
#!/bin/bash 脚本开头,固定格式
#JAVA_HOME环境变量设置
export JAVA_HOME=/usr/java/jdk1.8.0_171-amd64
export PATH=$PATH:$JAVA_HOME/bin
#HADOOP_HOME环境变量设置
export HADOOP_HOME=/opt/programs/hadoop-3.1.4
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
#日志文件存放的目录
log_src_dir=/opt/data/logs/log/
#待上传文件存放的目录
log_toupload=/opt/data/logs/toupload/
#设置日志文件上传的路径
#设置日期
date1=$(date -d last-day +%Y_%m_%d)
#日志文件上传到hdfs的根路径
hdfs_root_dir=/data/clicklog/$date1/
#打印环境变量信息
echo "envs:hadoop_home:$HADOOP_HOME"
#读取日志文件的目录,判断是否有需要上传的文件
echo "log-src_dir:"$log_scr_dir
#找到列表文件willDoing
ls $log_toupload_dir | grep will | grep -v "_COPY_" | grep -v "_DONE_" | while read line
do
#打印信息
echo "toupload is in file:"$line
#将待上传文件列表willDoing改名为willDoing_COPY_
mv $log_toupload_dir$line $log_toupload_dir$line"_COPY_"
#读列表文件willDoing_COPY_的内容(一个一个的待上传文件名),此处的line就是列表中的一个待上传文件的path
cat $log_toupload_dir$line"_COPY_" | while read line
do
#打印信息
echo "puting...$line to hdfs path.....$hdfs_root_dir"
hadoop fs -mkdir -p $hdfs_root_dir
hadoop fs -put $line $hdfs_root_dir
done
mv $log_toupload_dir$line"_COPY_" $log_toupload_dir$line"_DONE_"
done
ls $log_src_dir | while read fileName
do
if [[ "$fileName" == access.log.* ]]; then
# if [ "access.log" = "$fileName" ];then
date2=$(date "+%Y_%m_%d_%H_%M_%S")
#将文件移动到待上传目录并重命名
#打印信息
echo "moving $log_src_dir$fileName to $log_toupload_dir"xxxxx_click_log_$fileName"$date"
mv $log_src_dir$fileName $log_toupload_dir"xxxxx_click_log_$fileName"$date
#将待上传的文件path写入一个列表文件willDoing
echo $log_toupload_dir"xxxxx_click_log_$fileName"$date >> $log_toupload_dir"willDoing."$date
fi
done
保存文本并退出(esc键,:wq)
1、需要设置Java环境变量和Hadoop环境变量(这样做是用来提高系统的可靠性,保障运行程序的机器在没有配置环境变量的情况下依然能够运行脚本)
#JAVA_HOME环境变量设置
export JAVA_HOME=/usr/java/jdk1.8.0_171-amd64
export PATH=$PATH:$JAVA_HOME/bin
#HADOOP_HOME环境变量设置
export HADOOP_HOME=/opt/programs/hadoop-3.1.4
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
2、为了让开发者便于控制上传文件的流程,可以在脚本中设置一个日志存放目录和待上传文件目录,若上传过程中发生错误只需要查看该目录就能知道文件的上传进度。(手动创建这两个目录:/opt/data/logs/log、/opt/data/logs/toupload)
手动创建两个目录:
mkdir -p /opt/data/logs/log/
mkdir -p /opt/data/logs/toupload/
3、设置上传的HDFS目标路径,命名格式以时间结尾,并且输出打印信息
4、将从待上传目录中上传到HDFS中
5、将文件首先移动到待上传目录
6、保存好文件后:
转到当前目当 : cd /opt/data/logs/log/
创建日志文件(内容随意): vim access.log
7、转换格式:(/opt/data/log底下)
cp access.log access.log.1
cp access.log access.log.2
cp access.log access.log.3
cp access.log access.log.4
8、在 /opt/data/logs/目录下sh upload2HDFS.sh(执行脚本),看到这个就成功了
envs:hadoop_home:/opt/programs/hadoop-3.1.4
log-src_dir:
toupload is in file:willDoing.
puting...xxxxx_click_log_access.log.1 to hdfs path...../data/clicklog/2022_10_31/
puting...xxxxx_click_log_access.log.2 to hdfs path...../data/clicklog/2022_10_31/
puting...xxxxx_click_log_access.log.3 to hdfs path...../data/clicklog/2022_10_31/
puting...xxxxx_click_log_access.log.4 to hdfs path...../data/clicklog/2022_10_31/
注:在hdfs会自动生成 /data/..