大数据原理|shell脚本定时采集日志数据

一、采集数据到HDFS
1、建一个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

2、写一个shell脚本 xxx.sh文件
#!/bin/bash #set java env 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 export HADOOP_HOME=/home/hadoop/app/hadoop-2.6.4 export PATH=${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin:$PATH#版本1的问题: #虽然上传到Hadoop集群上了,但是原始文件还在。如何处理? #日志文件的名称都是xxxx.log1,再次上传文件时,因为hdfs上已经存在了,会报错。如何处理?#如何解决版本1的问题 #1、先将需要上传的文件移动到待上传目录 # 2、在讲文件移动到待上传目录时,将文件按照一定的格式重名名 #/export/software/hadoop.log1/export/data/click_log/xxxxx_click_log_{date}#日志文件存放的目录 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

3、将log4j.properties打成jar包,放在hadoop集群里,这样就能产生日志数据,然后启动shell脚本,就能将日志数据采集到hdfs里
【大数据原理|shell脚本定时采集日志数据】二、导入数据到Hive
1、编写shell脚本
#!/bin/bashexport HIVE_HOME=/opt/apps/hive-3.1.2/DT=`date -d'-1 day' +%Y-%m-%d`if [ $1 ] then DT=$1 fi${HIVE_HOME}/bin/hive -e " load data inpath '/logdata/app/${DT}' into table ODS17.APP_ACTION_LOG partition (dt='${DT}'); "if [ $? -eq 0 ] then echo "congratulations! 任务执行成功! 邮件已发送至admin@51doit.com" else echo "节哀顺变! 任务失败! 邮件已发送至admin@51doit.com" fi

2、添加定时器
配置定时调度(如果是简单的系统,可以用linux自带的crontab);
(项目中我们会采用更强大的定时调度系统:azkaban/oozie/airflow)
crontab -e 10 0 * * * sh /root/taskshells/01.load_ods.app_action_log.sh

更多java、大数据学习面试资料,请扫码关注我的公众号:
大数据原理|shell脚本定时采集日志数据
文章图片

    推荐阅读