1.概念
Flume是分布式、高可靠、高可用的海量日志采集、聚合、传输系统。支持在日志系统中定制各类数据发送方,用以采集数据,也提供对数据进行简单处理,并写到各种数据接收方的能力。简单来说:Flume是实时采集日志的数据采集引擎。
-
flume的三个重要的组成部门:Source、Channel、Sink,这三个组件组成agent,Agent是一个JVM进程,它以事件的形式将数据从源头送至目的。
-
Source:数据接收组件,处理各种类型、各种格式的日志数据,如:avro、exec、spooldir、netcat
-
Channel:位于source和sink的缓冲区。Channel允许Source和Sink运作在不同的速率上,Channel是线程安全的,可以同时处理多个Source的写入操作及多个Sink的读取操作。
常用的Channel包括:
Memory Channel是内存中的队列。大小有限,容量有限,容易丢数据,速度快。Memory Channel在允许数据丢失的情 景下适用。如果不允许数据丢失,应该避免使用Memory Channel,因为程 序死亡、机器宕机或者重启都可能会导致数据丢失;
File Channel将所有事件写到磁盘。速度慢,容量大, 不丢数据。因此在程序关闭或机器宕机的情况下不会丢失数据;
kafka Channel
Sink不断地轮询Channel中的事件且批量地移除它们,并将这些事件批量写入到存储或索引系统、或者被发送到另一个Flume Agent。 -
Sink是完全事务性的。在从Channel批量删除数据之前,每个Sink用Channel启动一个事务。批量事件一旦成功写出到存储系统或下一个Flume Agent,Sink就利用Channel提交事务。事务一旦被提交,该Channel从自己的内部缓冲区删除事件。Sink组件包括hdfs、logger、avro、file、null、HBase、消息队列等。
-
Event是Flume中数据传输最小单位,定义的一个数据流传输的最小单位。
2.安装flume
- 环境准备:centOS7,JDK,HDFS
- 文件下载上传到服务器/opt/install目录下
下载flume文件:apache-flume-1.9.0-bin.tar.gz
下载地址
提取码:bgdt - 文件解压
tar -zxf apache-flume-1.9.0-bin.tar.gz -C ../soft/
- 修改目录名称
mv apache-flume-1.9.0-bin flume190
- 配置环境变量
cd ./flume190/conf/
cp flume-env.sh.template flume-env.sh
vim flume-env.sh
修改配置如下
export JAVA_HOME=/opt/soft/jdk180
export JAVA_OPTS="-Xms1000m -Xmx2000m -Dcom.sun.management.jmxremote"
- 配置安装完成
3.flume使用
3.1监听端口
- 安装netcat、telnet
yum install -y nc
yum install telnet-server
yum install telnet.*
- 测试连接
nc -lk 888//服务器端
telnet 192.168.140.33 888//另一个终端
此时两台机器可以实现通信
- flume实现
vim ./netcat-logger.conf //创建netcat-logger.conf文件
内容如下
vim netcat-logger.conf
a1.sources=r1
a1.sinks=k1
a1.channels=c1
a1.sources.r1.type=netcat
a1.sources.r1.bind=192.168.140.33
a1.sources.r1.port=8888
a1.channels.c1.type=memory
a1.channels.c1.capacity=1000
a1.channels.c1.transactionCapacity=100
a1.sinks.k1.type=logger
a1.sources.r1.channels=c1
a1.sinks.k1.channel=c1
开启服务
[root@hadoop33 flume190]# ./bin/flume-ng agent --name a1 --conf ./conf/ --conf-file ./conf/netcat-logger.conf -Dflume.root.logger=INFO,console
打开另一终端连接服务器端口发送信息
telnet 192.168.140.33 8888
3.2 flume获取指定文件的内容
Exec Source:监听一个指定的命令,获取一条命令的结果作为它的数据源
- 创建file-flume-logger.conf文件
#将指定文件中的内容输出到控制台
a2.sources=r1
a2.sinks=k1
a2.channels=c1
a2.sources.r1.type=exec
a2.sources.r1.command=tail -f /opt/soft/flume190/flumedemo.log
a2.channels.c1.type=memory
a2.channels.c1.capacity=1000
a2.channels.c1.transactionCapacity=100
a2.sinks.k1.type=logger
a2.sources.r1.channels=c1
a2.sinks.k1.channel=c1
Spooling Directory Source:监听一个指定的目录,即只要应用程序向这个指定的目录中添加新的文件,source组件就可以获取到该信息,并解析该文件的内容,然后写入到channle。写入完成后,标记该文件已完成或者删除该文件
- 创建event-flume-logger.conf文件
[root@hadoop33 flume190]# vim ./conf/event-flume-logger.conf
events.sources=eventsSource
events.channels=eventsChannel
events.sinks=eventsSink
events.sources.eventsSource.type=spooldir
events.sources.eventsSource.spoolDir=/opt/flumelogfile/events
events.sources.eventsSource.deserializer=LINE
events.sources.eventsSource.deserializer.maxLineLength=32000
events.sources.eventsSource.includePattern=events_[0-9]{4}-[0-9]{2}-[0-9]{2}.csv
events.channels.eventsChannel.type=file
events.channels.eventsChannel.checkpointDir=/opt/flumelogfile/checkpoint/events
events.channels.eventsChannel.dataDirs=/opt/flumelogfile/data/events
events.sinks.eventsSink.type=logger
events.sources.eventsSource.channels=eventsChannel
events.sinks.eventsSink.channel=eventsChannel
启动flume
./bin/flume-ng agent --name events --conf ./conf/ --conf-file ./conf/event-flume-logger.conf -Dflume.root.logger=INFO,console
flume会对目标文件进行读取,读取过的文件会标记为COMPLETED,当出现符合读取格式的文件,flume会继续读取
对上面用的几个flume source进行适当总结:
① NetCat Source:监听一个指定的网络端口,即只要应用程序向这个端口里面写数据,这个source组件
就可以获取到信息。
②Spooling Directory Source:监听一个指定的目录,即只要应用程序向这个指定的目录中添加新的文
件,source组件就可以获取到该信息,并解析该文件的内容,然后写入到channle。写入完成后,标记
该文件已完成或者删除该文件。
③Exec Source:监听一个指定的命令,获取一条命令的结果作为它的数据源
常用的是tail -F file指令,即只要应用程序向日志(文件)里面写数据,source组件就可以获取到日志(文件)中最新的内容 。