在windows中实现Flume日志收集

Posted wpfphp

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在windows中实现Flume日志收集相关的知识,希望对你有一定的参考价值。

一、flume的简介

任何一个系统在运行的时候都会产生大量的日志信息,我们需要对这些日志进行分析,在分析日志之前,我们需要将分散在生产系统中的日志收集起来。Flume就是这样的日志采集系统。

 

 

1.主要有三个组件: 

Source:消费web系统这样的外部数据源中的数据(一般就是web系统产生的日志),外部数据源会向flume发送某种能被flume识别的格式的事件,有以下几种类型:avro 、exec、jms、spooling directory source、kafka、netcat等

Channel:当flume source从外部source读取到数据的时候,flume会将数据先存放在一个或多个channel中,这些数据将会一直被存放在channel中直到它被sink消费了为止,channel的主要类型有:memory、jdbc、kafka、file等

Sink:消费channel中的数据,然后将其存放进外部持久化的文件系统中,Sink的类型主要有HDFS、Hive、Avro、File Roll、kafka、HBase、ElasticSearch。

2.Agent的多级相连:

 

有些情况下,可能会有很多的服务器产生大量的日志文件,此时我们需要先准备一些第一层级的一些flume收集系统,这些flume日志收集系统需要有一个类型为avro的sink,这个sink采集到数据后,会将数据发送出去,具体发送到哪,需要在配置文件里面进行配置,然后再下一层极的flume收集系统中,采用avro类型的source,收集上一级发送过来的日志信息,然后再在这一层集中将数据沉入到hdfs文件系统中。

 

二、windows环境搭建

1. 下载安装

准备flume的安装包,请在官网进行下载:http://flume.apache.org/download.html

 

下载文件tail.exe,下载地址http://files.cnblogs.com/hantianwei/tail.zip

下载后解压,把tail.exe 复制到 目录:C:\\Windows\\System32 下

2.测试

测试flume

1.解压下载后的文件,进入conf目录,复制flume-conf.properties文件,并修改文件名称为:example.conf,编写内容如下:

# 指定Agent的组件名称

a1.sources = r1

a1.sinks = k1

a1.channels = c1

 

# 指定Flume source(要监听的路径)

a1.sources.r1.type = netcat

a1.sources.r1.bind = localhost

a1.sources.r1.port = 44444

 

# 指定Flume sink

a1.sinks.k1.type = logger

 

# 指定Flume channel

a1.channels.c1.type = memory

a1.channels.c1.capacity = 1000

a1.channels.c1.transactionCapacity = 100

 

# 绑定source和sink到channel上

a1.sources.r1.channels = c1

a1.sinks.k1.channel = c1

 

 

2. 使用cmd命令进入flume的bin目录,在命令行输入如下命令启动flume:

flume-ng.cmd agent -conf conf -conf-file ../conf/example.conf --name a1

 

成功如下:

 

3.重新打开一个cmd窗口输入命令:

telnet localhost 44444

 

然后进入了一个可编辑输入的窗口,我们在窗口输入“nihao”,然后在 flume 启动的窗口可以看见打印的信息。

测试通过,flume安装成功!!!

测试tail.exe

打开一个cmd窗口:

效果和liunx中的扫描文件尾命令一样

tail -f

 

三、搭建多个agent采集tomcat日志

 

1.实现与准备:

实现:采集十台tomcat的日志文件

准备:在十台web服务器中搭建flume环境做第一层日志采集(服务器集群),一台最后收集的服务器中搭建flume环境做第二层采集(主服务器)。

3. Windows下Tomcat修改配置:

在服务器集群的十台web服务器中

1. 修改startup.bat文件内容把文件中的倒数第二行中的

call "%EXECUTABLE%" start %CMD_LINE_ARGS%    改为:   call "%EXECUTABLE%" run %CMD_LINE_ARGS%

 

2. 修改catalina.bat文件内容查找catalina.bat含有%ACTION%的4行内容(在文件末),在后面添加

>> %CATALINA_HOME%\\logs\\catalina.txt

这样就会在 tomcat下的logs文件中生成一个catalina.txt。  控制台中的内容就会输入到文件中了。

 

 

3.第一层tomcat日志采集

在10台web服务器集群的flume安装目录下的conf文件夹下创建tomcat_log.conf文件内容如下:

# 指定Agent的组件名称

a1.sources = r1

a1.sinks = k1

a1.channels = c1

 

# 指定Flume source(要监听的路径)

a1.sources.r1.type = exec

#在windows中要执行的命令, D:/tomcat7/logs/catalina.txt 是要监控文件的绝对路径

a1.sources.r1.command=tail -f D:/tomcat7/logs/catalina.txt

 

#可以添加静态拦截器用作区分是哪一个agent发送的日志

#a1.sources.r1.interceptors = i1

#a1.sources.r1.interceptors.i1.type = static

##  static拦截器的功能就是往采集到的数据的header中插入自己定## 义的key-value对,也可以不使用

#a1.sources.r1.interceptors.i1.key = type

#a1.sources.r1.interceptors.i1.value = web1

 

 

# 指定Flume sink 将本机监控的日志源catalina.txt通过内存通道发送到第二层收集日志的web服务器

a1.sinks.k1.type = avro

a1.sinks.k1.channel = c1

a1.sinks.k1.hostname = ip #(第二层收集日志的web服务器ip)

a1.sinks.k1.port = 44444 #(第二层收集日志的web服务器的随机一个没有被使用的端口)

 

 

# 指定Flume channel

a1.channels.c1.type = memory

a1.channels.c1.capacity = 1000

a1.channels.c1.transactionCapacity = 100

 

# 绑定source和sink到channel上

a1.sources.r1.channels = c1

a1.sinks.k1.channel = c1

 

 

 

4.第二层采集

在最后一台主web服务器的flume安装目录下的conf文件夹下创建tomcat_log.conf文件内容如下:

# 指定Agent的组件名称

a2.sources = r1

a2.sinks = k1

a2.channels = c1

 

# 指定Flume source(监听第一层收集agent中发送的ip和端口)

a2.sources.r1.type = avro

a2.sources.r1.channels = c1

a2.sources.r1.bind = 0.0.0.0 本机ip(跟第一层sink中的ip一致,可以用0.0.0.0代替)

a2.sources.r1.port = 44444

#添加时间拦截器,也可以不使用

#a1.sources.r1.interceptors = i1

#a1.sources.r1.interceptors.i1.type=#org.apache.flume.interceptor.TimestampInterceptor$Builder

 

 

 

 

 

#下边的sink配置二选其一

# 第一种file_roll指定Flume sink(接收来自通过44444端口发送过来的日志)

a2.sinks.k1.type = file_roll

a2.sinks.k1.sink.directory = D://log//sink 日志保存的位置

a2.sinks.k1.sink.rollInterval = 0

 

#第二种hdfs接收到日志之后上传到hdfs中(注意hdfs需要安装hadoop

a2.sinks.k1.type = hdfs

a2.sinks.k1.hdfs.path=hdfs://localhost:9000/test/%Y%m%d/%H/%type#通过拦截器接收header中的key,也可以不用

#上传文件的前缀

a2.sinks.k1.hdfs.filePrefix = agent2-

#上传文件的后缀

a2.sinks.k1.hdfs.fileSuffix = .log

#写 sequence 文件的格式。包含:Text, Writable(默认)

a2.sinks.k1.hdfs.writeFormat = TEXT

#间隔多长将临时文件滚动成最终目标文件,单位:秒,如果设置成0,则表示不根据时间来滚动文件

a2.sinks.k1.hdfs.rollInterval = 0

#当临时文件达到多少(单位:bytes)时,滚动成目标文件,10240bytes=10KB

a2.sinks.k1.hdfs.rollSize = 10240

#是否使用当地时间

a2.sinks.k1.hdfs.useLocalTimeStamp = true

#当 events 数据达到该数量时候,将临时文件滚动成目标文件,如果设置成0,则表示不根据events数据来滚动文件

a2.sinks.k1.hdfs.rollCount = 0

#文件格式,包括:SequenceFile, DataStream,CompressedStre,当使用DataStream时候,文件不会被压缩,不需要设置hdfs.codeC;当使用CompressedStream时候,必须设置一个正确的hdfs.codeC值;

a2.sinks.k1.hdfs.fileType = DataStream

 

# 指定Flume channel

a2.channels.c1.type = memory

a2.channels.c1.capacity = 1000

a2.channels.c1.transactionCapacity = 100

 

# 绑定source和sink到channel上

a2.sources.r1.channels = c1

a2.sinks.k1.channel = c1

 

 

 

 

 

 

 

5.上传到hdfs需要安装hadoop

Windows上安装运行Hadoop

1.下载JDK,并设置JAVA_HOME。(使用不带空格的路径,比如Program Files,将在后面的配置中报错!如果带有空格可以设置软链接在后边的配置中会用到)

2.下载hadoop。下载地址:http://hadoop.apache.org/releases.html

如果在当前页中没找到2.8.3版本,可以到所有版本的下载列表中去找:https://archive.apache.org/dist/hadoop/common/

这里下载使用的是2.8.3的二进制版本文件,解压到d:/hadoop-2.8.3

 

3.下载winutils。这个是别人编译好的hadoop的windows版本二进制文件,不需要我们自己进行编译。下载下来然后将hadoop-2.8.3进行bin目录!覆盖!即可。

下载地址:https://github.com/steveloughran/winutils

 

4.在路径D:\\hadoop-2.8.3\\etc\\hadoop下修改文件

①core-site.xml(配置默认hdfs的访问端口,下边tmp目录可以手动创建)

<configuration>

<property>

        <name>fs.defaultFS</name>

        <value>hdfs://localhost:9000</value>

  </property>

  <property>

        <name>hadoop.tmp.dir</name>

        <value>D:\\hadoop\\tmp</value>

  </property>

</configuration>

 

②hdfs-site.xml(设置复制数为1,即不进行复制。namenode文件路径以及datanode数据路径。下边namenode,datanode两个地址目录可以手动创建,注意路径斜线的如果使用/可能会无效)

<configuration>

<property>

        <name>dfs.replication</name>

        <value>1</value>

    </property>

    <property>    

        <name>dfs.namenode.name.dir</name>    

        <value>D:\\hadoop\\data\\dfs\\namenode</value>    

    </property>    

    <property>    

        <name>dfs.datanode.data.dir</name>    

        <value>D:\\hadoop\\data\\dfs\\datanode</value>  

    </property>

</configuration>

③将mapred-site.xml.template 名称修改为 mapred-site.xml 后再修改内容(设置mr使用的框架,这里使用yarn)

<configuration>

<property>

        <name>mapreduce.framework.name</name>

        <value>yarn</value>

    </property>

</configuration>

 

④yarn-site.xml(这里yarn设置使用了mr混洗)

<configuration>

    <property>

        <name>yarn.nodemanager.aux-services</name>

        <value>mapreduce_shuffle</value>

    </property>

    <property>

        <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>

        <value>org.apache.hadoop.mapred.ShuffleHandler</value>

    </property></configuration>

 

⑤hadoop-env.cmd

设置JAVA_HOME的值(如果这里使用了带空格的Program Files路径将会报错!如果有空格可以设置软链接,下边用的就是软链接)

set JAVA_HOME=D:\\tools\\java

 

4. 进入D:\\hadoop-2.8.3\\bin目录,格式化hdfs在cmd中运行命令:

hdfs namenode -format

如果设置了hadoop的环境变量可以直接使用 :

hadoop namenode -format

5.进入D:\\hadoop-2.8.3\\sbin目录

在cmd中运行命令start-all.cmd 出现下图中的四个cmd窗口

 

 

7. 在浏览器地址栏中输入:http://localhost:8088查看集群状态。

 

8.在浏览器地址栏中输入:http://localhost:50070查看Hadoop状态。

 

 

9.在cmd中使用jps查看状态

 

 

Hadoop启动成功。

四、Flume的启动及实现效果

1.首先启动主服务器的flume,进入flume安装目录下的bin目录(注意如果第二层采集中接收器使用的hdfs,则启动主服务器的flume之前先启动hadoop):

flume-ng.cmd agent --conf ../conf --conf-file ../conf/tomcat_log.conf --name a2

2.启动十台web服务器集群的flume,进入flume安装目录下的bin目录(需要采集几台就启动几台):

flume-ng.cmd agent --conf ../conf --conf-file ../conf/tomcat_log.conf --name a1

 

 

3.效果

使用第一种file_roll接收的效果

 

使用第二种hdfs接收的效果

 

 

以上是关于在windows中实现Flume日志收集的主要内容,如果未能解决你的问题,请参考以下文章

Flume 实时收集日志

改进和优化美团Flume日志收集

Flume日志收集系统架构详解

Flume日志收集系统架构详解--转

日志系统之基于flume收集docker容器日志

日志系统之基于flume收集docker容器日志