一、概述
1、what is Flume?
flume是由cloudera软件公司产出的可分布式日志收集系统,后与2009年被捐赠了apache软件基金会,为hadoop相关组件之一。尤其近几年随着flume的不断被完善以及升级版本的逐一推出,特别是flume-ng;同时flume内部的各种组件不断丰富,用户在开发的过程中使用的便利性得到很大的改善,现已成为apache top项目之一.
Apache Flume 是一个从可以收集例如日志,事件等数据资源,并将这些数量庞大的数据从各项数据资源中集中起来存储的工具/服务,或者数集中机制。flume具有高可用,分布式,配置工具,其设计的原理也是基于将数据流,如日志数据从各种网站服务器上汇集起来存储到HDFS,HBase等集中存储器中。
2、Flume特性
- Flume是一个分布式、可靠、和高可用的海量日志采集、聚合和传输的系统。
- Flume可以采集文件,socket数据包、文件、文件夹、kafka等各种形式源数据,又可以将采集到的数据(下沉sink)输出到HDFS、hbase、hive、kafka等众多外部存储系统中
- 一般的采集需求,通过对flume的简单配置即可实现
- Flume针对特殊场景也具备良好的自定义扩展能力,因此,flume可以适用于大部分的日常数据采集场景
3、Flume架构
数据流模型:
对于每一个Agent来说,它就是一共独立的守护进程(JVM),它从客户端接收数据。
- Flume分布式系统中最核心的角色是agent,flume采集系统就是由一个个agent所连接起来形成
每一个agent相当于一个数据(被封装成Event对象)传递员,内部有三个组件:
1. Source:采集组件,用于跟数据源对接,以获取数据 1. Channel:传输通道组件,用于从source将数据传递到sink 1. Sink:下沉组件,用于往下一级agent传递数据或者往最终存储系统传递数据
- Event定义
一行文本内容会被反序列化成一个event(序列化是将对象状态转换为可保持或传输的格式的过程,与序列化相对的是反序列化,这两个过程结合起来,可以轻松的存储和传输数据),event默认最大为2048字节(可修改),超过,则会切割,剩下的会被放到下一个event中,默认编码是UTF-8。
Flume采集结构图
- 简单结构
- 复杂结构
多个Agent采集
同一服务器-多路复用流
二、安装Flume
1、依赖
- Flume-1.8.0以上依赖Java-1.8 或更高版本
- 需要有足够的内存与磁盘空间
- 需要有对操作的目录有相应的权限
2、下载
这里下载的为最新稳定版:apache-flume-1.9.0-bin.tar.gz
然后通过工具上传到虚拟机上,并解压:
cd /opt/export/software/
[hadoop@hadoop01 software]$ ll
总用量 382952
-rw-rw-r-- 1 hadoop hadoop 67938106 3月 4 20:56 apache-flume-1.9.0-bin.tar.gz
# 解压
tar -zxvf apache-flume-1.9.0-bin.tar.gz -C /opt/export/servers/
cd ../servers
# 改名
mv apache-flume-1.9.0-bin flume-1.9.0
3、环境变量
sudo vim /etc/profile
export FLUME_HOME=/opt/export/servers/flume-1.9.0
export PATH=${PATH}:${FLUME_HOME}/bin
source /etc/profile
测试环境
flume-ng version
[hadoop@hadoop01 bin]$ flume-ng version
Error: Could not find or load main class org.apache.flume.tools.GetJavaProperty
Flume 1.9.0
Source code repository: https://git-wip-us.apache.org/repos/asf/flume.git
Revision: d4fcab4f501d41597bc616921329a4339f73585e
Compiled by fszabo on Mon Dec 17 20:45:25 CET 2018
From source with checksum 35db629a3bda49d23e9b3690c80737f9
# 发现有报错,
# 。或者是因为
# 这里暂时分析为是因为 安装了 hbase
发现有报错, 原因可能为:
jdk版本冲突安装了 hbase 导致的
解决方法一:
cd ${FLUME_HOME}/bin
vim flume-ng
# 开启行数
:set number
# 定位到110行
# 添加 到如下图110行位置
2>/dev/null | grep hbase
解决方法二:
cd ${HBASE_HOME}/conf
vim hbase-env.sh
# 1、将hbase的 hbase-env.sh 中 HBASE_CLASSPATH 配置注释掉
# Extra Java CLASSPATH elements. Optional.
#export HBASE_CLASSPATH=/opt/export/servers/hadoop-2.7.7/etc/hadoop
# 2、或者将 HBASE_CLASSPATH 改为 JAVA_CLASSPATH ,配置如下
# Extra Java CLASSPATH elements. Optional.
export JAVA_CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
都成功
[hadoop@hadoop01 bin]$ flume-ng version
Flume 1.9.0
Source code repository: https://git-wip-us.apache.org/repos/asf/flume.git
Revision: d4fcab4f501d41597bc616921329a4339f73585e
Compiled by fszabo on Mon Dec 17 20:45:25 CET 2018
From source with checksum 35db629a3bda49d23e9b3690c80737f9
4、配置
flume-env.sh
在conf目录下没有这个文件,需要将模板文件改为正式文件
cd ${FLUME_HOME}/conf cp flume-env.sh.template flume-env.sh
添加java环境
vim flume-env.sh export JAVA_HOME=/opt/export/servers/jdk1.8.0_321
log4j.properties
修改日志存放目录
vim log4j.properties flume.log.dir=/opt/export/data/flume/logs # 创建目录 mkdir -p /opt/export/data/flume/{logs,data}
三、简单使用
1、测试案例一
利用 netcat + telnet
监听端口,传输信息。
sudo yum install -y nc telnet
cd /opt/export/data/flume/data
vim nc-logger.conf
# Name the components on this agent
agent1.sources = nc-source
agent1.sinks = nc-sink
agent1.channels = nc-channel
# Describe/configure the source
agent1.sources.nc-source.type = netcat
agent1.sources.nc-source.bind = hadoop01
agent1.sources.nc-source.port = 44444
# Describe the sink
agent1.sinks.nc-sink.type = logger
# Use a channel which buffers events in memory
agent1.channels.nc-channel.type = memory
agent1.channels.nc-channel.capacity = 1000
agent1.channels.nc-channel.transactionCapacity = 100
# Bind the source and sink to the channel
agent1.sources.nc-source.channels = nc-channel
agent1.sinks.nc-sink.channel = nc-channel
# hadoop02
sudo yum install -y nc telnet
[hadoop@hadoop02 ~]$ telnet 192.168.121.134 44444
Trying 192.168.121.134...
Connected to 192.168.121.134.
Escape character is '^]'.
hello
ok
# hadoop01
[hadoop@hadoop01 data]$ flume-ng agent --conf conf/ --conf-file nc-logger.conf --name agent1 -Dflume.root.logger=INFO,console
.........
22/05/13 16:47:43 INFO instrumentation.MonitoredCounterGroup: Component type: CHANNEL, name: nc-channel started
22/05/13 16:47:43 INFO node.Application: Starting Sink nc-sink
22/05/13 16:47:43 INFO node.Application: Starting Source nc-source
22/05/13 16:47:43 INFO source.NetcatSource: Source starting
22/05/13 16:47:43 INFO source.NetcatSource: Created serverSocket:sun.nio.ch.ServerSocketChannelImpl[/192.168.121.134:44444]
22/05/13 16:47:54 INFO sink.LoggerSink: Event: { headers:{} body: 68 65 6C 6C 6F 0D hello. }