使用flume+hive采集Web服务器的access日志
来源:互联网 发布:cmpp3.0协议java开发 编辑:程序博客网 时间:2024/05/21 14:54
1、配置服务器格式
博主这里用的是tomcat的combined默认格式,格式如下
127.0.0.1 - - [28/Mar/2017:09:23:10 +0800] "GET /manager/html HTTP/1.1" 401 2536 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36"
2、进入hive shell来创建表
使用正则法则来匹配日志格式
CREATE TABLE td_log_analyze( host STRING, identity STRING, usr STRING, time STRING, request STRING, status STRING, size STRING, referer STRING, agent STRING) partitioned by (dt string) ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe' WITH SERDEPROPERTIES ( "input.regex" = "([^ ]*) ([^ ]*) ([^ ]*) (-|\\[[^\\]]*\\]) ([^ \"]*|\"[^\"]*\") (-|[0-9]*) (-|[0-9]*)(?: ([^ \"]*|\"[^\"]*\") ([^ \"]*|\"[^\"]*\"))?", "output.format.string" = "%1$s %2$s %3$s %4$s %5$s %6$s %7$s %8$s %9$s" ) STORED AS TEXTFILE;
3、配置flume-agent
#定义agent名, source、channel、sink的名称 logAnalyzeAG.sources = s1 logAnalyzeAG.channels = c1 logAnalyzeAG.sinks = k1 #具体定义source logAnalyzeAG.sources.s1.type = spooldir logAnalyzeAG.sources.s1.spoolDir = /home/data/tomcat/tomcat-8081/logs/access#设置缓存提交行数 logAnalyzeAG.sources.s1.deserializer.maxLineLength =1048576 logAnalyzeAG.sources.s5.fileSuffix =.FINISHlogAnalyzeAG.sources.s5.ignorePattern=^localhost_access_log\.txt$logAnalyzeAG.sources.s1.consumeOrder = oldest logAnalyzeAG.sources.s1.deserializer = org.apache.flume.sink.solr.morphline.BlobDeserializer$Builder logAnalyzeAG.sources.s1.batchsize = 5 #定义拦截器,为消息添加时间戳 #logAnalyzeAG.sources.r1.interceptors = i1 #logAnalyzeAG.sources.r1.interceptors.i1.type = org.apache.flume.interceptor.TimestampInterceptor$Builder #具体定义channel logAnalyzeAG.channels.c1.type = memory logAnalyzeAG.channels.c1.capacity = 10000 logAnalyzeAG.channels.c1.transactionCapacity = 100 #具体定义sink logAnalyzeAG.sinks.k1.type = hdfs #%y-%m-%d/%H%M/%S #这里对应就是hive 表的目录 此处如果是外部表,则直接对应你的localtion地址,如果普通则对应到你的hive表目录即可 logAnalyzeAG.sinks.k1.hdfs.path = hdfs://172.16.38.159:8020/apps/hive/warehouse/log_data.db/td_log_analyze/%Y-%m-%d logAnalyzeAG.sinks.k1.hdfs.filePrefix = log-%Y-%m-%d logAnalyzeAG.sinks.k1.hdfs.fileSuffix = .log logAnalyzeAG.sinks.k1.hdfs.fileType = DataStream #不按照条数生成文件 logAnalyzeAG.sinks.k1.hdfs.rollCount = 0 #HDFS上的文件达到128M时生成一个文件 logAnalyzeAG.sinks.k1.hdfs.rollSize = 2914560 #HDFS上的文件达到60秒生成一个文件 #logAnalyzeAG.sinks.k1.hdfs.rollInterval = 60 logAnalyzeAG.sinks.k1.hdfs.useLocalTimeStamp = true #组装source、channel、sink logAnalyzeAG.sources.s1.channels = c1 logAnalyzeAG.sinks.k1.channel = c1
PS:采用spoolDir来采集是文件级别的,即扫描新增文件。实时增量可以采用tailDir。上面的配置文件会过滤掉当天打印的文件localhost_access_log.txt。
4、因为对日志进行的分区存放,所以要想将hive表对应指定分区需要创建hive 分区
ALTER TABLE td_log_analyze ADD IF NOT EXISTS PARTITION (dt='2017-03-29') LOCATION '/apps/hive/warehouse/log_data.db/td_log_analyze/2017-03-29/';
注意,需要先创建分区,再采集数据到hdfs,hive才能识别到数据
5、编写shell脚本,每天创建第二天的hive分区
#!/bin/bash#获取明天的日期day=$(date --date='1 days' +%Y-%m-%d)cd /home/touch log.sql#为明天预添加hive分区echo "ALTER TABLE td_log_analyze ADD IF NOT EXISTS PARTITION (dt='${day}') LOCATION '/apps/hive/warehouse/log_data.db/td_log_analyze/${day}/';" > /home/log.sqlbeeline -u 'jdbc:hive2://node0.hdp:2181,node2.hdp:2181,node1.hdp:2181/log_data;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2' -f '/home/log.sql'
6、设置定时任务(centos)
crontab -e
添加任务信息,每天凌晨两点执行
0 2 * * * /home/shell-test/hive-partitions.sh
重新载入配置
service crond reload
更多定时任务功能参考:http://julyme.com/20170329/75.html
PS:附上tomcat日志格式的配置方法
在tomcat的server.xml文件中,host主机配置区域找到类似如下即为访问日志的配置:
unpackWARs="true" autoDeploy="true">
prefix="localhost_access_log." suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
其中的directory用于指定日志的存放路径,默认位于tomcat的logs目录中,例如我们可以修改成:
directory="c:/wwwlogs" 使日志放到c:\wwwlogs目录中去。
其中的prefix和suffic分别用于指定日志文件的前缀和后缀,不用我多说。
现在我们主要来看一下pattern配置段,它用于指定日志的输出格式。有效的日志格式模式可以参见下面内容,如下字符串,其对应的信息由指定的响应内容取代:
%a - 远程IP地址
%A - 本地IP地址
%b - 发送的字节数,不包括HTTP头,或“ - ”如果没有发送字节
%B - 发送的字节数,不包括HTTP头
%h - 远程主机名
%H - 请求协议
%l (小写的L)- 远程逻辑从identd的用户名(总是返回' - ')
%m - 请求方法
%p - 本地端口
%q - 查询字符串(在前面加上一个“?”如果它存在,否则是一个空字符串
%r - 第一行的要求
%s - 响应的HTTP状态代码
%S - 用户会话ID
%t - 日期和时间,在通用日志格式
%a - 远程IP地址
%A - 本地IP地址
%b - 发送的字节数,不包括HTTP头,或“ - ”如果没有发送字节
%B - 发送的字节数,不包括HTTP头
%h - 远程主机名
%H - 请求协议
%l (小写的L)- 远程逻辑从identd的用户名(总是返回' - ')
%m - 请求方法
%p - 本地端口
%q - 查询字符串(在前面加上一个“?”如果它存在,否则是一个空字符串
%r - 第一行的要求
%s - 响应的HTTP状态代码
%S - 用户会话ID
%t - 日期和时间,在通用日志格式
%u - 远程用户身份验证
%U - 请求的URL路径
%v - 本地服务器名
%D - 处理请求的时间(以毫秒为单位)
%T - 处理请求的时间(以秒为单位)
%I (大写的i) - 当前请求的线程名称
此外,您可以指定以下别名来设置为普遍使用的模式之一:
%U - 请求的URL路径
%v - 本地服务器名
%D - 处理请求的时间(以毫秒为单位)
%T - 处理请求的时间(以秒为单位)
%I (大写的i) - 当前请求的线程名称
此外,您可以指定以下别名来设置为普遍使用的模式之一:
common - %h %l %u %t "%r" %s %b
combined - %h %l %u %t "%r" %s %b "%{Referer}i" "%{User-Agent}i"
另外,还可以将request请求的查询参数、session会话变量值、cookie值或HTTP请求/响应头内容的变量值等内容写入到日志文件。
它仿照了apache的语法:
%{XXX}i xxx代表传入的头(HTTP Request)
%{XXX}o xxx代表传出的响应头(Http Resonse)
%{XXX}c xxx代表特定的Cookie名
%{XXX}r xxx代表ServletRequest属性名
%{XXX}c xxx代表特定的Cookie名
%{XXX}r xxx代表ServletRequest属性名
%{XXX}s xxx代表HttpSession中的属性名
转载请注明出处: http://www.julyme.com/20170327/74.html
阅读全文
0 0
- 使用flume+hive采集Web服务器的access日志
- 日志采集框架Flume的安装及使用
- 使用hive来分析flume收集的日志数据
- 使用hive来分析flume收集的日志数据
- Flume采集rsyslog发送的audit日志
- flume学习(六):使用hive来分析flume收集的日志数据
- flume学习(六):使用hive来分析flume收集的日志数据
- flume学习(六):使用hive来分析flume收集的日志数据
- flume学习(六):使用hive来分析flume收集的日志数据
- flume学习(五):使用hive来分析flume收集的日志数据
- flume日志采集
- flume日志采集
- Flume日志采集
- flume日志采集
- flume日志采集
- 日志采集框架Flume
- Flume日志采集
- 日志采集框架Flume
- LeetCode【27】 Remove Element
- Composer安装Yii2需要github的token
- IDEA创建parent项目,聚合项目
- 这样设计问卷才能收集到高质量的数据
- JVM性能调优
- 使用flume+hive采集Web服务器的access日志
- 测试mybatis里foreach用法
- 一个可以DIY的智能插座 stm32+8266
- 面经整理-Java基础
- Golang实战【网页转码】
- How to Reset the Root Password 5.5
- hibernate使用报错
- 测试常用Linux命令
- springmvc-Ajax-Objec返回值为Object