[Flume] 01 - 安装与配置(目前只在master节点上操作)

    xiaoxiao2023-10-14  124

    环境: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下的共享目录下

    镜像网站下载flume

    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

    最新回复(0)