一、采集数据到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
- Linux|Shell运行原理和Linux权限
- Linux|【Linux】Shell运行原理及Linux权限的概念
- Linux|Shell 编程~人入门到入坑。
- Linux技术|Windows平台下ADB的安装与使用
- c#|C#中使用SHFileOperation调用Windows的复制文件对话框
- Shell|Linux下 svn命令操作
- ubuntu环境|ubuntu10.04 常用命令
- ubuntu环境|Linux SSH相关命令