简介
Flume:Hadoop生态中的日志采集、聚合、传输工具。Flume可以收集各个系统的日志,并提供简单的处理,再写入各类数据接受方。一个Flume实例称为Flume agent,它可分为三个部分:
- Source(数据源):Avro/ Thrift/ Syslog/ Netcat/ HTTP / Spooling Directory/Syslog /Exec /JMS /自定义 /RPC
- Channel:Memory Channel/ File Channel。位于Source和Sink之间的缓冲区,保存通过Source传入到Flume Agent的数据,直到它被Sink移除;
- Sink(数据接收器,可自定义):HDFS/ HBase /RPC /Morphine Solr /ElasticSearch /Null Sink/ Rolling Flie Sink/ Logger /自定义
Flume的基本单元是Agent。一个Flume Agent可以连接一个或多个其他的Agent,也可以从一个或多个Agent接收数据。通过互相连接的多个Flume Agent,一个流作业被建立起来。
日志文件(log):系统或软件对于已完成的行为的记录。依赖日志,我们可以追溯故障、找出BUG、统计数据和分析用户行为。适当的日志可以提供帮助,日志太少和太多都会造成不良影响。而Flume是抽取日志、进行分析的重要工具,特别是几近实时的从前端服务器上将数据放到Hadoop中去。
用一个故事理解: 有一个池子,它一头进水,另一头出水,进水口可以配置各种管子,出水口也可以配置各种管子,可以有多个进水口、多个出水口。水术语称为Event,进水口术语称为Source、出水口术语成为Sink、池子术语成为Channel,Source+Channel+Sink,术语称为Agent。如果有需要,还可以把多个Agent连起来。
其实flume的用法很简单:书写一个配置文件,在配置文件当中描述Source/ Channel/ Sink的属性,然后运行一个agent实例,在运行agent实例的过程中会读取配置文件的内容,这样flume就会采集到数据。
Flume官方文档
Flume Wiki
https://www.cnblogs.com/franson-2016/p/8963834.html
https://blog.youkuaiyun.com/weixin_44090237/article/details/89371770
http://www.likuli.com/archives/757/
https://blog.51cto.com/wangyichao/2151587?source=dra
配置
基本命令
# 查看flume版本
flume-ng version
# 启动Flume agent;在Flume安装文件夹的根目录下运行
# agent_name,给定的agent名称;flume-conf.properties.template,配置文件
bin/flume-ng agent -n <agent_name> -c conf -f conf/flume-conf.properties.template
demo(source: netcat; channel: memory; sink: logger)
- example.conf的注释以#开头,但只能在每行单独写,不能写在配置代码的后方;
- source: netcat,表示监听某个TCP连接,获取该IP、端口的数据;
- sink: logger,表示以logger形式输出
# http://flume.apache.org/releases/content/1.9.0/FlumeUserGuide.html#a-simple-example
# Name the components on the agent
# 该配置文件名称为exanple.conf
# 该agent名称为a1,source名称为r1,sink名称为k1,channel名称为c1
a1.sources = r1
a1.sinks = k1
a1.channels = c1
# Describe/configure the source
# 指定source的类型、source的IP地址、source的监听端口
a1.sources.r1.type = netcat
a1.sources.r1.bind = localhost
a1.sources.r1.port = 44444
# Describe the sink
# 指定sink的类型
a1.sinks.k1.type = logger
# Use a channel which buffers eventsin memory
# 指定channel的类型,及channel存储数据的容量
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
# Bind the source and sink to the channel
# 连接r1与c1、连接k1与c1
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
# 启动flume-ng的命令
# --name:表示该agent的名称
# --conf:表示../flume-ng/conf的文件路径
# --conf-file:表示该agent对应的配置文件的文件路径
# -Dflume.root.logger=DEBUG:表示logger级别在DEBUG及以上即输出log
# console:表示在Linux会话的控制台输出log
flume-ng agent \
--name a1 \
--conf /opt/cloudera/parcels/CDH-5.15.0-1.cdh5.15.0.p0.21/etc/flume-ng/conf.empty \
--conf-file /opt/cloudera/parcels/CDH-5.15.0-1.cdh5.15.0.p0.21/etc/flume-ng/conf.empty/example.conf \
-Dflume.root.logger=DEBUG, console
# 开启另外一个Linux会话,并使用telnet建立TCP连接;然后随意输入信息,即可在flume-ng界面收到消息日志
telnet 192.168.103.131 44444
组件
Source
Channel
Sink
Tips:
- Flume和Kafka的异同
- 当数据会被多个消费者使用,则Kafka具有优越性;若日志只被Hadoop使用,则Flume更好;
- Flume内置了很多Source和Sink,若能满足需求,则无需开发任何代码;使用Kafka意味着你准备好了编写你自己的生产者和消费者代码;
- Flume和Kafka可以很好地结合起来使用;