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")}]