Flume:cloudera提供的高可用的、高可靠的、分布式的海量日志采集、聚合、和传输系统。
Flume 的设计目标:
- 可靠性:当节点出现故障时,日志能够被传送到其他节点而不会丢失。
flume提供了三种可靠性保障:
- end to end (仅一次)
- store on failoure (当数据接收方crash时,将数据写道本地,待恢复后继续发送)
- best effort (数据发送到接收方后,不会进行确认)
- 可扩展性 source channel sink每一层都可以水平扩展
- 可管理性 所有source、channel、sink由agent统一管理,使得系统便于维护。
Flume配置文件(Agent的配置)主要包括以下四个部分的配置:
- Agent连接source、sink、channel名称配置
- Agent Source 的相关配置
- Agent Sink 的相关配置
- Agent Channel 的相关配置
Flume 的架构图

- source:负责日志的流入,eg:从文件、网络、kafka等数据源流入数据。
数据的流入有两种方式:
- 轮询拉去
- 事件驱动
- channel:数据聚合/暂存,暂存到内存、本地文件、数据库、kafka等,日志数据不会在管道停留很长的时间,很快被sink消费掉
- sink:负责数据转移存储,从channel中拿到日志,直接存储到HDFS、Hbase、kafka、ElasticSearch等
source和sink是异步的。
flumeSource
Source支持Avro、Exec、Http、Spooling Director、Kafka、Syslog
- Exec Source 以运行linux命令的方式,持续的输出最新的数据
- Spool Source 支持见识一个目录或文件,解析其中新生成的事件,并将文件中的数据读取出来
拷贝到spool目录下的文件不可以再打开编辑,spool目录不可包含相应的子目录
Exec source和Spool Source的比较:
- Exec source可以实现对日志的实时收集,但是存在Flume不运行或指令出错时将无法手机到日志数据,无法保证日志数据的完整性。
- Spool Source 虽然无法实现实时的收集数据,但是可以以分钟的方式切割文件,趋近于实时。
- 如果应用无法以分钟分割日志文件,可以两种收集方式同时使用。
Flume 过滤器(拦截器):在App(应用程序日志)和source之间,对App日志进行拦截处理,官方已有的拦截器有:
- Timestamp Interceptor:在event的header中添加一个key作为timestamp,value为当前的事件戳。
- Host Interceprot:在event的header中添加一个的key为host,value为当前机器的hostname或IP
- Static Interceptor:在event的header中添加自动以的key和value
- Regex Filtering Interceptor:通过正则来清晰或包含匹配的events
- Regex Extrator Inteneptor:通过正则来在header中添加指定的key,value则为正则匹配的部分。
Flume Channel
缓存从Source 到Sink的中间数据,可用下列配置作为channel:
- 内存
- 文件
- JDBC
- kafka
Flume Channel选择器:数据通过不同的Channel路由到不同的Sink中
- Replication Channel Selectot:将source过来的events发往所有的Channel
- Multiplexing Channel Selectot:可以选择将数据发往哪些Channel
Flume Sink
负责从Channel中读取数据并发送给下一个Agent或最终目的地。
目的地:HDFS、Hbase、Avro、ElasticSearch、File、Logger
Flume 序列化器
- Body Text Serializer:忽略event header ,只将event value写到输出流。
- Avro Event Serializer:数据以Avro序列化,然后写到输出流。
安装Flume
从http://flume.apache.org/download.html下载相应的tar.gz文件,解压即可。
命令行运行flume
在安装目录下的conf文件夹下新建一个example.conf的文件。
配置以下内容。
# 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 = localhost
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
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
#Bind the source and sink to the channel
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
开启两个linux终端,在第一个终端中输入
devil@devilshome:~/soft/flume-1.6.0$ bin/flume-ng agent --conf conf --conf-file conf/example.conf --name a1 -Dflume.root.logger=INFO,console
在第二个终端中输入
devil@devilshome:~$ telnet localhost 44444
默认已经安装过telnet了,如果没有安装过,可以使用以下命令安装
devil@devilshome:~$ sudo yum install telnet
这样,在第二个终端命令行输入的信息,就可以实时显示在第一个终端界面了。
devil@devilshome:~$ telnet localhost 44444
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
hello world
OK
Connection closed by foreign host.
devil@devilshome:~$ telnet localhost 44444
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
hello
OK
2016-06-30 16:53:13,088 (SinkRunner-PollingRunner-DefaultSinkProcessor) [INFO - org.apache.flume.sink.LoggerSink.process(LoggerSink.java:94)] Event: { headers:{} body: 68 65 6C 6C 6F 0D hello. }
Flume是Cloudera提供的高可靠、高可用的日志采集系统,支持数据的可靠传输和可扩展性。其架构包括source、channel和sink,source从各种数据源收集日志,如文件、网络、Kafka;channel作为临时存储,保证数据在传输过程中的可靠性;sink负责将数据存储到目标位置,如HDFS、HBase等。Flume还支持多种拦截器进行日志过滤和处理,以及灵活的Channel选择器和Sink策略。安装Flume后,可以通过命令行配置和运行实例。
2126

被折叠的 条评论
为什么被折叠?



