使用Flume收集管理系统日志
SWE中会产生各种各样的日志(Nginx日志,AppMaster日志,Proxy日志,DB日志,MemCache日志,App日志等)
这些日志,将来可能会统一集中到Hadoop上去运算处理
按照以前的做法,是通过各种脚本或者Syslog去处理,会有单点的问题,而且不宜统一管理
现有的开源日志系统,如Flume,Scribe,Chukwa等基本都类同
由于我们的Hadoop使用的就是Cloudera的版本,因此就首先拿Flume做了测试
Flume本身的安装非常简单,但配置却比较麻烦,主要参考它的官方文档
http://archive.cloudera.com/cdh/3/flume/UserGuide/index.html
安装过程如下,使用我们自己的yum源进行安装
yum install jdk
yum install flume
#设置环境变量
export FLUME_CONF_DIR=/opt/conf/flume
#启动master脚本
/opt/apps/flume/bin/flume-daemon.sh stop master
#启动node脚本
/opt/apps/flume/bin/flume-daemon.sh start node -n app_79_108
配置文件flume-site.xml如下:
<property>
<name>flume.master.servers</name>
<value>10.x.x.111</value>
<!--value>10.x.x.xxx,10.x.x.xxx,10.x.x.xxx</value-->
</property>
<property>
<name>flume.master.serverid</name>
<value>0</value>
</property>
<property>
<name>flume.master.gossip.port</name>
<value>57890</value>
</property>
<property>
<name>flume.master.store</name>
<value>zookeeper</value>
</property>
<property>
<name>flume.master.zk.use.external</name>
<value>true</value>
</property>
<property>
<name>flume.master.zk.servers</name>
<value>10.x.x.xxx:2181,10.x.x.xxx:2181,10.x.x.xxx:2181</value>
</property>
<property>
<name>flume.collector.output.format</name>
<value>raw</value>
</property>
Flume可以配置多个Master,只需要在flume.master.servers配置多个即可
Node节点可以连接任何一个Master,多个Master之间会定期通信交换信息
Master的配置信息是存放在外部的Zookeeper上
但多Master不支持automatic flow isolation这种模式,这个真是崩溃
因为在各Node上,可能会有各种不同的Log,需要依据不同的策略汇使用不同的sink,必然会用到autoChain
Master启动后,可以通过http://10.x.x.xxx:35871去查看master的状态,而且可以在线配置config
在Flume里可以启动多个Node节点,多个Collector节点
一个Node对应一个Physical Node,它可以对应多个Logic Node
使用Map命令去完成Physical Node和Logic Node的对应关系
每个Logic Node对应一种日志源,然后使用autoChain模式形成不同的Flow,在Collector上汇总到不同的地方
最终可以实现类似如下的效果
可以通过flume shell去修改配置,这种方式比较不错
/opt/apps/flume/bin/flume shell -c 10.x.x.xxx:35873
#配置node节点,将nginx的日志通过autoDFOChain方式发送出去,定义了一个nginx_access的flow
exec config nginx_access_150_77 nginx_access "tail(\"/opt/logs/nginx/access.log\")" autoDFOChain
#配置collector节点,将nginx_access flow过来的日志给汇总到本地的日志文件,日志的输出格式可以是raw,syslog,log4j,avro,json等
exec config collector_150_111_nginx_access nginx_access autoCollectorSource 'select( "host") escapedFormatDfs("file:///opt/logs/flume/","%Y%m%d_access.log","syslog")'
可以直接把日志推送到Hadoop上,由于我们的Hadoop启用了kerberos认证,所以也需要相应配置
为了使用lzo压缩,需要安装对应的lzo包,同时配置LzopCodec
<property>
<name>flume.kerberos.user</name>
<value>flume/_HOST@XXX.SOHU.COM </value>
<description></description>
</property>
<property>
<name>flume.kerberos.keytab</name>
<value>/home/flume/flume.keytab </value>
<description></description>
</property>
<property>
<name>flume.collector.dfs.compress.codec</name>
<value>LzopCodec</value>
</property>
另外,还需要配置环境变量,拷贝lzo的jar包到flume的lib中
export JAVA_LIBRARY_PATH=/opt/apps/xxxx/hadoop/lib/native/Linux-amd64-64
/opt/apps/xxxx/hadoop/lib/hadoop-lzo-0.4.12.jar /opt/apps/flume/lib/hadoop-lzo-0.4.12.jar
最后,再配置sink到hdfs上即可
exec config collector_150_111_nginx_access nginx_access autoCollectorSource 'select ("host") collector(60000) {escapedFormatDfs("hdfs://zw-hadoop-master:9000/user/flume/ nginx/%Y%m%d","access_%H%M_%{rolltag}.log","syslog")}'
#可以同时配置2个sink,使日志既输出到本地文件,又输出到hdfs上
exec config collector_150_111_nginx_access nginx_access autoCollectorSource '[collec tor(43200000){escapedFormatDfs("hdfs://zw-hadoop-master:9000/user/flume/nginx/%Y%m%d/ ","access_%H_%{rolltag}.log","syslog")},roll(86400000){text("/opt/logs/flume/nginx_ac cess.log","syslog")}]
不错的教程,学习了
好文
好文,赞!
于老师牛
请问你有遇到"Not connected to ZooKeeper: CLOSED"这个报错吗,是怎么解决的啊
您好,请问一下一台机器可以start多个node daemon吗?看flume自己的注释是可以的,但启动时却报必须先kill已有的node进程
你好,请问如何实现同时向多个sink中写数据啊,类似你实例中的这种方式collec tor(43200000){escapedFormatDfs("hdfs://zw-hadoop-master:9000/user/flume/nginx/%Y%m%d/ ","access_%H_%{rolltag}.log","syslog")},roll(86400000){text("/opt/logs/flume/nginx_ac cess.log","syslog")},我的会报语法错误,具体这儿是怎样的啊?