自开发shell脚本定时采集日志数据到hdfs
Posted 无心大数据
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自开发shell脚本定时采集日志数据到hdfs相关的知识,希望对你有一定的参考价值。
阅读本文大概需要9分钟
啊,消失了两天的无心回来学习了!!!
今天无心学习的是自开发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脚本里面写的东西:脚本也用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内。
然后将这个jar包导入Linux中:
输入命令rz或者alt+p导入都可以,会有一个上传本地文件的选择:
然后导入文件后回到文件目录,执行命令
[root@mini1 ~]# java -jar log.jar
执行命令后日志文件已经开始产生,然后输入命令进入到数据的目录查看:
输入一个脚本运行:
vi datacollect.sh
然后将刚才说的shell脚本拷进来,添加执行权限:
chmod +x datacollect.sh
执行脚本
./datacollect.sh
当然也可以不产生中间文件,直接上传。产生中间文件的目的是为了以后方便管理,知道哪些文件上传过。
最后我们在进入到hdfs查看,发现已经上传到了Hdfs文件系统内,每个文件大小10kb
我们还可以利用crontab命令实现定时启动这个脚本
crontab命令这个是crontab命令的基本格式
* * * * * command
分 时 日 月 周 命令
无心从零开始大数据学习笔记
以上是关于自开发shell脚本定时采集日志数据到hdfs的主要内容,如果未能解决你的问题,请参考以下文章