Flume-NG + HDFS + HIVE 日志收集分析
最近做了一个POC,目的是系统日志的收集和分析,此前有使用过splunk,虽然用户体验很好,但一是价格昂贵,二是不适合后期开发(splunk已经推出了SDK,后期开发已经变得非常容易)。在收集TB级别的日志量上flume-ng是更好的选择,因为后面的存储是扩展性极佳的HDFS。先简要介绍一下测试环境:
5台VM机器(RHEL6.3):
1, collector01
2, namenode
3, datanode01
4, datanode02
5, datanode03
第一台机器collector01用户日志收集,数据汇总到collector01后写入hdfs, 其余4台仅服务Hadoop相关服务,其上安装了CDH4.0,HDFS/MapReduce/hive等等。
注意:
1, flume-ng如需将数据写入hdfs,本机也同样需要安装hadoop 相关的package
2, CDH4.0在使用中遇到不少bug,浪费了一些时间,建议使用CDH3 (当初选在CDH4.0 是因为有impala package,但此次测试并未加入impala部分)
Flume-NG基本概念
Apache Flume-NG是一个分布式,可靠的日志收集,聚合系统,最早由cloudera开发,现已经并入Apache社区,相比较之前的flume-og (Flume)而言,结构更精简清晰(没有了master,collecter的概念)部署更容易。
如上图,Flume-NG有3个重要的概念
1, Source
2, Channel
3, Sink
正如其名字所示例的那样, Source是数据源,Channel负责数据的传送,而Sink则是数据的目的地。Flume-NG中很重要的一点就是:一个flume instance的Sink可以是另外一个flume instance的source,这样就可以首尾相连,形成一条链。log 数据也就可以传送到任意地方,最终进入HDFS存储。Source/Channel/Sink各自有不同的Type,适用不同的场景,具体可以参看文档,我这里就不赘述了,下面就简单介绍一下我POC过程中使用的配置情况:
Flume-NG Agent and Client
Agent:
运行主机: collector01
Hadoop 版本: CDH 4.0 (如前所述,如需sink到HDFS, hadoop相关的package需要安装)
Flume-NG 版本: 1.3.0
Flume-NG 位置: /data/apache-flume-1.3.0-bin
Haoop HDFS name node: hdfs://namenode:8020
Flume-NG Agent 配置文件:
[root@collector01 apache-flume-1.3.0-bin]# cat /data/apache-flume-1.3.0-bin/conf/flume.conf # Define a memory channel called c1 on a1 a1.channels.c1.type = memory # Define an Avro source called r1 on a1 and tell it # to bind to 0.0.0.0:41414. Connect it to channel c1. a1.sources.r1.channels = c1 a1.sources.r1.type = avro a1.sources.r1.bind = 0.0.0.0 a1.sources.r1.port = 41414 a1.sinks.k1.type = hdfs a1.sinks.k1.channel = c1 a1.sinks.k1.hdfs.path = hdfs://namenode:8020/user/hive/warehouse/squid a1.sinks.k1.hdfs.filePrefix = events- a1.sinks.k1.hdfs.fileType = DataStream a1.sinks.k1.hdfs.writeFormat = Text a1.sinks.k1.hdfs.rollSize = 0 a1.sinks.k1.hdfs.rollInterval= 0 a1.sinks.k1.hdfs.rollCount = 600000 a1.sinks.k1.hdfs.rollInterval = 600 # # Finally, now that we've defined all of our components, tell # a1 which ones we want to activate. a1.channels = c1 a1.sources = r1 a1.sinks = k1
运行Agent:
bin/flume-ng agent --conf ./conf/ -f conf/flume.conf -Dflume.root.logger=DEBUG,console -n a1
运行以上命令后, flume-ng将会在启动avro Source监听41414端口, 等待日志进入。参数 “-Dflume.root.logger=DEBUG,console”仅为debug用途,这样当log数据进入的时候可以清新看到具体情况,请勿在真实环境使用,否则terminal会被log淹没。
以上配置文件将会把41414端口侦测到的日志写入HDFS hdfs://namenode:8020/user/hive/warehouse/squid. 且每 600000 行roll out成一个一个新文件。
Client:
bin/flume-ng avro-client --conf conf -H collector01 -p 41414 -F /root/1024.txt -Dflume.root.logger=DEBUG,console
在客户主机上运行此命令,将会把日志文件 /root/1024.txt上传到collector01:41414端口。flume-ng当然也可以配置检控日志文件的变化(tail -F logfile),参看exec source的文档。
一下为HDFS中收集到的日志:
使用HiVE分析数据:
Hive 将会利用hdfs中的log进行分析, 你需要写好相应的分析SQL语句,hive将调用 map reduce完成你的分析任务。我测试用的log是squid log,log entry如下:
1356867313.430 109167 10.10.10.1 TCP_MISS/200 51498 CONNECT securepics.example.com:443 – HIER_DIRECT/securepics.example.com -
[ ]*([0-9]*)[^ ]*[ ]*([^ ]*) ([^ ]*) ([^ |^ /]*)/([0-9]*) ([0-9]*) ([^ ]*) ((?:([^:]*)://)?([^/:]+):?([0-9]*)?(/?[^ ]*)) ([^ ]*) ([^/]+)/([^ ]+) (.*)
hive>
CREATE EXTERNAL TABLE IF NOT EXISTS squidtable(ttamp STRING, duration STRING,
clientip STRING, action STRING, http_status STRING, bytes STRING, method STRING,
uri STRING, proto STRING, uri_host STRING, uri_port STRING, uri_path STRING,
username STRING, hierarchy STRING, server_ip STRING, content_type STRING)
ROW FORMAT SERDE ‘org.apache.hadoop.hive.contrib.serde2.RegexSerDe’
WITH SERDEPROPERTIES (
“input.regex” = “[ ]*([0-9]*)[^ ]*[ ]*([^ ]*) ([^ ]*) ([^ |^ /]*)/([0-9]*) ([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 %10$s %11$s %12$s %13$s %14$s %15$s %16$s”
)
STORED AS TEXTFILE
LOCATION ‘/user/hive/warehouse/squid’;
一些分析SQL例子:
# How many log entry inside table select count(*) from squidtable; # How many log entry inside table with client ip 10.10.10.1 select count(*) from squidtable where clientip = "10.10.10.1"; # some advance query SELECT clientip, COUNT(1) AS numrequest FROM squidtable GROUP BY clientip SORT BY numrequest DESC LIMIT 10;

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
比Hive高效7倍Facebook推新一代查询引擎Presto
https://github.com/facebook/presto http://prestodb.io http://www.csdn.net/article/2013-06-13/2815749-Facebook-Presto http://hortonworks.com/labs/stinger/
- 下一篇
在线分析查询系统mdrill
1:mdrill是阿里妈妈-adhoc-海量数据多维自助即席查询平台下的一个子项目。 2:mdrill旨在帮助用户在几秒到几十秒的时间内,分析百亿级别的任意维度组合的数据。 3:mdrill是一个分布式的在线分析查询系统,基于hadoop,lucene,solr,jstorm等开源系统作为实现,基于SQL的查询语法。 mdrill是一个能够对大量数据进行分布式处理的软件框架。mdrill是快速的高性能的,他的底层因使用了索引、列式存储、以及内存cache等技 术,使得数据扫描的速度大为增加。mdrill是分布式的,它以并行的方式工作,通过并行处理加快处理速度。 4:mdrill在adhoc项目中,mdrill使用了10台机器,存储了400亿的数据,每次扫描30亿的行数,响应时间在20秒~120秒左右(取决不同的查询条件)。 https://github.com/alibaba/mdrill
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8安装Docker,最新的服务器搭配容器使用
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Hadoop3单机部署,实现最简伪集群
- CentOS关闭SELinux安全模块
- CentOS7设置SWAP分区,小内存服务器的救世主
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题