环境:Windows 64位、VMware 12 Pro下安装了3台CentOS7虚拟机、SecureCRT 7.3、Hadoop 2.6.5、JDK 1.8、flume 1.6.0
其中,flume 1.6.0是在2015年5月20日发布的。目前(20190525)最新版本是2019年1月8日发布的1.9.0。
镜像网站下载flume
PS:也可以不通过共享目录的方式,直接在终端用wget URL命令下载安装包。
有数据源的节点就需要安装Flume。
在SecureCRT-Sessions另开一个Master节点窗口,以root身份进入Flume压缩包所在目录,并解压它
[root@master src]# pwd /usr/local/src [root@master src]# ls apache-flume-1.6.0-bin.tar.gz .... [root@master src]# tar zxvf apache-flume-1.6.0-bin.tar.gz 解压该压缩包 .... ......解压完之后,可使用rm -f [文件名]删除它。
尾部添加如下内容:
export FLUME_HOME=/usr/local/src/apache-flume-1.6.0-bin export FLUME_CONF_DIR=$FLUME_HOME/conf export PATH=.:$PATH::$FLUME_HOME/bin因为是在本地netcat测试,所以需要连接telnet。若本地没有安装telnet则需要安装好。
安装telnet和xinetd-参考链接
Telnet协议是TCP/IP协议族中的一员,是Internet远程登录服务的标准协议和主要方式。 它为用户提供了在本地计算机上完成远程主机工作的能力。在终端使用者的电脑上使用telnet程序,用它连接到服务器。终端使用者可以在telnet程序中输入命令,这些命令会在服务器上运行,就像直接在服务器的控制台上输入一样。可以在本地就能控制服务器。要开始一个telnet会话,必须输入用户名和密码来登录服务器。Telnet是常用的远程控制Web服务器的方法。
开机自启动
[root@master ~]# systemctl enable xinetd.service [root@master ~]# systemctl enable telnet.socket Created symlink from /etc/systemd/system/sockets.target.wants/telnet.socket to /usr/lib/systemd/system/telnet.socket.启动这两个服务:
[root@master ~]# systemctl start telnet.socket [root@master ~]# systemctl start xinetd开启端口 23时,报错:
[root@master ~]# firewall-cmd --zone=public --add-port=23/tcp --permanent Traceback (most recent call last): File "/usr/bin/firewall-cmd", line 24, in <module> from gi.repository import GObject ImportError: No module named 'gi'参考文档: 解决:
第一步,vim /usr/bin/firewall-cmd, 将#!/usr/bin/python -Es 改为 #!/usr/bin/python2.7 -Es 第二步,vim /usr/sbin/firewalld, 将#!/usr/bin/python -Es 改为 #!/usr/bin/python2.7 -Es接着查询端口(23)是否开放,报错:
[root@master ~]# firewall-cmd --query-port=23/tcp FirewallD is not running解决方案:链接,开启防火墙。
思路:根据数据采集的需求配置采集方案,描述在配置文件中(文件名可任意自定义)。指定采集方案配置文件,在相应的节点上启动flume agent。
其实,下方主要是配置Flume sources(即所采集数据的来源上),除了下方3种数据来源(netcat/exec/avro)配置,更多可参看官网(如:thrift、JMS、spooling directory等)
使用Flume的关键就是写配置文件,主要是配置三种组件(Source、Channel、Sinks),五部曲:
1、命名当前使用的Agent名称;2、命名Agent下Source名称;3、命名Agent下Channel名称;4、命名Agent下Sink名称;5、将Source和Sink通过Channel绑定起来。参考:Agent/source/Channel/Sink配置详解(包括多Agent/n个sink/m个channel等配置)
下方均是 单Agent、单sink、单channel配置。
Flume配合telnet从指定网络端口(23)采集数据输出到控制台。
source类型为 netcat,信息来自本地,抽取到日志。
[root@master conf]# pwd /usr/local/src/apache-flume-1.6.0-bin/conf [root@master conf]# vim flume-netcat.conf内容如下:
# Name the components on this agent 指定Agent的组件名称。a1,可以看做是flume服务的名称,也可以命名为其他。每个flume服务 都由sources、channels、sinks三部分组成。 # sources 数据源头、channels 中间转存的渠道、sinks 数据后面的去向 a1.sources = r1 #定义一个source:r1 a1.sinks = k1 #定义一个sink:k1 a1.channels = c1 #定义一个channel:c1 # 配置Source:指定Flume source(要监听的路径) a1.sources.r1.type = netcat #a1的r1的类型 a1.sources.r1.bind = master #a1.sources.r1.bind = 127.0.0.1 #a1.sources.r1.bind = localhost a1.sources.r1.port = 44444 # 配置sinks:日志形式 a1.sinks.k1.type = logger # 配置Channel:指定Flume channel a1.channels.c1.type = memory #a1的channel类型:存在 内存 a1.channels.c1.capacity = 1000 #a1的容量 a1.channels.c1.transactionCapacity = 100 #交互容量 # Bind the source and sink to the channel 绑定source 和sink到channel上 # 将指定source(r1)和channel(c1)绑定;再将sink(k1)和channel(c1)绑定。则-->source(r1)和sink(k1)已联通 a1.sources.r1.channels = c1 a1.sinks.k1.channel = c1验证:
终端1-Server:
[root@master bin]# pwd /usr/local/src/apache-flume-1.6.0-bin/bin [root@master bin]# ./flume-ng agent --name a1 --conf /usr/local/src/apache-flume-1.6.0-bin/conf --conf-file /usr/local/src/apache-flume-1.6.0-bin/conf/flume-netcat.conf -Dflume.root.logger=INFO,console 最好是输入conf目录、.conf文件的绝对路径!!! 其中,a1是刚才配置的agent名, ... ...... .... 2019-05-25 05:37:56,486 (SinkRunner-PollingRunner-DefaultSinkProcessor) [INFO - org.apache.flume.sink.LoggerSink.process(LoggerSink.java:94)] Event: { headers:{} body: 48 65 6C 6C 6F 20 77 6F 72 6C 64 0D Hello world. }也可以写成这种形式,便于理解:而且与当前所在哪个目录无关了
$FLUME_HOME/bin/flume-ng agent \ --name a1 \ --conf $FLUME_HOME/conf \ --conf-file $FLUME_HOME/conf/flume-netcat.conf \ -Dflume.root.logger=INFO,console上述命令各参数详解:
$FLUME_HOME/bin/flume-ng agent 启动flume-ng的agent服务--name a1 指定flume服务名。与-n等价--conf $FLUME_HOME/conf Flume配置文件目录flume-env.sh。与-c等价--conf-file $FLUME_HOME/conf/flume-netcat.conf 编写的配置文件的目录。与-f等价-Dflume.root.logger=INFO,console 在控制台输出日志。指定日志级别和显示方式然后在终端2-Client:
[root@master ~]# telnet master 44444 Trying 192.168.71.10... Connected to master. Escape character is '^]'. Hello world OK输入Hello world,此时,在flume-ng agent的控制台(终端1)可以看到输出了
Event: { headers:{} body: 48 65 6C 6C 6F 20 77 6F 72 6C 64 0D Hello world. }其中,
Event:是Flume传输数据的基本单元;Event = 可选的header + byte array验证:
终端1-Server:
[root@master apache-flume-1.6.0-bin]# pwd /usr/local/src/apache-flume-1.6.0-bin [root@master apache-flume-1.6.0-bin]# ./bin/flume-ng agent --name a2 --conf /usr/local/src/apache-flume-1.6.0-bin/conf --conf-file /usr/local/src/apache-flume-1.6.0-bin/conf/flume-exec.conf -Dflume.root.logger=INFO,console然后在终端2-Client:
[root@master apache-flume-1.6.0-bin]# while true;do echo `date` >> /usr/local/src/apache-flume-1.6.0-bin/test_flume-exec.log;sleep 1;done或
[root@master apache-flume-1.6.0-bin]# for i in {1..100};do echo "exec tail$i" >> /usr/local/src/apache-flume-1.6.0-bin/test_flume-exec.log;echo $i;sleep 0.1;done此时,终端1-Server:可以看到打印
2019-05-27 04:50:05,882 (SinkRunner-PollingRunner-DefaultSinkProcessor) [INFO - org.apache.flume.sink.LoggerSink.process(LoggerSink.java:94)] Event: { headers:{} body: 4D 6F 6E 20 4D 61 79 20 32 37 20 31 39 3A 35 30 Mon May 27 19:50 }或
2019-05-27 04:49:30,763 (SinkRunner-PollingRunner-DefaultSinkProcessor) [INFO - org.apache.flume.sink.LoggerSink.process(LoggerSink.java:94)] Event: { headers:{} body: 65 78 65 63 20 74 61 69 6C 31 exec tail1 }终端1-Server:启动flume-ng a3
[root@master apache-flume-1.6.0-bin]# pwd /usr/local/src/apache-flume-1.6.0-bin [root@master apache-flume-1.6.0-bin]# ./bin/flume-ng agent --name a3 --conf /usr/local/src/apache-flume-1.6.0-bin/conf --conf-file /usr/local/src/apache-flume-1.6.0-bin/conf/flume-avro.conf -Dflume.root.logger=INFO,console然后在终端2-Client:1)创建指定文件;2)使用avro-client发送文件
[root@master apache-flume-1.6.0-bin]# pwd /usr/local/src/apache-flume-1.6.0-bin [root@master apache-flume-1.6.0-bin]# echo "hello world" > /usr/local/src/apache-flume-1.6.0-bin/test_flume-avro.log [root@master apache-flume-1.6.0-bin]# ./bin/flume-ng avro-client --conf /usr/local/src/apache-flume-1.6.0-bin/conf -H master -p 4141 -F /usr/local/src/apache-flume-1.6.0-bin/test_flume-avro.log此时,终端1-Server:可以看到打印
2019-05-27 05:24:39,373 (SinkRunner-PollingRunner-DefaultSinkProcessor) [INFO - org.apache.flume.sink.LoggerSink.process(LoggerSink.java:94)] Event: { headers:{} body: 68 65 6C 6C 6F 20 77 6F 72 6C 64 hello world }flume 1.6 安装及配置 日志采集配置:采集配置文件将采集结果存入hdfs
