这篇写的是大数据离线处理数据项目的第一个流程:数据采集
主要内容:
1)利用flume采集网站日志文件数据到access.log
2)编写shell脚本:把采集到的日志数据文件拆分(否则access.log文件太大)、重命名为access_年月日时分.log。 此脚本执行周期为一分钟
3)把采集到并且拆分、重命名的日志数据文件采集到HDFS上
4)将HDFS上的日志数据文件转移到HDFS上的预处理工作目录
1、采集日志数据文件并拆分日志文件安装crontab(文章最后有crontab *** 作指令),需要切换到root用户 *** 作:
yum install crontabs
编写拆解日志文件脚本
#!/bin/sh logs_path="/home/hadoop/nginx/logs/" pid_path="/home/hadoop/nginx/logs/nginx.pid" filepath=${logs_path}"access.log" echo $filepath mv ${logs_path}access.log ${logs_path}access_$(date -d '-1 day' '+%Y-%m-%d-%H-%M').log kill -USR1 `cat ${pid_path}`
其中:
logs_path是拆分后的日志文件存放的路径
pid_path是指向nginx运行的进程文件(存放了nginx的进程id)
filepath表示想要进行拆分的日志文件的路径
注意:重命名中这里的-1是因为:这里是离线处理,即今天处理的是昨天的数据,所以名称就需要日期-1
输入crontab配置指令(1表示每分钟)
*/1 * * * * sh /home/hadoop/bigdatasoftware/project1/nginx_log.sh
重新启动crontab服务:
service crond restart
重新载入配置使定时任务生效:
service crond reload
启动nginx,并访问nginx下的网页a.html和b.html
此时日志数据不断产生,并且存放在access.log文件中,然后进行拆分
成功采集到日志数据并成功拆分、重命名:
注意被拆分后的access.log是空的:
2、 把拆分成功的日志文件采集到HDFS在flume/job目录下新建配置文件
touch job/TaildirSource-hdfs.conf
编写flume配置文件:
agent1.sources = source1 agent1.sinks = sink1 agent1.channels = channel1 #监控一个目录下的多个文件新增的内容 agent1.sources.source1.type = TAILDIR #通过 json 格式存下每个文件消费的偏移量,避免从头消费 agent1.sources.source1.positionFile = /home/hadoop/taildir_position.json agent1.sources.source1.filegroups = f1 agent1.sources.source1.filegroups.f1 = /home/hadoop/nginx/logs/access_*.log agent1.sources.source1.interceptors = i1 agent1.sources.source1.interceptors.i1.type = host agent1.sources.source1.interceptors.i1.hostHeader = hostname #配置sink组件为hdfs agent1.sinks.sink1.type = hdfs agent1.sinks.sink1.hdfs.path=hdfs://hadoop121:8020/weblog/flume-collection/%Y-%m-%d/%H-%M_%{hostname} #指定文件名前缀 agent1.sinks.sink1.hdfs.filePrefix = access_log #指定每批下沉数据的记录条数 agent1.sinks.sink1.hdfs.batchSize= 100 agent1.sinks.sink1.hdfs.fileType = DataStream agent1.sinks.sink1.hdfs.writeFormat =Text #指定下沉文件按1MB大小滚动 agent1.sinks.sink1.hdfs.rollSize = 1048576 #指定下沉文件按1000000条数滚动 agent1.sinks.sink1.hdfs.rollCount = 1000000 #指定下沉文件按30分钟滚动 agent1.sinks.sink1.hdfs.rollInterval = 30 #agent1.sinks.sink1.hdfs.round = true #agent1.sinks.sink1.hdfs.roundValue = 10 #agent1.sinks.sink1.hdfs.roundUnit = minute agent1.sinks.sink1.hdfs.useLocalTimeStamp = true #使用memory类型channel agent1.channels.channel1.type = memory agent1.channels.channel1.capacity = 500000 agent1.channels.channel1.transactionCapacity = 600 # Bind the source and sink to the channel agent1.sources.source1.channels = channel1 agent1.sinks.sink1.channel = channel1
在flume目录下启动程序:
bin/flume-ng agent --conf conf/ --name agent1 --conf-file job/TaildirSource-hdfs.conf -Dflume.root.logger=INFO,console
然后再疯狂访问a.html、b.html就完事啦
查看最终结果如下:
3、将日志数据文件转移到预处理工作文件目录中
在/home/hadoop/bigdatasoftware/project1目录下新建脚本文件:movetopreworkdir.sh
编写脚本:
#!/bin/bash # # =========================================================================== # 程序名称: # 功能描述: 移动文件到预处理工作目录 # 输入参数: 运行日期 # 目标路径: /data/weblog/preprocess/input # 数据源 : flume采集数据所存放的路径: /weblog/flume-collection # 代码审核: # 修改人名: # 修改日期: # 修改原因: # 修改列表: # =========================================================================== #flume采集生成的日志文件存放的目录 log_flume_dir=/weblog/flume-collection #预处理程序的工作目录 log_pre_input=/data/weblog/preprocess/input #获取时间信息 day_01="2013-09-18" day_01=`date -d'-1 day' +%Y-%m-%d` syear=`date --date=$day_01 +%Y` smonth=`date --date=$day_01 +%m` sday=`date --date=$day_01 +%d` #读取日志文件的目录,判断是否有需要上传的文件 files=`hadoop fs -ls $log_flume_dir | grep $day_01 | wc -l` if [ $files -gt 0 ]; then hadoop fs -mv ${log_flume_dir}/${day_01} ${log_pre_input} echo "success moved ${log_flume_dir}/${day_01} to ${log_pre_input} ....." fi
执行前:
执行脚本:
运行成功并查看结果:
自此完成!~
crontab服务 *** 作启动服务:service crond start
关闭服务:service crond stop
重启服务:service crond restart
重新载入配置:service crond reload
查看crontab服务状态:service crond status
手动启动crontab服务:service crond start
查看crondtab服务是否已设置为开机启动,执行命令:chkconfig --list
加入开机自启动:chkconfig --level 35 crond on
进入编辑命令:crontabs -e
进入查看运行指令:crontabs -l
删除指令:crontabs -r
配置说明基本格式:
* * * * * command
分 时 日 月 周 命令
第1列表示分钟1~59 每分钟用*或者 */1表示
第2列表示小时0~23(0表示0点) 7-9表示:8点到10点之间
第3列表示日期1~31
第4列表示月份1~12
第5列标识号星期0~6(0表示星期天)
第6列要运行的命令
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)