官方文档:学习建议多多参考官方文档
http://flume.apache.org/FlumeUserGuide.html
处理流程:
source以event为单位从数据源接收信息,然后保存到一个或多个channel中
(可以经过一个或多个interceptor的预处理),sink从channel中拉取并处理
信息(保存,丢弃或传递到下一个agent),然后通知channel删除信息
为了在多个Agent或跃点source之间传输数据,前一个代理的sink和当前source需要是avro类型,接收器指向源的主机名(或IP地址)和端口。
日志收集中一个非常常见的场景是,大量日志生成客户机将数据发送到附加到存储子系统的几个使用者代理。例如,从数百台web服务器收集的日志被发送到12个写入HDFS集群的代理。
这可以在Flume中通过配置许多具有avro接收器的第一层代理来实现,所有这些代理都指向单个代理的avro源(同样,您可以在这种场景中使用thrift sources/sink /client)。第二层代理上的源将接收到的事件合并到单个通道中,接收通道由接收方使用到其最终目的地。
Flume支持将事件流多路复用到一个或多个目的地。这是通过定义一个流多路复用器来实现的,该复用器可以复制或选择性地将事件路由到一个或多个通道。
上面的示例显示了来自代理“foo”的源,它将流分散到三个不同的通道。这个散开的方式可以复制或多路复用。在复制流的情况下,每个事件被发送到所有三个通道。对于多路复用情况,当事件的属性与预先配置的值匹配时,将事件交付给可用通道的子集。例如,如果一个名为“txnType”的事件属性被设置为“customer”,那么它应该转到channel1和channel3,如果它是“vendor”,那么它应该转到channel2,否则就是channel3。这些都是可以配置的。
场景描述:收集服务器的用户访问日志,保存到Hadoop集群中,用于离线
的计算与分析
Flume方案:在服务器端配置flume agent,其中:
场景描述:收集服务器的系统日志,发送给实时计算引擎进行实时
处理
Flume方案:在服务器端配置flume agent,其中:
场景描述:收集服务器的系统日志,保存到搜索引擎中,用于线上日
志查询
Flume方案:在服务器端配置flume agent,其中:
中间层可以用sink group来进行多台部署
git.gupaoedu.com/big-data/gp-bd/issues/10
1、Flume(1.6.0)安装前置条件
2、安装jdk
下载
解压到~/app
将java配置系统环境变量中: ~/.bash_profile
export JAVA_HOME=/home/hadoop/app/jdk1.8.0_144
export PATH=$JAVA_HOME/bin:$PATH
source下让其配置生效
检测: java -version
3、安装Flume
下载
解压到~/app
将flume配置系统环境变量中: ~/.bash_profile
export FLUME_HOME=/home/hadoop/app/apache-flume-1.6.0-cdh5.7.0-bin
export PATH=$FLUME_HOME/bin:$PATH
source下让其配置生效
flume-env.sh的配置:export JAVA_HOME=/home/hadoop/app/jdk1.8.0_144
检测: flume-ng version
需求:从指定网络端口采集数据输出到控制台
example.conf: A single-node Flume configuration
example.conf: 单节点Flume配置文件
使用Flume的关键就是写配置文件
A) 配置Source
B) 配置Channel
C) 配置Sink
D) 把以上三个组件串起来
a1: agent名称
r1: source的名称
k1: sink的名称
c1: channel的名称
# Name the components on this agent
a1.sources = r1
a1.sinks = k1
a1.channels = c1
# Describe/configure the source
a1.sources.r1.type = netcat
a1.sources.r1.bind = hadoop000
a1.sources.r1.port = 44444
# Describe the sink
a1.sinks.k1.type = logger
# Use a channel which buffers events in memory
a1.channels.c1.type = memory
# Bind the source and sink to the channel
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
注意:
一个source可以输出多个channel
一个sink只能从一个channel拿去数据
启动agent
flume-ng agent \
--name a1 \
--conf $FLUME_HOME/conf \
--conf-file $FLUME_HOME/conf/example.conf \
-Dflume.root.logger=INFO,console
使用telnet进行测试: telnet hadoop000 44444
转到启动flume的页面看到:
Event: { headers:{} body: 68 65 6C 6C 6F 0D hello. }
Event是FLume数据传输的基本单元
Event = 可选的header + byte array
需求:监控一个文件实时采集新增的数据输出到控制台
Agent选型:exec source + memory channel + logger sink
# Name the components on this agent
a1.sources = r1
a1.sinks = k1
a1.channels = c1
# Describe/configure the source
a1.sources.r1.type = exec
a1.sources.r1.command = tail -F /home/hadoop/data/data.log
a1.sources.r1.shell = /bin/sh -c
#用于运行该命令的shell调用。例如/bin/sh -c;仅对依赖于shell特性(如通配符、反勾号、管道等)的命令需要。
# Describe the sink
a1.sinks.k1.type = logger
# Use a channel which buffers events in memory
a1.channels.c1.type = memory
# Bind the source and sink to the channel
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
启动agent
flume-ng agent \
--name a1 \
--conf $FLUME_HOME/conf \
--conf-file $FLUME_HOME/conf/exec-memory-logger.conf \
-Dflume.root.logger=INFO,console
需求:将A服务器上的日志实时采集到B服务器
技术选型:
exec source + memory channel + avro sink
avro source + memory channel + logger sink
exec-memory-avro.conf
exec-memory-avro.sources = exec-source
exec-memory-avro.sinks = avro-sink
exec-memory-avro.channels = memory-channel
exec-memory-avro.sources.exec-source.type = exec
exec-memory-avro.sources.exec-source.command = tail -F /home/hadoop/data/data.log
exec-memory-avro.sources.exec-source.shell = /bin/sh -c
exec-memory-avro.sinks.avro-sink.type = avro
exec-memory-avro.sinks.avro-sink.hostname = hadoop000
exec-memory-avro.sinks.avro-sink.port = 44444
exec-memory-avro.channels.memory-channel.type = memory
exec-memory-avro.sources.exec-source.channels = memory-channel
exec-memory-avro.sinks.avro-sink.channel = memory-channel
avro-memory-logger.conf
avro-memory-logger.sources = avro-source
avro-memory-logger.sinks = logger-sink
avro-memory-logger.channels = memory-channel
avro-memory-logger.sources.avro-source.type = avro
avro-memory-logger.sources.avro-source.bind = hadoop000
avro-memory-logger.sources.avro-source.port = 44444
avro-memory-logger.sinks.logger-sink.type = logger
avro-memory-logger.channels.memory-channel.type = memory
avro-memory-logger.sources.avro-source.channels = memory-channel
avro-memory-logger.sinks.logger-sink.channel = memory-channel
先启动avro-memory-logger
flume-ng agent \
--name avro-memory-logger \
--conf $FLUME_HOME/conf \
--conf-file $FLUME_HOME/conf/avro-memory-logger.conf \
-Dflume.root.logger=INFO,console
再启动exec-memory-avro
flume-ng agent \
--name exec-memory-avro \
--conf $FLUME_HOME/conf \
--conf-file $FLUME_HOME/conf/exec-memory-avro.conf \
-Dflume.root.logger=INFO,conso
测试和Flume实战案例二一样