目录
- 1.功能:将本地日志上传到hdfs中。
- 2.实现:分两步进行,第一步将文件复制到待上传目录,第二步将文件设置标志(copy)循环逐条复制hdfs中,并更改标志(done)
- 3.代码及结果展示
1.功能:
将本地日志上传到hdfs中。
2.实现:
分两步进行,
- 第一步将文件复制到待上传目录,
- 第二步将文件设置标志(copy)循环逐条复制hdfs中,并更改标志(done)
3.代码及结果展示
#!/bin/bash
#导入系统环境 #set java env export JAVA_HOME=/home/hadoop/app/jdk1.7.0_45 export JRE_HOME=${JAVA_HOME}/jre export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib export PATH=${JAVA_HOME}/bin:$PATH
#set hadoop env export HADOOP_HOME=/home/hadoop/app/hadoop-2.6.4 export PATH=${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin:$PATH
# 本地文件上传到hdfs脚本流程说明(按照两步进行) # 1、先将需要上传的文件移动到待上传目录 # 2、在讲文件移动到待上传目录时,将文件按照一定的格式重名名
#日志文件存放的目录 log_src_dir=/home/hadoop/logs/log/
#待上传文件存放的目录 log_toupload_dir=/home/hadoop/logs/toupload/
#日志文件上传到hdfs的根路径 hdfs_root_dir=/data/clickLog/20151226/
#打印环境变量信息 echo "envs: hadoop_home: $HADOOP_HOME"
#读取日志文件的目录,判断是否有需要上传的文件 echo "log_src_dir:"$log_src_dir ls $log_src_dir | while read fileName do if [[ "$fileName" == access.log.* ]]; then # if [ "access.log" = "$fileName" ];then date=`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 #找到列表文件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 -put $line $hdfs_root_dir done mv $log_toupload_dir$line"_COPY_" $log_toupload_dir$line"_DONE_" done
|
结果展示:
执行脚本 bash uploadFile2Hdfs.sh
待上传目录结果
hdfs 目录结果