自开发shell脚本定时采集日志数据到hdfs

Posted 无心大数据

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自开发shell脚本定时采集日志数据到hdfs相关的知识,希望对你有一定的参考价值。



阅读本文大概需要9分钟

啊,消失了两天的无心回来学习了!!!自开发shell脚本定时采集日志数据到hdfs自开发shell脚本定时采集日志数据到hdfs自开发shell脚本定时采集日志数据到hdfs

今天无心学习的是自开发shell脚本定时采集日志数据到hdfs上。咳咳自开发shell脚本定时采集日志数据到hdfs


自开发shell脚本定时采集数据到hdfs上


假设公司的业务系统是一个web服务器。比如说几个tomcat,他的页面上有js埋点,获取用户浏览行为,获取tomcat的action。然后tomcat里面打印日志log.info()...在服务器的本地磁盘打印...access.log,access.log1,access.log2,然后汇聚这些日志到Hdfs上来后续作分析,一个Hadoop集群里面,吧日志拿过来,可以隔一段时间拿过来一次,可以定时拿过来,比如一小时一次,这意味着数据一小时搜集一次。写一个java后台程序,每个小时运行一次读取本地磁盘的数据。access.log不需要读,这是正在写的文件,读取access.log.1这些文件,然后在copyfromlocal拷到Hdfs上面去。上传上去之后统计到Hdfs里面一个固定的文件夹里面。在java里面写一个定时的程序,(后面使用storm配置)或者服务器定时启动java程序。可以在linux上使用corntab配置定时启动java程序的一个脚本。或者使用一个脚本上传到hdfs里面。下面这张是示意图:


自开发shell脚本定时采集日志数据到hdfs


在shell脚本里面写的东西:脚本也用corntab调度即可。这个是shell脚本和注释:


#!/bin/bash

#set java env设置环境变量,保证读取到shell里面的环境变量。先export一下。

export JAVA_HOME=/home/hadoop/app/jdk1.7.0_51

export JRE_HOME=${JAVA_HOME}/jre

export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib

export PATH=${JAVA_HOME}/bin:$PATH

#set hadoop env在读取一下Hadoop环境命令

export HADOOP_HOME=/home/hadoop/app/hadoop-2.6.4

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

#日志文件存放的目录,定义日志的原始目录

log_src_dir=/home/hadoop/logs/log/

#待上传文件存放的目录

log_toupload_dir=/home/hadoop/logs/toupload/

#日志文件上传到hdfs的根路径,日期也可以通过date命令动态获取来调整

hdfs_root_dir=/data/clickLog/20151226/

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

echo "log_src_dir:"$log_src_dir

ls $log_src_dir | while read fileName    #log_src_dir里面文件一行一行读取,读取后反倒fileName里面。

do

if [[ "$fileName" == access.log.* ]]; 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


脚本里面的目录提前在linux本地下创建好或者直接写入脚本都可以。这里在本地创建。

创建Hdfs里面的目录


hadoop fs -mkdir -p /data/clickLog/20151226/


创建本地目录:

mkdir -p /home/hadoop/logs/log/   //创建日志目录

mkdir -p /home/hadoop/logs/toupload/  //创建带上传目录


然后要模拟本地产生数据,产生在日志文件的目录:


package cn.itcast.bigdata.log;

import java.util.Date;

import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;

public class GenerateLog {
 public static void main(String[] args) throws Exception {
   Logger logger = LogManager.getLogger("testlog");
   int i = 0;
   while (true) {
     logger.info(new Date().toString() + ".............................");
     i++;
     Thread.sleep(100);
     if (i > 1000000)
       break;
   }
 }
}


在插入一个log4j.properties文件


log4j.rootLogger=INFO,testlog

log4j.appender.testlog = org.apache.log4j.RollingFileAppender
log4j.appender.testlog.layout = org.apache.log4j.PatternLayout
log4j.appender.testlog.layout.ConversionPattern = [%-5p][%-22d{yyyy/MM/dd HH:mm:ssS}][%l]%n%m%n
log4j.appender.testlog.Threshold = INFO
log4j.appender.testlog.ImmediateFlush = TRUE
log4j.appender.testlog.Append = TRUE
log4j.appender.testlog.File = /home/hadoop/logs/log/access.log
log4j.appender.testlog.MaxFileSize = 10KB
log4j.appender.testlog.MaxBackupIndex = 20
#log4j.appender.testlog.Encoding = UTF-8


每个文件最大10k。然后将这个打成一个Jar包导入linux内。


自开发shell脚本定时采集日志数据到hdfs


自开发shell脚本定时采集日志数据到hdfs


自开发shell脚本定时采集日志数据到hdfs


然后将这个jar包导入Linux中:

输入命令rz或者alt+p导入都可以,会有一个上传本地文件的选择:


自开发shell脚本定时采集日志数据到hdfs


然后导入文件后回到文件目录,执行命令


[root@mini1 ~]# java -jar log.jar


执行命令后日志文件已经开始产生,然后输入命令进入到数据的目录查看:


自开发shell脚本定时采集日志数据到hdfs


输入一个脚本运行:


vi datacollect.sh


然后将刚才说的shell脚本拷进来,添加执行权限:


chmod +x datacollect.sh


执行脚本


./datacollect.sh


自开发shell脚本定时采集日志数据到hdfs



当然也可以不产生中间文件,直接上传。产生中间文件的目的是为了以后方便管理,知道哪些文件上传过。


最后我们在进入到hdfs查看,发现已经上传到了Hdfs文件系统内,每个文件大小10kb


自开发shell脚本定时采集日志数据到hdfs


我们还可以利用crontab命令实现定时启动这个脚本

crontab命令这个是crontab命令的基本格式自开发shell脚本定时采集日志数据到hdfs


*  *  *  *  *  command 

分  时  日  月  周  命令 





无心从零开始大数据学习笔记




以上是关于自开发shell脚本定时采集日志数据到hdfs的主要内容,如果未能解决你的问题,请参考以下文章

大数据离线处理数据项目 网站日志文件数据采集 日志拆分 数据采集到HDFS并进行预处理

日志分析_使用shell完整日志分析案例

RDBMS数据定时采集到HDFS

脚本管理日志流式采集处理保存过程

HDFS案例

python定时器用法 + 获取脚本所在绝对路径 + 定义日志格式 + shell将脚本直接启动到后