需求分析:
点击流日志每天都10T,在业务应用服务器上,需要准实时上传至数据仓库(Hadoop HDFS)上。一般上传文件都是在凌晨24点操作,由于很多种类的业务数据都要在晚上进行传输,为了减轻服务器的压力,避开高峰期。如果需要伪实时的上传,则采用定时上传的方式。
用到的技术:
HDFS SHELL:
hadoop fs –put xxxx.tar /data
还可以使用 Java API 满足上传一个文件,不能满足定时、周期性传入。
定时调度器:
Linux crontab
crontab -e
*/5 * * * * $home/bin/command.sh //五分钟执行一次 系统会自动执行脚本,每5分钟一次,执行时判断文件是否符合上传规则,符合则上传
实现流程
1.日志产生程序
日志产生程序将日志生成后,产生一个一个的文件,使用滚动模式创建文件名。
日志生成的逻辑由业务系统决定,比如在log4j配置文件中配置生成规则,如:当xxxx.log 等于10G时,滚动生成新日志。
log4j.logger.msg=info,msg log4j.appender.msg=cn.maoxiangyi.MyRollingFileAppender log4j.appender.msg.layout=org.apache.log4j.PatternLayout log4j.appender.msg.layout.ConversionPattern=%m%n log4j.appender.msg.datePattern='.'yyyy-MM-dd log4j.appender.msg.Threshold=info log4j.appender.msg.append=true log4j.appender.msg.encoding=UTF-8 log4j.appender.msg.MaxBackupIndex=100 log4j.appender.msg.MaxFileSize=10GB log4j.appender.msg.File=/home/hadoop/logs/log/access.log
细节:
- 如果日志文件后缀是1\2\3等数字,该文件满足需求可以上传的话。把该文件移动到准备上传的工作区间。
- 工作区间有文件之后,可以使用hadoop put命令将文件上传。
阶段问题:
待上传文件的工作区间的文件,在上传完成之后,是否需要删除掉。
2.伪代码
使用ls命令读取指定路径下的所有文件信息,
ls | while read line //判断line这个文件名称是否符合规则 if line=access.log.* ( 将文件移动到待上传的工作区间 ) //批量上传工作区间的文件 hadoop fs –put xxx
脚本写完之后,配置linux定时任务,每5分钟运行一次。
代码实现
代码第一版本,实现基本的上传功能和定时调度功能
代码第二版本:增强版V2(基本能用,还是不够健全)
效果展示及操作步骤
1、日志收集文件收集数据,并将数据保存起来,效果如下:
2、上传程序通过crontab定时调度
3、程序运行时产生的临时文件
4、Hadoo hdfs上的效果