目录
1. 什么是flume
Apache flume是一个分布式,高可靠性的海量日志采集,聚合和传输的系统,用于有效的的从许多不同的源收集,聚合和移动大量日志数据收集到集中式数据存储
Apache flume使用不仅限于日志数据聚合,由于数据源是可定制的,因此flume可用于大量事件数据,包括不限于网络流量数据,社交媒体中产生的数据,电子邮件以及任何可能得数据源
2. 日志收集
Flume最早是Cloudera提供的日志收集系统,是Apache下的一个孵化项目,Flume支持在日志系统中定制各类数据发送方,用于收集数据
3. flume 工作方式
Flume-og采用了多Master的方式。为了保证配置数据的一致性,Flume引入了ZooKeeper,用于保存配置数据,ZooKeeper本身可保证配置数据的一致性和高可用,另外,在配置数据发生变化时,ZooKeeper可以通知Flume Master节点。Flume Master间使用gossip协议同步数据。
Flume-ng最明显的改动就是取消了集中管理配置的 Master 和 Zookeeper,变为一个纯粹的传输工具。Flume-ng另一个主要的不同点是读入数据和写出数据由不同的工作线程处理(称为 Runner)。 在 Flume-og 中,读入线程同样做写出工作(除了故障重试)。如果写出慢的话(不是完全失败),它将阻塞 Flume 接收数据的能力。这种异步的设计使读入线程可以顺畅的工作而无需关注下游的任何问题
4. 优势
- Flume可以将应用产生的数据存储到任何集中存储器中,比如HDFS,HBase
-
当收集数据的速度超过将写入数据的时候,也就是当收集信息遇到峰值时,这时候收集的信息非常大,甚至超过了系统的写入数据能力,这时候,Flume会在数据生产者和数据收容器间做出调整,保证其能够在两者之间提供平稳的数据
-
提供上下文路由特征
-
Flume的管道是基于事务,保证了数据在传送和接收时的一致性.
-
Flume是可靠的,容错性高的,可升级的,易管理的,并且可定制的
5. flume 下载及安装
wget https://mirrors.tuna.tsinghua.edu.cn/apache/flume/1.9.0/apache-flume-1.9.0-bin.tar.gz
tar -zxvf apache-flume-1.9.0-bin.tar.gz
5. flume核心概念
5.1client
client生产数据,运行在一个独立的线程中
5.2 Agent
flume运行的核心是agent,flume以agent为最小的独立运行单位,一个agent就是一个jvm特是一个完整的收集工具,含有三个核心组件,分别是source,channel,sink
通过这些组件Event可以从一个地方流向另一个地方
5.3 flow
event从源点到达目的地的迁移的抽象
5.4 source
source是数据的收集端,负责将数据捕获后进行特殊化的格式化,将数据封装到事件(event)里,让后将事件推到channel中,flume提供了
很多内置的source,支持avro ,log4j,syslog和http post(body为json)可以让应用程序同已有的source直接打交道,如avroSource,syslog TcpSource,如果内置的Source
无法满足需要,flume还可以支持自定义的source
5.5 sink
从channel中读取并移除event,将event传递到flowPipeline中的下一个Agent(如果有的话,slink从Channel手机数据,运行在一个独立的线程中)sink从channel中取出事件,然后将数据发到别处,可以向文件系统,数据库,hadoop存数据,也可以是其他agent的source,在日志数据较少时可以将数据存储在文件系统中,并且设定一定的时间间隔保存数据
5.6 channel
中转event的一个临时存储,保存由source组件传递过来的event(channel连接的sources和sinks,这个有点像一个队列)channel是连接source和sink的组件,大家可以将他看作一个数据的缓冲区(数据队列)他可以将事件暂存到内存中也可以持久化到本地磁盘上,直到sink处理完该事件,memoryChannel和fileChannel是两个较为常见的Channel
5.7 event
一个数据单元,消息头(可选)和消息体组成,Events可以是日志记录,avro对象等
5.8 interceptor
当我们需要对数据进行过滤时,除了我们在source,Channel和sink进行代码修之外,flume为我们提供了拦截器,拦截器也是chain的形式,拦截器的位置在source和Channel之间,当我们为source指定拦截器后,我们在拦截器中会得到event,根据需求我们可以对event进行保留还是抛弃,抛弃的数据不会进入到Channel中
6. flume的demo示例
在bin目录下编写flume-nc-logger.conf
# example.conf: A single-node Flume configuration
# 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
使用下面命令启动
./flume-ng agent -n a1 -c ../conf -f ./flume-nc-logger.conf -Dflume.root.logger=INFO,console
使用telnet命令测试
telnet 127.0.0.1 44444