环境: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。
0、准备工作
0.0、在win上将Flume压缩包放在win下的共享目录下
0.1、将共享目录下的Flume压缩包复制到虚拟机Master节点中需要的目录下
[root@master cyg]# vmware-hgfsclient 查看当前有哪些共享的目录
[root@master hgfs]# vmhgfs-fuse .host:/ /mnt/hgfs 手动挂载(mount)。
手动挂载后,得cd退一下当前目录,再进去,才能看到,类似于刷新目录。
[root@master /]# cd /mnt/hgfs/share_folder 进入共享目录
[root@master share_folder]# pwd 查看所在哪个工作目录
/mnt/hgfs/share_folder
[root@master share_folder]# ls
apache-flume-1.6.0-bin.tar.gz hadoop-2.6.5.tar.gz
...
[root@master share_folder]# cp apache-flume-1.6.0-bin.tar.gz /usr/local/src
复制Flume压缩包 到目标路径下
PS:也可以不通过共享目录的方式,直接在终端用wget URL
命令下载安装包。
0.2、解压Flume压缩包
有数据源的节点就需要安装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 [文件名]
删除它。
0.3、环境变量
vim /etc/profile
尾部添加如下内容:
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
0.4、Flume配置文件修改
[root@master conf]# pwd
/usr/local/src/apache-flume-1.6.0-bin/conf
[root@master conf]# cp flume-env.sh.template flume-env.sh
[root@master conf]# vim flume-env.sh 添加下方这句
export JAVA_HOME=/usr/local/src/jdk1.8.0_172
0.5、安装telnet和xinetd
因为是在本地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等)
1、配置和验证
[root@master conf]# pwd
/usr/local/src/apache-flume-1.6.0-bin/conf
[root@master conf]# ls
flume-conf.properties.template flume-env.ps1.template flume-env.sh.template log4j.properties
使用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配置。
1.0、【NetCat类型】配置、验证
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.1、Exec 配置和验证
[root@master conf]# pwd
/usr/local/src/apache-flume-1.6.0-bin/conf
[root@master conf]# vim flume-exec.conf
# Name the components on this agent
a2.sources = r2
a2.sinks = k2
a2.channels = c2
#Describe/configuration the source
a2.sources.r2.type = exec
a2.sources.r2.command = tail -F /usr/local/src/apache-flume-1.6.0-bin/test_flume-exec.log
#Describe the sink
a2.sinks.k2.type = logger
# Use a channel which buffers events in memory
a2.channels.c2.type = memory
a2.channels.c2.capacity = 1000
a2.channels.c2.transactionCapacity = 100
#Bind the source and sink to the channel
a2.sources.r2.channels = c2
a2.sinks.k2.channel = c2
验证:
终端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.2、Avro配置和验证
[root@master conf]# pwd
/usr/local/src/apache-flume-1.6.0-bin/conf
[root@master conf]# vim flume-avro.conf
a3.sources = r3
a3.sinks = k3
a3.channels = c3
a3.sources.r3.type= avro
a3.sources.r3.bind = 0.0.0.0
a3.sources.r3.port = 4141
a3.sinks.k3.type= logger
a3.channels.c3.type= memory
a3.channels.c3.capacity = 1000
a3.channels.c3.transactionCapacity = 100
a3.sources.r3.channels = c3
a3.sinks.k3.channel = c3
终端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