飞腾创客

专注IT行业多余年,有非常叼的技术经验

Hadoop-HDFS-定时上转Nginx用户日志用shell脚本

1、其他API&stream操作

  Stream流形式操作HDFS,这是一个更底层的操作方式:

public void testUpload()  throws Exception{

 

 FSDataOutputStream outputStream =fs.create(newPath("/1.txt",true));

 FileInputStream inputStream=new FileInputStream("D:\\1.txt");

 IOUtils.copy(inputStream,outputStram);

}

2、案例:shell定时采集数据至HDFS

     网站每天产生的日志数据准时上传至HDFS集群上

 2.1 技术分析:

  HDFS  SHELL:

  hadoop fs -put //满足上传文件,不能满足定时,周期性传入

   Linux crontab:

   crontab -e

   0 0 * * */shell/uploadFile2Hdfs.sh //每天凌晨1200执行一次

2.2 实现流程:  采用Nginx进行日志采集

   upliadFile2HDFS.sh

   HDFS定时上传shell案例:

#!/bin/bash

#set java env

exportJAVA_HOME=/export/software/jdk1.8.0_65

exportJRE_HOME=${JAVA_HOME}/jre

exportCLASSPATH=.:${JAVA_HOME}/bin:{JRE_HOME}/bin

exportPATH=${JAVA_HOME}/bin:$PATH

 

#set hadoop env

export HADOOP HOME+/export/software/hadoop-2.7.4

exportPATH=${HADOOP_HOME}/bin:{HADOOP_HOME}/sbin:$PATH

 

 

#日志文件存放的目录

log_src_dir+/root/logs/log/

#待上转文件的存放目录

log_toupload_dir=/root/logs/toupload

#日志上传到HDFS的根路径

datel=‘date -d last-day+%Y_%m_%d’

hdfs_root_dir=/data/clickLog/$datel/

#打印环境变量信息

echo"envs:hadoop_home:$HADOOP_HOME"

#读取日志文件的目录,判断是否有需要上传的文件

echo"log_src_dir:"$log_src_dir

ls $log_src_dir | whileresd 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_scr_dir$fileName $log_toupload_dir"xxxxx_click_log_$fileName"$date

 #将待上传的文件path写入一个列表文件willDoing

 echo log_toupload_dir"xxxx_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 readline

do

  #打印信息

echo "toupload is infile:"$line

#将待上转文件列表willDoing改名为willDoing_COPY

mv $log_toupload_dir$line$log_toup_dir$line"_COPY_"

#读列文件willdoing-copy内容,此处的line就是列表中等待上传的一个文件的path

cat  $log_toupload_dir$line"_COPY_" |while read line

do

  #打印信息

  echo "puting ...$line to hdfspath......$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

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

Hadoop-HDFS-定时上转Nginx用户日志用shell脚本

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭